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