00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef LUX_BBOX_H
00026 #define LUX_BBOX_H
00027
00028 #include <iostream>
00029 #include "vector.h"
00030 #include "point.h"
00031
00032 namespace lux
00033 {
00034
00035 class BBox {
00036 public:
00037
00038 BBox() {
00039 pMin = Point( INFINITY, INFINITY, INFINITY);
00040 pMax = Point(-INFINITY, -INFINITY, -INFINITY);
00041 }
00042 BBox(const Point &p) : pMin(p), pMax(p) { }
00043 BBox(const Point &p1, const Point &p2) {
00044 pMin = Point(min(p1.x, p2.x),
00045 min(p1.y, p2.y),
00046 min(p1.z, p2.z));
00047 pMax = Point(max(p1.x, p2.x),
00048 max(p1.y, p2.y),
00049 max(p1.z, p2.z));
00050 }
00051 friend inline ostream &
00052 operator<<(ostream &os, const BBox &b);
00053 friend BBox Union(const BBox &b, const Point &p);
00054 friend BBox Union(const BBox &b, const BBox &b2);
00055 bool Overlaps(const BBox &b) const {
00056 bool x = (pMax.x >= b.pMin.x) && (pMin.x <= b.pMax.x);
00057 bool y = (pMax.y >= b.pMin.y) && (pMin.y <= b.pMax.y);
00058 bool z = (pMax.z >= b.pMin.z) && (pMin.z <= b.pMax.z);
00059 return (x && y && z);
00060 }
00061 bool Inside(const Point &pt) const {
00062 return (pt.x >= pMin.x && pt.x <= pMax.x &&
00063 pt.y >= pMin.y && pt.y <= pMax.y &&
00064 pt.z >= pMin.z && pt.z <= pMax.z);
00065 }
00066 void Expand(float delta) {
00067 pMin -= Vector(delta, delta, delta);
00068 pMax += Vector(delta, delta, delta);
00069 }
00070 float Volume() const {
00071 Vector d = pMax - pMin;
00072 return d.x * d.y * d.z;
00073 }
00074 int MaximumExtent() const {
00075 Vector diag = pMax - pMin;
00076 if (diag.x > diag.y && diag.x > diag.z)
00077 return 0;
00078 else if (diag.y > diag.z)
00079 return 1;
00080 else
00081 return 2;
00082 }
00083 void BoundingSphere(Point *c, float *rad) const;
00084 bool IntersectP(const Ray &ray,
00085 float *hitt0 = NULL,
00086 float *hitt1 = NULL) const;
00087
00088 Point pMin, pMax;
00089
00090
00091
00092 };
00093
00094 inline ostream &operator<<(ostream &os, const BBox &b) {
00095 os << b.pMin << " -> " << b.pMax;
00096 return os;
00097 }
00098
00099
00100 }
00101
00102 #endif //LUX_BBOX_H