void PlaneFit::Dimension(float& length, float& width) const { const Base::Vector3f& bs = _vBase; const Base::Vector3f& ex = _vDirU; const Base::Vector3f& ey = _vDirV; Base::BoundBox3f bbox; std::list<Base::Vector3f>::const_iterator cIt; for (cIt = _vPoints.begin(); cIt != _vPoints.end(); ++cIt) { Base::Vector3f pnt = *cIt; pnt.TransformToCoordinateSystem(bs, ex, ey); bbox.Add(pnt); } length = bbox.MaxX - bbox.MinX; width = bbox.MaxY - bbox.MinY; }
void AbstractPolygonTriangulator::PostProcessing(const std::vector<Base::Vector3f>& points) { // For a good approximation we should have enough points, i.e. for 9 parameters // for the fit function we should have at least 50 points. unsigned int uMinPts = 50; PolynomialFit polyFit; Base::Vector3f bs((float)_inverse[0][3], (float)_inverse[1][3], (float)_inverse[2][3]); Base::Vector3f ex((float)_inverse[0][0], (float)_inverse[1][0], (float)_inverse[2][0]); Base::Vector3f ey((float)_inverse[0][1], (float)_inverse[1][1], (float)_inverse[2][1]); for (std::vector<Base::Vector3f>::const_iterator it = points.begin(); it != points.end(); ++it) { Base::Vector3f pt = *it; pt.TransformToCoordinateSystem(bs, ex, ey); polyFit.AddPoint(pt); } if (polyFit.CountPoints() >= uMinPts && polyFit.Fit() < FLOAT_MAX) { for (std::vector<Base::Vector3f>::iterator pt = _newpoints.begin(); pt != _newpoints.end(); ++pt) pt->z = (float)polyFit.Value(pt->x, pt->y); } }