diff --git a/src/Mod/Mesh/App/Core/Approximation.cpp b/src/Mod/Mesh/App/Core/Approximation.cpp index 2004e96389..4938448bee 100644 --- a/src/Mod/Mesh/App/Core/Approximation.cpp +++ b/src/Mod/Mesh/App/Core/Approximation.cpp @@ -39,6 +39,9 @@ #include #include #include +#include +#include +#include //#define FC_USE_EIGEN #include @@ -801,9 +804,20 @@ float CylinderFit::Fit() return FLOAT_MAX; _bIsFitted = true; + std::vector input; + std::transform(_vPoints.begin(), _vPoints.end(), std::back_inserter(input), + [](const Base::Vector3f& v) { return Wm4::Vector3d(v.x, v.y, v.z); }); + + Wm4::Vector3d cnt, axis; + double radius, height; + Wm4::CylinderFit3 fit(input.size(), input.data(), cnt, axis, radius, height, false); + _vBase = Base::convertTo(cnt); + _vAxis = Base::convertTo(axis); + _fRadius = float(radius); + // TODO - _fLastResult = 0; + _fLastResult = double(fit); return _fLastResult; } @@ -927,7 +941,23 @@ Base::Vector3f SphereFit::GetCenter() const float SphereFit::Fit() { - return FLOAT_MAX; + _bIsFitted = true; + if (CountPoints() < 4) + return FLOAT_MAX; + + std::vector input; + std::transform(_vPoints.begin(), _vPoints.end(), std::back_inserter(input), + [](const Base::Vector3f& v) { return Wm4::Vector3d(v.x, v.y, v.z); }); + + Wm4::Sphere3d sphere; + Wm4::SphereFit3(input.size(), input.data(), 10, sphere, false); + _vCenter = Base::convertTo(sphere.Center); + _fRadius = float(sphere.Radius); + + // TODO + + _fLastResult = 0; + return _fLastResult; } float SphereFit::GetDistanceToSphere(const Base::Vector3f &) const