ReverseEngineering: improve mesh segmentation

This commit is contained in:
wmayer
2020-03-04 23:04:06 +01:00
parent 2cda87f23a
commit cda6628f14
7 changed files with 252 additions and 72 deletions

View File

@@ -906,7 +906,7 @@ float CylinderFit::Fit()
return FLOAT_MAX;
_bIsFitted = true;
#if 0
#if 1
std::vector<Wm4::Vector3d> input;
std::transform(_vPoints.begin(), _vPoints.end(), std::back_inserter(input),
[](const Base::Vector3f& v) { return Wm4::Vector3d(v.x, v.y, v.z); });

View File

@@ -171,19 +171,23 @@ float PlaneSurfaceFit::GetDistanceToSurface(const Base::Vector3f& pnt) const
return fitter->GetDistanceToPlane(pnt);
}
Base::Vector3f PlaneSurfaceFit::Project(const Base::Vector3f& pt) const
std::vector<float> PlaneSurfaceFit::Parameters() const
{
Base::Vector3f prj(pt);
if (!fitter) {
prj.ProjectToPlane(basepoint, normal);
}
else {
Base::Vector3f base = fitter->GetBase();
Base::Vector3f norm = fitter->GetNormal();
prj.ProjectToPlane(base, norm);
Base::Vector3f base = basepoint;
Base::Vector3f norm = normal;
if (fitter) {
base = fitter->GetBase();
norm = fitter->GetNormal();
}
return prj;
std::vector<float> c;
c.push_back(base.x);
c.push_back(base.y);
c.push_back(base.z);
c.push_back(norm.x);
c.push_back(norm.y);
c.push_back(norm.z);
return c;
}
// --------------------------------------------------------
@@ -272,10 +276,26 @@ float CylinderSurfaceFit::GetDistanceToSurface(const Base::Vector3f& pnt) const
return (dist - radius);
}
Base::Vector3f CylinderSurfaceFit::Project(const Base::Vector3f& pt) const
std::vector<float> CylinderSurfaceFit::Parameters() const
{
//TODO
return pt;
Base::Vector3f base = basepoint;
Base::Vector3f norm = axis;
float radval = radius;
if (fitter) {
base = fitter->GetBase();
norm = fitter->GetAxis();
radval = fitter->GetRadius();
}
std::vector<float> c;
c.push_back(base.x);
c.push_back(base.y);
c.push_back(base.z);
c.push_back(norm.x);
c.push_back(norm.y);
c.push_back(norm.z);
c.push_back(radval);
return c;
}
// --------------------------------------------------------
@@ -353,10 +373,21 @@ float SphereSurfaceFit::GetDistanceToSurface(const Base::Vector3f& pnt) const
return (dist - radius);
}
Base::Vector3f SphereSurfaceFit::Project(const Base::Vector3f& pt) const
std::vector<float> SphereSurfaceFit::Parameters() const
{
//TODO
return pt;
Base::Vector3f base = center;
float radval = radius;
if (fitter) {
base = fitter->GetCenter();
radval = fitter->GetRadius();
}
std::vector<float> c;
c.push_back(base.x);
c.push_back(base.y);
c.push_back(base.z);
c.push_back(radval);
return c;
}
// --------------------------------------------------------
@@ -410,15 +441,9 @@ void MeshDistanceGenericSurfaceFitSegment::AddFacet(const MeshFacet& face)
fitter->AddTriangle(triangle);
}
std::vector<Base::Vector3f> MeshDistanceGenericSurfaceFitSegment::Project(const std::vector<Base::Vector3f>& pts) const
std::vector<float> MeshDistanceGenericSurfaceFitSegment::Parameters() const
{
std::vector<Base::Vector3f> prj;
prj.reserve(pts.size());
for (const auto it : pts) {
prj.push_back(fitter->Project(it));
}
return prj;
return fitter->Parameters();
}
// --------------------------------------------------------

View File

@@ -99,7 +99,7 @@ public:
virtual bool Done() const = 0;
virtual float Fit() = 0;
virtual float GetDistanceToSurface(const Base::Vector3f&) const = 0;
virtual Base::Vector3f Project(const Base::Vector3f&) const = 0;
virtual std::vector<float> Parameters() const = 0;
};
class MeshExport PlaneSurfaceFit : public AbstractSurfaceFit
@@ -115,7 +115,7 @@ public:
bool Done() const;
float Fit();
float GetDistanceToSurface(const Base::Vector3f&) const;
Base::Vector3f Project(const Base::Vector3f&) const;
std::vector<float> Parameters() const;
private:
Base::Vector3f basepoint;
@@ -136,7 +136,7 @@ public:
bool Done() const;
float Fit();
float GetDistanceToSurface(const Base::Vector3f&) const;
Base::Vector3f Project(const Base::Vector3f&) const;
std::vector<float> Parameters() const;
private:
Base::Vector3f basepoint;
@@ -158,7 +158,7 @@ public:
bool Done() const;
float Fit();
float GetDistanceToSurface(const Base::Vector3f&) const;
Base::Vector3f Project(const Base::Vector3f&) const;
std::vector<float> Parameters() const;
private:
Base::Vector3f center;
@@ -177,7 +177,7 @@ public:
void Initialize(unsigned long);
bool TestInitialFacet(unsigned long) const;
void AddFacet(const MeshFacet& rclFacet);
std::vector<Base::Vector3f> Project(const std::vector<Base::Vector3f>&) const;
std::vector<float> Parameters() const;
protected:
AbstractSurfaceFit* fitter;