ts::DeBoorNet ts::BSpline::evaluate(const ts::rational u) const { DeBoorNet deBoorNet; const tsError err = ts_bspline_evaluate(&bspline, u, deBoorNet.data()); if (err < 0) throw std::runtime_error(ts_enum_str(err)); return deBoorNet; }
void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // draw spline glColor3f(1.0, 1.0, 1.0); glLineWidth(3); gluBeginCurve(theNurb); gluNurbsCurve( theNurb, spline.n_knots, spline.knots, spline.dim, spline.ctrlp, spline.order, GL_MAP1_VERTEX_3 ); gluEndCurve(theNurb); // draw control points glColor3f(1.0, 0.0, 0.0); glPointSize(5.0); float j=0; size_t i; glBegin(GL_POINTS); for (i = 0; i < spline.n_ctrlp; i++) { j+=1.0/n_ctrlp; glColor3f(0.0, j, 0.0); glVertex3fv(&spline.ctrlp[i * spline.dim]); } glEnd(); // draw evaluation glColor3f(0.0, 0.0, 1.0); glPointSize(5.0); tsDeBoorNet net; ts_bspline_evaluate(&spline, u, &net); glBegin(GL_POINTS); glVertex3fv(net.result); glEnd(); ts_deboornet_free(&net); u += 0.001; if (u > 4.f) { u = 0.f; } glutSwapBuffers(); glutPostRedisplay(); }