1 #ifndef SimTK_SIMMATH_GEO_CUBIC_BEZIER_CURVE_H_
2 #define SimTK_SIMMATH_GEO_CUBIC_BEZIER_CURVE_H_
152 : B(controlPoints) {}
158 : B(controlPoints.positionalTranspose()) {}
261 const RealP tol = getDefaultTol<RealP>();
262 SimTK_ERRCHK1(tol <= u && u <= 1-tol,
"Geo::CubicBezierCurve::split()",
263 "Can't split curve at parameter %g; it is either out of range or"
264 " too close to an end point.", (
double)u);
266 const RealP u1 = 1-u;
267 const Vec3P p01 = u1*B[0] + u*B[1];
268 const Vec3P p12 = u1*B[1] + u*B[2];
269 const Vec3P p23 = u1*B[2] + u*B[3];
272 left.B[2] = u1*p01 + u*p12;
276 right.B[1] = u1*p12 + u*p23;
277 left.B[3] = right.B[0] = u1*left.B[2] + u*right.B[1];
285 const Vec3P p01 = (B[0] + B[1])/2;
286 const Vec3P p12 = (B[1] + B[2])/2;
287 const Vec3P p23 = (B[2] + B[3])/2;
290 left.B[2] = (p01 + p12)/2;
294 right.B[1] = (p12 + p23)/2;
295 left.B[3] = right.B[0] = (left.B[2] + right.B[1])/2;
329 const RealP u2 = u*u, u3 = u*u2;
330 const RealP u1 = 1-u, u12=u1*u1, u13=u1*u12;
331 return Row<4,P>(u13, 3*u*u12, 3*u2*u1, u3);
337 const RealP u6=6*u, u2 = u*u, u23 = 3*u2, u29 = 9*u2;
338 return Row<4,P>(u6-u23-3, u29-12*u+3, u6-u29, u23);
344 const RealP u6 = 6*u, u18 = 18*u;
345 return Row<4,P>(6-u6, u18-12, 6-u18, u6);
362 return Vec<4,Vec3P>(b3-b0+3*(b1-b2), 3*(b0+b2)-6*b1, 3*(b1-b0), b0);
372 return Vec<4,Vec3P>(a0, a1/3 + a0, (a2+2*a1)/3 + a0, a3+a2+a1+a0);
448 const RealP b0=b[0], b1=b[1], b2=b[2], b3=b[3];
449 return Vec<4,P>(3*(b1-b2)+b3-b0, 3*(b0+b2)-6*b1, 3*(b1-b0), b0);
460 0, P(1)/3, P(2)/3, 1,
470 const RealP b0=b[0], b1=b[1], b2=b[2], b3=b[3];
471 return Vec<4,P>(b3, b2/3+b3, (b1+2*b2)/3+b3, b0+b1+b2+b3);
491 const RealP v0=v[0], v1=v[1], v2=v[2], v3=v[3];
492 return Vec<4,P>(v0, v3, 3*(v1-v0), 3*(v3-v2));
513 const RealP v0=v[0], v1=v[1], v2=v[2], v3=v[3];
514 return Vec<4,P>(v0, v0+v2/3, v1-v3/3, v1);
526 #endif // SimTK_SIMMATH_GEO_CUBIC_BEZIER_CURVE_H_