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 
00026 #include "stdafx.h"
00027 #include "geometry.h"
00028 
00029 
00030 BBox Union(const BBox &b, const Point &p) {
00031     BBox ret = b;
00032     ret.pMin.x = min(b.pMin.x, p.x);
00033     ret.pMin.y = min(b.pMin.y, p.y);
00034     ret.pMin.z = min(b.pMin.z, p.z);
00035     ret.pMax.x = max(b.pMax.x, p.x);
00036     ret.pMax.y = max(b.pMax.y, p.y);
00037     ret.pMax.z = max(b.pMax.z, p.z);
00038     return ret;
00039 }
00040 
00041 
00042 BBox Union(const BBox &b, const BBox &b2) {
00043     BBox ret;
00044     ret.pMin.x = min(b.pMin.x, b2.pMin.x);
00045     ret.pMin.y = min(b.pMin.y, b2.pMin.y);
00046     ret.pMin.z = min(b.pMin.z, b2.pMin.z);
00047     ret.pMax.x = max(b.pMax.x, b2.pMax.x);
00048     ret.pMax.y = max(b.pMax.y, b2.pMax.y);
00049     ret.pMax.z = max(b.pMax.z, b2.pMax.z);
00050     return ret;
00051 }
00052 
00053 
00054 void BBox::BoundingSphere(Point *c, float *rad) const {
00055     *c = .5f * pMin + .5f * pMax;
00056     *rad = Inside(*c) ? Distance(*c, pMax) : 0.f;
00057 }
00058 
00059 
00060 bool BBox::IntersectP(const Ray &ray, float *hitt0,
00061                       float *hitt1) const {
00062     float t0 = ray.mint, t1 = ray.maxt;
00063     for (int i = 0; i < 3; ++i) {
00064         
00065         float invRayDir = 1.f / ray.d[i];
00066         float tNear = (pMin[i] - ray.o[i]) * invRayDir;
00067         float tFar  = (pMax[i] - ray.o[i]) * invRayDir;
00068 
00069         
00070         if (tNear > tFar) swap(tNear, tFar);
00071         t0 = tNear > t0 ? tNear : t0;
00072         t1 = tFar  < t1 ? tFar  : t1;
00073         if (t0 > t1) return false;
00074     }
00075     if (hitt0) *hitt0 = t0;
00076     if (hitt1) *hitt1 = t1;
00077     return true;
00078 }
00079 
00080