1 #ifndef SimTK_SIMMATH_GEO_BICUBIC_BEZIER_PATCH_H_
2 #define SimTK_SIMMATH_GEO_BICUBIC_BEZIER_PATCH_H_
101 class Geo::BicubicBezierPatch_ {
103 typedef Vec<3,RealP> Vec3P;
114 : B(controlPoints) {}
208 const RealP tol = getDefaultTol<RealP>();
209 SimTK_ERRCHK1(tol <= u && u <= 1-tol,
"Geo::BicubicBezierPatch::splitU()",
210 "Can't split patch at parameter u=%g; it is either out of range or"
211 " too close to an edge.", (
double)u);
214 for (
int i=0; i<4; ++i) {
220 for (
int i=0; i<4; ++i) {
243 const RealP tol = getDefaultTol<RealP>();
244 SimTK_ERRCHK1(tol <= w && w <= 1-tol,
"Geo::BicubicBezierPatch::splitW()",
245 "Can't split patch at parameter w=%g; it is either out of range or"
246 " too close to an edge.", (
double)w);
249 for (
int i=0; i<4; ++i) {
255 for (
int i=0; i<4; ++i) {
282 const RealP tol = getDefaultTol<RealP>();
283 SimTK_ERRCHK2((tol <= u && u <= 1-tol) && (tol <= w && w <= 1-tol),
284 "Geo::BicubicBezierPatch::split()",
285 "Can't split patch at parametric point u,w=%g,%g; it is either out of"
286 " range or too close to an edge.", (
double)u, (
double)w);
292 if (u == Real(0.5)) {
294 patch0.
splitU(u, patch00, patch10);
295 patch1.
splitU(u, patch01, patch11);
298 patch0.
splitW(w, patch00, patch01);
299 patch1.
splitW(w, patch10, patch11);
347 return Fbu * B * ~Fbw;
360 Pu = dFbu * B * ~Fbw;
361 Pw = Fbu * B * ~dFbw;
376 Puu = d2Fbu * B * ~Fbw;
377 Puw = dFbu * B * ~dFbw;
378 Pww = Fbu * B * ~d2Fbw;
395 Puuu = d3Fbu * B * ~Fbw;
396 Puuw = d2Fbu * B * ~dFbw;
397 Puww = dFbu * B * ~d2Fbw;
398 Pwww = Fbu * B * ~d3Fbw;
420 typedef const Vec3P& Coef;
421 Coef b11=B(0,0), b12=B(0,1), b13=B(0,2), b14=B(0,3),
422 b21=B(1,0), b22=B(1,1), b23=B(1,2), b24=B(1,3),
423 b31=B(2,0), b32=B(2,1), b33=B(2,2), b34=B(2,3),
424 b41=B(3,0), b42=B(3,1), b43=B(3,2), b44=B(3,3);
430 Vec3P a= b41-b11+3*(b21-b31), b= b42-b12+3*(b22-b32),
431 c= b43-b13+3*(b23-b33), d= b44-b14+3*(b24-b34);
432 Vec3P e= 3*(b11+b31)-6*b21, f= 3*(b12+b32)-6*b22,
433 g= 3*(b13+b33)-6*b23, h= 3*(b14+b34)-6*b24;
434 Vec3P p= 3*(b21-b11), q= 3*(b22-b12),
435 r= 3*(b23-b13), s= 3*(b24-b14);
439 ( d-a+3*(b-c), 3*(a+c)-6*b, 3*(b-a), a,
440 h-e+3*(f-g), 3*(e+g)-6*f, 3*(f-e), e,
441 s-p+3*(q-r), 3*(p+r)-6*q, 3*(q-p), p,
442 b14-b11+3*(b12-b13), 3*(b11+b13)-6*b12, 3*(b12-b11), b11 );
448 typedef const Vec3P& Coef;
449 Coef a33=A(0,0), a32=A(0,1), a31=A(0,2), a30=A(0,3),
450 a23=A(1,0), a22=A(1,1), a21=A(1,2), a20=A(1,3),
451 a13=A(2,0), a12=A(2,1), a11=A(2,2), a10=A(2,3),
452 a03=A(3,0), a02=A(3,1), a01=A(3,2), a00=A(3,3);
458 Vec3P a=a13/3+a03, b=a12/3+a02, c=a11/3+a01, d=a10/3+a00;
459 Vec3P e=(a23+2*a13)/3+a03, f=(a22+2*a12)/3+a02,
460 g=(a21+2*a11)/3+a01, h=(a20+2*a10)/3+a00;
461 Vec3P p=a33+a23+a13+a03, q=a32+a22+a12+a02,
462 r=a31+a21+a11+a01, s=a30+a20+a10+a00;
467 ( a00, a01/3+a00, (a02+2*a01)/3+a00, a03+a02+a01+a00,
468 d, c/3+d, (b+2*c)/3+d, a+b+c+d,
469 h, g/3+h, (f+2*g)/3+h, e+f+g+h,
470 s, r/3+s, (q+2*r) /3+s, p+q+r+s );
476 typedef const Vec3P& Coef;
477 Coef b11=B(0,0), b12=B(0,1), b13=B(0,2), b14=B(0,3),
478 b21=B(1,0), b22=B(1,1), b23=B(1,2), b24=B(1,3),
479 b31=B(2,0), b32=B(2,1), b33=B(2,2), b34=B(2,3),
480 b41=B(3,0), b42=B(3,1), b43=B(3,2), b44=B(3,3);
483 Vec3P b12mb11=b12-b11, b24mb14=b24-b14, b42mb41=b42-b41, b44mb34=b44-b34;
487 ( b11, b14, 3*b12mb11, 3*(b14-b13),
488 b41, b44, 3*b42mb41, 3*(b44-b43),
489 3*(b21-b11), 3*b24mb14, 9*(b22-b21-b12mb11), 9*(b24mb14+b13-b23),
490 3*(b41-b31), 3*b44mb34, 9*(b42mb41+b31-b32), 9*(b44mb34+b33-b43) );
496 typedef const Vec3P& Coef;
497 Coef h00=H(0,0), h01=H(0,1), w00=H(0,2), w01=H(0,3),
498 h10=H(1,0), h11=H(1,1), w10=H(1,2), w11=H(1,3),
499 u00=H(2,0), u01=H(2,1), t00=H(2,2), t01=H(2,3),
500 u10=H(3,0), u11=H(3,1), t10=H(3,2), t11=H(3,3);
503 Vec3P tmp00=h00+u00/3, tmp01=h01+u01/3,
504 tmp10=h10-u10/3, tmp11=h11-u11/3;
508 ( h00, h00+w00/3, h01-w01/3, h01,
509 tmp00, tmp00+w00/3+t00/9, tmp01-w01/3-t01/9, tmp01,
510 tmp10, tmp10+w10/3-t10/9, tmp11-w11/3+t11/9, tmp11,
511 h10, h10+w10/3, h11-w11/3, h11 );
523 #endif // SimTK_SIMMATH_GEO_BICUBIC_BEZIER_PATCH_H_
static CubicBezierCurve_< P > calcIsoCurveU(const Mat< 4, 4, Vec3P > &B, RealP u0)
Given a particular value u0 for patch coordinate u, create a cubic Bezier curve segment P(w)=P(u0...
Definition: Geo_BicubicBezierPatch.h:405
static Row< 4, P > calcD3Fb(RealP u)
Calculate third derivatives d3Fb=[B0uuu..B3uuu] of the Bernstein basis functions for a given value of...
Definition: Geo_CubicBezierCurve.h:351
void splitU(RealP u, BicubicBezierPatch_< P > &patch0, BicubicBezierPatch_< P > &patch1) const
Split this patch into two along the u direction, along an isoparametric curve of constant u=t such th...
Definition: Geo_BicubicBezierPatch.h:206
void evalP1(RealP u, RealP w, Vec3P &Pu, Vec3P &Pw) const
Evaluate the tangents Pu=dP/du, Pw=dP/dw on this patch given values for the parameters u and w in [0...
Definition: Geo_BicubicBezierPatch.h:125
CubicBezierCurve_< P > getBoundaryCurveW1() const
Return the w=1 boundary curve as a Bezier curve segment.
Definition: Geo_BicubicBezierPatch.h:178
Mat< 4, 4, Vec3P > & updControlPoints()
Return a writable reference to the Bezier control points B that are stored in this object...
Definition: Geo_BicubicBezierPatch.h:150
static Row< 4, P > calcFb(RealP u)
Calculate the Bernstein basis functions Fb=[B0..B3] for a given value of the parameter u...
Definition: Geo_CubicBezierCurve.h:328
static Vec3P evalPUsingB(const Mat< 4, 4, Vec3P > &B, RealP u, RealP w)
Given Bezier control points B and values for the curve parameters u and w in [0..1], return the point P(u,w)=Fb(u)*B*~Fb(w) at that location, where Fb is a vector of Bezier basis functions.
Definition: Geo_BicubicBezierPatch.h:344
Geo::AlignedBox_< P > calcAxisAlignedBoundingBox() const
Return an axis-aligned bounding box (AABB) that surrounds the entire patch segment in the 0<= u...
Definition: Geo_BicubicBezierPatch.h:321
const Vec< 4, Vec3P > & getControlPoints() const
Return a reference to the Bezier control points B=[b0 b1 b2 b3] that are stored in this object...
Definition: Geo_CubicBezierCurve.h:162
#define SimTK_ERRCHK1(cond, whereChecked, fmt, a1)
Definition: ExceptionMacros.h:326
Vec3P evalP(RealP u, RealP w) const
Evaluate a point P(u,w) on this patch given values for the parameters u and w in [0,1].
Definition: Geo_BicubicBezierPatch.h:120
static Mat< 4, 4, Vec3P > calcBFromA(const Mat< 4, 4, Vec3P > &A)
Given the vector algebraic coefficients A, return the equivalent Bezier control points B...
Definition: Geo_BicubicBezierPatch.h:447
const Mat< 4, 4, Vec3P > & getControlPoints() const
Return a reference to the Bezier control points B that are stored in this object. ...
Definition: Geo_BicubicBezierPatch.h:146
BicubicBezierPatch_(const Mat< 4, 4, Vec3P > &controlPoints)
Construct a bicubic Bezier patch using the given control points B.
Definition: Geo_BicubicBezierPatch.h:113
TODO: A 3d box oriented and positioned with respect to an unspecified frame F.
Definition: Geo.h:63
A 3d box aligned with an unspecified frame F and centered at a given point measured from that frame's...
Definition: Geo.h:62
static Mat< 4, 4, Vec3P > calcBFromH(const Mat< 4, 4, Vec3P > &H)
Given the vector Hermite coefficients H, return the equivalent Bezier control points B...
Definition: Geo_BicubicBezierPatch.h:495
This is a fixed length column vector designed for no-overhead inline computation. ...
Definition: Vec.h:131
Includes internal headers providing declarations for the basic SimTK Core classes, including Simmatrix.
void splitW(RealP w, BicubicBezierPatch_< P > &patch0, BicubicBezierPatch_< P > &patch1) const
Split this patch into two along the w direction, along an isoparametric curve of constant w=t such th...
Definition: Geo_BicubicBezierPatch.h:241
static void evalP3UsingB(const Mat< 4, 4, Vec3P > &B, RealP u, RealP w, Vec3P &Puuu, Vec3P &Puuw, Vec3P &Puww, Vec3P &Pwww)
Given Bezier control points B and values for the curve parameters u and w in [0..1], return the third derivatives Puuu(u,w)=d3Fb(u)*B*~Fb(w), Puuw(u,w)=d2Fb(u)*B*~dFb(w), Puww(u,w)=dFb(u)*B*~d2Fb(w) and Pwww(u,w)=Fb(u)*B*~d3Fb(w) at that location.
Definition: Geo_BicubicBezierPatch.h:385
static Geo::AlignedBox_< P > calcAxisAlignedBoundingBox(const Array_< Vec3P > &points, Array_< int > &support)
Calculate the smallest axis-aligned bounding box including all n given points.
static Mat< 4, 4, Vec3P > calcAFromB(const Mat< 4, 4, Vec3P > &B)
Given the Bezier control points B, return the equivalent vector algebraic coefficients A...
Definition: Geo_BicubicBezierPatch.h:419
static Geo::OrientedBox_< P > calcOrientedBoundingBox(const Array_< Vec3P > &points, Array_< int > &support, bool optimize=true)
Calculate a tight-fitting oriented bounding box (OBB) that includes all n given points.
Defines geometric primitive shapes and algorthms.
Provides primitive operations for a single bicubic Bezier curve using either single or double precisi...
void evalP2(RealP u, RealP w, Vec3P &Puu, Vec3P &Puw, Vec3P &Pww) const
Evaluate the second derivatives Puu=d2P/du2, Pww=d2P/dw2, and cross derivative Puw=Pwu=d2P/dudw on th...
Definition: Geo_BicubicBezierPatch.h:132
Mat< 4, 4, Vec3P > calcAlgebraicCoefficients() const
Calculate the algebraic coefficients A from the stored Bezier control points.
Definition: Geo_BicubicBezierPatch.h:154
static void evalP1UsingB(const Mat< 4, 4, Vec3P > &B, RealP u, RealP w, Vec3P &Pu, Vec3P &Pw)
Given Bezier control points B and values for the curve parameters u and w in [0..1], return the tangents Pu(u,w)=dFb(u)*B*~Fb(w) and Pw(u,w)=Fb(u)*B*~dFb(w) at that location.
Definition: Geo_BicubicBezierPatch.h:354
Geo::OrientedBox_< P > calcOrientedBoundingBox() const
Return an oriented bounding box (OBB) that surrounds the entire curve segment in the 0<= u...
Definition: Geo_BicubicBezierPatch.h:332
void split(RealP u, RealP w, BicubicBezierPatch_< P > &patch00, BicubicBezierPatch_< P > &patch01, BicubicBezierPatch_< P > &patch10, BicubicBezierPatch_< P > &patch11) const
Split this patch into four subpatches at a particular parametric point (u,w) such that 0 < u...
Definition: Geo_BicubicBezierPatch.h:278
Mat< 4, 4, Vec3P > calcHermiteCoefficients() const
Calculate the Hermite coefficients H from the stored Bezier control points.
Definition: Geo_BicubicBezierPatch.h:158
CubicBezierCurve_< P > calcIsoCurveW(RealP w0) const
Given a particular value w0 for patch coordinate w, create a cubic Bezier curve segment P(u)=P(u...
Definition: Geo_BicubicBezierPatch.h:189
#define SimTK_ERRCHK2(cond, whereChecked, fmt, a1, a2)
Definition: ExceptionMacros.h:328
This is the header file that every Simmath compilation unit should include first. ...
This Array_ helper class is the base class for ArrayView_ which is the base class for Array_; here we...
Definition: Array.h:48
BicubicBezierPatch_()
Construct an uninitialized patch; control points will be garbage.
Definition: Geo_BicubicBezierPatch.h:107
Generic Row.
Definition: Row.h:118
static Mat< 4, 4, Vec3P > calcHFromB(const Mat< 4, 4, Vec3P > &B)
Given the Bezier control points B, return the equivalent vector Hermite coefficients H...
Definition: Geo_BicubicBezierPatch.h:475
static Row< 4, P > calcDFb(RealP u)
Calculate first derivatives dFb=[B0u..B3u] of the Bernstein basis functions for a given value of the ...
Definition: Geo_CubicBezierCurve.h:336
A geometric primitive representing a sphere by its radius and center point, and a collection of spher...
Definition: Geo.h:56
CubicBezierCurve_< P > getBoundaryCurveU0() const
Return the u=0 boundary curve as a Bezier curve segment.
Definition: Geo_BicubicBezierPatch.h:163
void evalP3(RealP u, RealP w, Vec3P &Puuu, Vec3P &Puuw, Vec3P &Puww, Vec3P &Pwww) const
Evaluate the third derivatives Puuu=d3P/du3, Pwww=d3P/dw3, and cross derivatives Puuw=Pwuu=Puwu=d3P/d...
Definition: Geo_BicubicBezierPatch.h:139
static CubicBezierCurve_< P > calcIsoCurveW(const Mat< 4, 4, Vec3P > &B, RealP w0)
Given a particular value w0 for patch coordinate w, create a cubic Bezier curve segment P(u)=P(u...
Definition: Geo_BicubicBezierPatch.h:413
This is a primitive useful for computations involving a single cubic Bezier curve segment...
Definition: Geo.h:67
A primitive useful for computations involving a single bicubic Bezier patch.
Definition: Geo.h:68
CubicBezierCurve_< P > getBoundaryCurveU1() const
Return the u=1 boundary curve as a Bezier curve segment.
Definition: Geo_BicubicBezierPatch.h:168
This class represents a small matrix whose size is known at compile time, containing elements of any ...
Definition: Mat.h:51
Geo::Sphere_< P > calcBoundingSphere() const
Return a sphere that surrounds the entire patch in the 0<= u,w <=1 range.
Definition: Geo_BicubicBezierPatch.h:310
static Row< 4, P > calcD2Fb(RealP u)
Calculate second derivatives d2Fb=[B0uu..B3uu] of the Bernstein basis functions for a given value of ...
Definition: Geo_CubicBezierCurve.h:343
static void evalP2UsingB(const Mat< 4, 4, Vec3P > &B, RealP u, RealP w, Vec3P &Puu, Vec3P &Puw, Vec3P &Pww)
Given Bezier control points B and values for the curve parameters u and w in [0..1], return the second derivatives Puu(u,w)=d2Fb(u)*B*~Fb(w), Puw(u,w)=dFb(u)*B*~dFb(w) and Pww(u,w)=Fb(u)*B*~d2Fb(w) at that location.
Definition: Geo_BicubicBezierPatch.h:368
CubicBezierCurve_< P > getBoundaryCurveW0() const
Return the w=0 boundary curve as a Bezier curve segment.
Definition: Geo_BicubicBezierPatch.h:173
CubicBezierCurve_< P > calcIsoCurveU(RealP u0) const
Given a particular value u0 for patch coordinate u, create a cubic Bezier curve segment P(w)=P(u0...
Definition: Geo_BicubicBezierPatch.h:184
static Sphere_< P > calcBoundingSphere(const Vec3P &p)
Create a tiny bounding sphere around a single point.
Definition: Geo_Point.h:333