/** * Updates the internal polygon of this spline. Called when the * spline or it's data, position, .. changes. */ void RS_Spline::update() { RS_DEBUG->print("RS_Spline::update"); clear(); if (isUndone()) { return; } if (data.degree<1 || data.degree>3) { RS_DEBUG->print("RS_Spline::update: invalid degree: %d", data.degree); return; } if (data.controlPoints.size() < data.degree+1) { RS_DEBUG->print("RS_Spline::update: not enough control points"); return; } resetBorders(); std::vector<RS_Vector> tControlPoints = data.controlPoints; if (data.closed) { for (size_t i=0; i<data.degree; ++i) { tControlPoints.push_back(data.controlPoints.at(i)); } } const size_t npts = tControlPoints.size(); // order: const size_t k = data.degree+1; // resolution: const size_t p1 = getGraphicVariableInt("$SPLINESEGS", 8) * npts; std::vector<double> h(npts+1, 1.); std::vector<RS_Vector> p(p1, {0., 0.}); if (data.closed) { rbsplinu(npts,k,p1,tControlPoints,h,p); } else { rbspline(npts,k,p1,tControlPoints,h,p); } RS_Vector prev{}; for (auto const& vp: p) { if (prev.valid) { RS_Line* line = new RS_Line{this, prev, vp}; line->setLayer(nullptr); line->setPen(RS2::FlagInvalid); addEntity(line); } prev = vp; minV = RS_Vector::minimum(prev, minV); maxV = RS_Vector::maximum(prev, maxV); } }
/** * Updates the internal polygon of this spline. Called when the * spline or it's data, position, .. changes. */ void RS_Spline::update() { RS_DEBUG->print("RS_Spline::update"); clear(); if (isUndone()) { return; } if (data.degree<1 || data.degree>3) { RS_DEBUG->print("RS_Spline::update: invalid degree: %d", data.degree); return; } if (data.controlPoints.size() < data.degree+1) { RS_DEBUG->print("RS_Spline::update: not enough control points"); return; } resetBorders(); std::vector<RS_Vector> tControlPoints = data.controlPoints; if (data.closed) { for (size_t i=0; i<data.degree; ++i) { tControlPoints.push_back(data.controlPoints.at(i)); } } size_t i; const size_t npts = tControlPoints.size(); // order: const size_t k = data.degree+1; // resolution: const size_t p1 = getGraphicVariableInt("$SPLINESEGS", 8) * npts; std::vector<double> b(npts*3+1, 0.); std::vector<double> h(npts+1, 1.); std::vector<double> p(3*p1, 0.); i = 1; for (size_t it = 0; it < tControlPoints.size(); ++it) { b[i] = tControlPoints.at(it).x; b[i+1] = tControlPoints.at(it).y; RS_DEBUG->print("RS_Spline::update: b[%d]: %f/%f", i, b[i], b[i+1]); i+=3; } if (data.closed) { rbsplinu(npts,k,p1,b,h,p); } else { rbspline(npts,k,p1,b,h,p); } RS_Vector prev(false); for (i = 1; i <= 3*p1; i += 3) { if (prev.valid) { RS_Line* line = new RS_Line(this, RS_LineData(prev, RS_Vector(p[i], p[i+1]))); line->setLayer(nullptr); line->setPen(RS_Pen(RS2::FlagInvalid)); addEntity(line); } prev = RS_Vector(p[i], p[i+1]); minV = RS_Vector::minimum(prev, minV); maxV = RS_Vector::maximum(prev, maxV); } }
/** * Updates the internal polygon of this spline. Called when the * spline or it's data, position, .. changes. */ void RS_Spline::update() { RS_DEBUG->print("RS_Spline::update"); clear(); if (isUndone()) { return; } if (data.degree<1 || data.degree>3) { RS_DEBUG->print("RS_Spline::update: invalid degree: %d", data.degree); return; } if (data.controlPoints.size() < data.degree+1) { RS_DEBUG->print("RS_Spline::update: not enough control points"); return; } resetBorders(); QList<RS_Vector> tControlPoints = data.controlPoints; if (data.closed) { for (int i=0; i<data.degree; ++i) { tControlPoints.append(data.controlPoints.at(i)); } } int i; int npts = tControlPoints.count(); // order: int k = data.degree+1; // resolution: int p1 = getGraphicVariableInt("$SPLINESEGS", 8) * npts; double* b = new double[npts*3+1]; double* h = new double[npts+1]; double* p = new double[p1*3+1]; i = 1; for (int it = 0; it < tControlPoints.size(); ++it) { b[i] = tControlPoints.at(it).x; b[i+1] = tControlPoints.at(it).y; b[i+2] = 0.0; RS_DEBUG->print("RS_Spline::update: b[%d]: %f/%f", i, b[i], b[i+1]); i+=3; } // set all homogeneous weighting factors to 1.0 for (i=1; i <= npts; i++) { h[i] = 1.0; } for (i = 1; i <= 3*p1; i++) { p[i] = 0.0; } if (data.closed) { rbsplinu(npts,k,p1,b,h,p); } else { rbspline(npts,k,p1,b,h,p); } RS_Vector prev(false); for (i = 1; i <= 3*p1; i=i+3) { if (prev.valid) { RS_Line* line = new RS_Line(this, RS_LineData(prev, RS_Vector(p[i], p[i+1]))); line->setLayer(NULL); line->setPen(RS_Pen(RS2::FlagInvalid)); addEntity(line); } prev = RS_Vector(p[i], p[i+1]); minV = RS_Vector::minimum(prev, minV); maxV = RS_Vector::maximum(prev, maxV); } delete[] b; delete[] h; delete[] p; }
void tDxfSpline::updateXX() { //RS_DEBUG->print("RS_Spline::update"); //clear(); //if (isUndone()) { // return; //} //resetBorders(); //QList<RS_Vector> tControlPoints = data.controlPoints; /*??? if (isClosed) { for (int i=0; i<data.degree; ++i) { controlPoints.append(data.controlPoints.at(i)); } } */ int i; int npts = controlPoints.count(); // order: int k = degree+1; // resolution: int p1 = 8 * npts; // ??? double* b = new double[npts*3+1]; double* h = new double[npts+1]; double* p = new double[p1*3+1]; i = 1; for (int it = 0; it < controlPoints.count(); ++it) { b[i] = controlPoints.at(it).x; b[i+1] = controlPoints.at(it).y; b[i+2] = 0.0; //RS_DEBUG->print("RS_Spline::update: b[%d]: %f/%f", i, b[i], b[i+1]); i+=3; } // set all homogeneous weighting factors to 1.0 for (i=1; i <= npts; i++) { h[i] = 1.0; } for (i = 1; i <= 3*p1; i++) { p[i] = 0.0; } if (isClosed) { rbsplinu(npts,k,p1,b,h,p); } else { rbspline(npts,k,p1,b,h,p); } //RS_Vector prev(false); //tVector prev(0,0,0); //bool hasPrev = false; for (i = 1; i <= 3*p1; i=i+3) { /*if (hasPrev) { RS_Line* line = new RS_Line(this, RS_LineData(prev, RS_Vector(p[i], p[i+1]))); line->setLayer(NULL); line->setPen(RS_Pen(RS2::FlagInvalid)); addEntity(line); }*/ //prev = RS_Vector(p[i], p[i+1]); //hasPrev = true; hs->addVertex(new tPoint(NULL, p[i],p[i+1], 0)); //minV = RS_Vector::minimum(prev, minV); //maxV = RS_Vector::maximum(prev, maxV); } delete[] b; delete[] h; delete[] p; }