Beispiel #1
0
/**
 * \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;
}
Beispiel #2
0
/*
 * 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);
        }
    }
}