/** * \return List of bezier spline segments which together represent this curve. */ QList<RSpline> RSpline::getBezierSegments() const { // spline is a single bezier segment: if (countControlPoints()==getDegree()+1) { return QList<RSpline>() << *this; } updateInternal(); QList<RSpline> ret; #ifndef R_NO_OPENNURBS ON_NurbsCurve* dup = dynamic_cast<ON_NurbsCurve*>(curve.DuplicateCurve()); if (dup==NULL) { return ret; } dup->MakePiecewiseBezier(); for (int i=0; i<=dup->CVCount() - dup->Order(); ++i) { ON_BezierCurve bc; if (!dup->ConvertSpanToBezier(i, bc)) { continue; } QList<RVector> ctrlPts; for (int cpi=0; cpi<bc.CVCount(); cpi++) { ON_3dPoint onp; bc.GetCV(cpi, onp); ctrlPts.append(RVector(onp.x, onp.y, onp.z)); } ret.append(RSpline(ctrlPts, degree)); } delete dup; #endif return ret; }
/* * Need to be updated to return bezier objects instead of returning coordinate vectors. * No external need to cast to bezier and then find intersections. */ void Spline::generateBeziers() { std::vector<std::vector<lc::geo::Coordinate>> bezlist; auto curve = _splineCurve.Duplicate(); curve->MakePiecewiseBezier(); ON_3dPoint p; int deg = curve->Degree(); int cpcount = curve->CVCount(); for (int i=0; i<deg+cpcount+2; ++i) { ON_BezierCurve bc; if (curve->ConvertSpanToBezier(i, bc)) { std::vector<geo::Coordinate> bez; for (int j=0; j<bc.CVCount(); j++) { bc.GetCV(j, p); bez.push_back(geo::Coordinate(p.x, p.y, p.z)); } _beziers.push_back(bez); } } }