1#ifndef SimTK_SIMMATH_GEO_BICUBIC_BEZIER_PATCH_H_
2#define SimTK_SIMMATH_GEO_BICUBIC_BEZIER_PATCH_H_
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 );
#define SimTK_ERRCHK2(cond, whereChecked, fmt, a1, a2)
Definition ExceptionMacros.h:328
#define SimTK_ERRCHK1(cond, whereChecked, fmt, a1)
Definition ExceptionMacros.h:326
Defines geometric primitive shapes and algorthms.
Provides primitive operations for a single bicubic Bezier curve using either single or double precisi...
Includes internal headers providing declarations for the basic SimTK Core classes,...
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:324
A 3d box aligned with an unspecified frame F and centered at a given point measured from that frame's...
Definition Geo_Box.h:457
A primitive useful for computations involving a single bicubic Bezier patch.
Definition Geo_BicubicBezierPatch.h:101
Mat< 4, 4, Vec3P > calcHermiteCoefficients() const
Calculate the Hermite coefficients H from the stored Bezier control points.
Definition Geo_BicubicBezierPatch.h:158
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
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
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],...
Definition Geo_BicubicBezierPatch.h:344
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],...
Definition Geo_BicubicBezierPatch.h:385
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
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 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
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
BicubicBezierPatch_(const Mat< 4, 4, Vec3P > &controlPoints)
Construct a bicubic Bezier patch using the given control points B.
Definition Geo_BicubicBezierPatch.h:113
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
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
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
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
CubicBezierCurve_< P > getBoundaryCurveU0() const
Return the u=0 boundary curve as a Bezier curve segment.
Definition Geo_BicubicBezierPatch.h:163
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
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
CubicBezierCurve_< P > getBoundaryCurveW0() const
Return the w=0 boundary curve as a Bezier curve segment.
Definition Geo_BicubicBezierPatch.h:173
CubicBezierCurve_< P > getBoundaryCurveU1() const
Return the u=1 boundary curve as a Bezier curve segment.
Definition Geo_BicubicBezierPatch.h:168
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
Mat< 4, 4, Vec3P > calcAlgebraicCoefficients() const
Calculate the algebraic coefficients A from the stored Bezier control points.
Definition Geo_BicubicBezierPatch.h:154
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],...
Definition Geo_BicubicBezierPatch.h:368
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
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
BicubicBezierPatch_()
Construct an uninitialized patch; control points will be garbage.
Definition Geo_BicubicBezierPatch.h:107
CubicBezierCurve_< P > getBoundaryCurveW1() const
Return the w=1 boundary curve as a Bezier curve segment.
Definition Geo_BicubicBezierPatch.h:178
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 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],...
Definition Geo_BicubicBezierPatch.h:354
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 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
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,...
Definition Geo_BicubicBezierPatch.h:120
This is a primitive useful for computations involving a single cubic Bezier curve segment.
Definition Geo_CubicBezierCurve.h:137
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
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
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
void bisect(CubicBezierCurve_< P > &left, CubicBezierCurve_< P > &right) const
Split this curve into two at the point u=1/2 (halfway in parameter space, not necessarily in arclengt...
Definition Geo_CubicBezierCurve.h:283
void split(RealP u, CubicBezierCurve_< P > &left, CubicBezierCurve_< P > &right) const
Split this curve into two at a point u=t such that 0 < t < 1, such that the first curve coincides wit...
Definition Geo_CubicBezierCurve.h:259
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 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
TODO: A 3d box oriented and positioned with respect to an unspecified frame F.
Definition Geo_Box.h:528
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 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.
static Sphere_< P > calcBoundingSphere(const Vec3P &p)
Create a tiny bounding sphere around a single point.
Definition Geo_Point.h:333
A geometric primitive representing a sphere by its radius and center point, and a collection of spher...
Definition Geo_Sphere.h:47
This class represents a small matrix whose size is known at compile time, containing elements of any ...
Definition Mat.h:97
This is a fixed-length row vector designed for no-overhead inline computation.
Definition Row.h:132
This is a fixed-length column vector designed for no-overhead inline computation.
Definition Vec.h:184
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition Assembler.h:37
SimTK_Real Real
This is the default compiled-in floating point type for SimTK, either float or double.
Definition SimTKcommon/include/SimTKcommon/internal/common.h:606