1 #ifndef SimTK_SIMMATH_GEO_BOX_H_
2 #define SimTK_SIMMATH_GEO_BOX_H_
65 SimTK_ERRCHK3(halfLengths >= 0,
"Geo::Box_::setHalfLengths()",
66 "Half lengths must be nonnegative; got %g,%g,%g.",
67 (
double)halfLengths[0],(
double)halfLengths[1],(
double)halfLengths[2]);
78 "Half lengths must be nonnegative but were %g,%g,%g after change.",
79 (
double)h[0],(
double)h[1],(
double)h[2]);
104 RealP
findArea()
const {
return 8*(h[0]*h[1] + h[0]*h[2] + h[1]*h[2]);}
121 if (absPt[0] > h[0]) d2 +=
square(absPt[0]-h[0]);
122 if (absPt[1] > h[1]) d2 +=
square(absPt[1]-h[1]);
123 if (absPt[2] > h[2]) d2 +=
square(absPt[2]-h[2]);
135 if (absCtr[0] > grow[0]) d2 +=
square(absCtr[0]-grow[0]);
136 if (absCtr[1] > grow[1]) d2 +=
square(absCtr[1]-grow[1]);
137 if (absCtr[2] > grow[2]) d2 +=
square(absCtr[2]-grow[2]);
149 if (absCtr[0] > grow[0]) d2 +=
square(absCtr[0]-grow[0]);
150 if (absCtr[1] > grow[1]) d2 +=
square(absCtr[1]-grow[1]);
151 if (absCtr[2] > grow[2]) d2 +=
square(absCtr[2]-grow[2]);
162 if (absCtr[0] > h[0]+r)
return false;
163 if (absCtr[1] > h[1]+r)
return false;
164 if (absCtr[2] > h[2]+r)
return false;
175 if (absCtr[0] > h[0]+aabh[0])
return false;
176 if (absCtr[1] > h[1]+aabh[1])
return false;
177 if (absCtr[2] > h[2]+aabh[2])
return false;
211 order[0] = shortest; order[2] = longest;
212 order[1] = shortest.getThirdAxis(longest);
215 int intersectsOrientedBoxHelper(
const OrientedBox_<P>& O,
217 Vec3P& absP_BO)
const;
220 unsigned char order[3];
243 : center(center), box(box) {}
247 : center(center), box(halfLengths) {}
251 { this->center=center;
return *
this; }
271 bool containsPoint(
const Vec3P& pt_F)
const
272 {
return box.containsPoint(pt_F - center); }
282 const RealP tol = Geo::getDefaultTol<P>();
283 const RealP maxdim =
max(getCenter().
abs());
284 const RealP maxrad =
max(getHalfLengths());
285 const RealP scale =
std::max(maxdim, maxrad);
286 const RealP incr =
std::max(scale*Geo::getEps<P>(), tol);
287 box.addToHalfLengths(
Vec3P(incr));
317 : X_FB(X_FB), box(box) {}
321 : X_FB(X_FB), box(halfLengths) {}
326 { X_FB=newX_FB;
return *
this; }
347 bool containsPoint(
const Vec3P& pt_F)
const
348 {
return box.containsPoint(~X_FB*pt_F); }
358 const RealP tol = Geo::getDefaultTol<P>();
359 const RealP maxdim =
max(getCenter().
abs());
360 const RealP maxrad =
max(getHalfLengths());
361 const RealP scale =
std::max(maxdim, maxrad);
362 const RealP incr =
std::max(scale*Geo::getEps<P>(), tol);
363 box.addToHalfLengths(
Vec3P(incr));
375 #endif // SimTK_SIMMATH_GEO_BOX_H_