summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/bbox3.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/bbox3.h')
-rw-r--r--Build/source/utils/asymptote/bbox3.h197
1 files changed, 197 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..e2428f8c001
--- /dev/null
+++ b/Build/source/utils/asymptote/bbox3.h
@@ -0,0 +1,197 @@
+/*****
+ * bbox3.h
+ * Andy Hammerlindl 2002/06/06
+ *
+ * Stores a rectangle that encloses a drawing object.
+ *****/
+
+#ifndef BBOX3_H
+#define BBOX3_H
+
+#include "triple.h"
+
+// For CYGWIN
+#undef near
+#undef far
+
+namespace camp {
+
+// The box that encloses a path
+struct bbox3 {
+ bool empty;
+ double left;
+ double bottom;
+ double near;
+ double right;
+ double top;
+ double far;
+
+ // Start bbox3 about the origin
+ bbox3()
+ : empty(true), left(0.0), bottom(0.0), near(0.0),
+ right(0.0), top(0.0), far(0.0)
+ {
+ }
+
+ bbox3(double left, double bottom, double near,
+ double right, double top, double far)
+ : empty(false), left(left), bottom(bottom), near(near),
+ right(right), top(top), far(far)
+ {
+ }
+
+ // Start a bbox3 with a point
+ bbox3(double x, double y, double z)
+ : empty(false), left(x), bottom(y), near(z), right(x), top(y), far(z)
+ {
+ }
+
+ // Start a bbox3 with a point
+ bbox3(const triple& v)
+ : empty(false), left(v.getx()), bottom(v.gety()), near(v.getz()),
+ right(v.getx()), top(v.gety()), far(v.getz())
+ {
+ }
+
+ // Start a bbox3 with 2 points
+ bbox3(const triple& m, const triple& M)
+ : empty(false),
+ left(m.getx()), bottom(m.gety()), near(m.getz()),
+ right(M.getx()), top(M.gety()), far(M.getz())
+ {
+ }
+
+ // Add a point to a bbox3
+ void add(const triple& v)
+ {
+ const double x = v.getx(), y = v.gety(), z = v.getz();
+ add(x,y,z);
+ }
+ void add(double x, double y, double z)
+ {
+ if (empty) {
+ left = right = x;
+ top = bottom = y;
+ near = far = 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 < near)
+ near = z;
+ else if(z > far)
+ far = 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 < near)
+ near = z;
+ else if(z > far)
+ far = z;
+ }
+
+ // Add (x,y) pair to a nonempty bbox3
+ void addnonempty(pair v)
+ {
+ double x=v.getx();
+ if(x < left)
+ left = x;
+ else if(x > right)
+ right = x;
+ double y=v.gety();
+ if(y < bottom)
+ bottom = y;
+ else if(y > top)
+ top = y;
+ }
+
+ // 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 < near) {
+ near = z;
+ times.near=t;
+ }
+ else if(z > far) {
+ far = z;
+ times.far=t;
+ }
+ }
+
+ bbox3 operator+= (const triple& v)
+ {
+ add(v);
+ return *this;
+ }
+
+ triple Min() const {
+ return triple(left,bottom,near);
+ }
+
+ triple Max() const {
+ return triple(right,top,far);
+ }
+
+ pair Min2() const {
+ return pair(left,bottom);
+ }
+
+ pair Max2() const {
+ return pair(right,top);
+ }
+
+ friend ostream& operator << (ostream& out, const bbox3& b)
+ {
+ out << "Min " << b.Min() << " Max " << b.Max();
+ return out;
+ }
+
+};
+
+} // namespace camp
+
+GC_DECLARE_PTRFREE(camp::bbox3);
+
+#endif