diff options
Diffstat (limited to 'Build/source/utils/asymptote/bbox3.h')
-rw-r--r-- | Build/source/utils/asymptote/bbox3.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/bbox3.h b/Build/source/utils/asymptote/bbox3.h new file mode 100644 index 00000000000..5659f24b6ee --- /dev/null +++ b/Build/source/utils/asymptote/bbox3.h @@ -0,0 +1,153 @@ +/***** + * bbox3.h + * Andy Hammerlindl 2002/06/06 + * + * Stores a rectangle that encloses a drawing object. + *****/ + +#ifndef BBOX3_H +#define BBOX3_H + +#include "triple.h" + +namespace camp { + +// The box that encloses a path +struct bbox3 { + bool empty; + double left; + double bottom; + double lower; + double right; + double top; + double upper; + + // Start bbox3 about the origin + bbox3() + : empty(true), left(0.0), bottom(0.0), lower(0.0), + right(0.0), top(0.0), upper(0.0) + { + } + + bbox3(double left, double bottom, double lower, + double right, double top, double upper) + : empty(false), left(left), bottom(bottom), lower(lower), + right(right), top(top), upper(upper) + { + } + + // Start a bbox3 with a point + bbox3(double x, double y, double z) + : empty(false), left(x), bottom(y), lower(z), right(x), top(y), upper(z) + { + } + + // Start a bbox3 with a point + bbox3(const triple& v) + : empty(false), left(v.getx()), bottom(v.gety()), lower(v.getz()), + right(v.getx()), top(v.gety()), upper(v.getz()) + { + } + + // Add a point to a bbox3 + void add(const triple& v) + { + double x = v.getx(), y = v.gety(), z = v.getz(); + + if (empty) { + left = right = x; + top = bottom = y; + lower = upper = z; + empty = false; + } + else { + if(x < left) + left = x; + else if(x > right) + right = x; + if(y < bottom) + bottom = y; + else if(y > top) + top = y; + if(z < lower) + lower = z; + else if(z > upper) + upper = z; + } + } + + // Add a point to a nonempty bbox3 + void addnonempty(double x, double y, double z) + { + if(x < left) + left = x; + else if(x > right) + right = x; + if(y < bottom) + bottom = y; + else if(y > top) + top = y; + if(z < lower) + lower = z; + else if(z > upper) + upper = z; + } + + // Add a point to a nonempty bbox3 + void addnonempty(const triple& v) + { + addnonempty(v.getx(),v.gety(),v.getz()); + } + + // Add a point to a nonempty bbox, updating bounding times + void addnonempty(const triple& v, bbox3& times, double t) + { + double x = v.getx(), y = v.gety(), z = v.getz(); + + if(x < left) { + left = x; + times.left = t; + } + else if(x > right) { + right = x; + times.right = t; + } + if(y < bottom) { + bottom = y; + times.bottom = t; + } + else if(y > top) { + top = y; + times.top = t; + } + if(z < lower) { + lower = z; + times.lower=t; + } + else if(z > upper) { + upper = z; + times.upper=t; + } + } + + bbox3 operator+= (const triple& v) + { + add(v); + return *this; + } + + triple Min() const { + return triple(left,bottom,lower); + } + + triple Max() const { + return triple(right,top,upper); + } + +}; + +} // namespace camp + +GC_DECLARE_PTRFREE(camp::bbox3); + +#endif |