//package comp557.a5;
|
|
import javax.vecmath.Point3d;
|
|
public class BBox
|
{
|
|
public Point3d max;
|
public Point3d min;
|
|
public BBox()
|
{
|
this.max = new Point3d(1, 1, 1);
|
this.min = new Point3d(-1, -1, -1);
|
}
|
|
public boolean intersect0(Ray ray, IntersectResult result)
|
{
|
// Reference: http://people.csail.mit.edu/amy/papers/box-jgt.pdf
|
|
double tmin, tmax, tymin, tymax, tzmin, tzmax;
|
|
double invDirX = 1 / ray.viewDirection.x;
|
double invDirY = 1 / ray.viewDirection.y;
|
double invDirZ = 1 / ray.viewDirection.z;
|
|
if (ray.viewDirection.x >= 1e-9)
|
{
|
tmin = (min.x - ray.eyePoint.x) * invDirX;
|
tmax = (max.x - ray.eyePoint.x) * invDirX;
|
} else
|
{
|
tmax = (min.x - ray.eyePoint.x) * invDirX;
|
tmin = (max.x - ray.eyePoint.x) * invDirX;
|
}
|
|
if (ray.viewDirection.y >= 1e-9)
|
{
|
tymin = (min.y - ray.eyePoint.y) * invDirY;
|
tymax = (max.y - ray.eyePoint.y) * invDirY;
|
} else
|
{
|
tymax = (min.y - ray.eyePoint.y) * invDirY;
|
tymin = (max.y - ray.eyePoint.y) * invDirY;
|
}
|
|
if ((tmin > tymax) || (tymin > tmax))
|
{
|
return false;
|
}
|
|
if (tymin > tmin)
|
{
|
tmin = tymin;
|
}
|
|
if (tymax < tmax)
|
{
|
tmax = tymax;
|
}
|
|
if (ray.viewDirection.z >= 1e-9)
|
{
|
tzmin = (min.z - ray.eyePoint.z) * invDirZ;
|
tzmax = (max.z - ray.eyePoint.z) * invDirZ;
|
} else
|
{
|
tzmax = (min.z - ray.eyePoint.z) * invDirZ;
|
tzmin = (max.z - ray.eyePoint.z) * invDirZ;
|
}
|
|
if ((tmin > tzmax) || (tzmin > tmax))
|
{
|
return false;
|
}
|
|
// result.isIntersected = true;
|
//
|
// if (tzmin > tmin)
|
// {
|
// tmin = tzmin;
|
// }
|
//
|
// if (tzmax < tmax)
|
// {
|
// tmax = tzmax;
|
// }
|
//
|
// if (tmin > 1e-9)
|
// {
|
// result.t = tmin;
|
// } else
|
// {
|
// result.t = tmax;
|
// }
|
|
return true;
|
}
|
|
public boolean intersect(Ray ray, IntersectResult result)
|
{
|
double tmin = Double.NEGATIVE_INFINITY, tmax = Double.POSITIVE_INFINITY;
|
|
double t1 = (min.x - ray.eyePoint.x) / ray.viewDirection.x;
|
double t2 = (max.x - ray.eyePoint.x) / ray.viewDirection.x;
|
|
if (ray.viewDirection.x == 0)
|
{
|
if (ray.eyePoint.x <= min.x || ray.eyePoint.x >= max.x)
|
return false;
|
}
|
else
|
{
|
if (t1 > t2)
|
{
|
double t = t1;
|
t1 = t2;
|
t2 = t;
|
}
|
|
if (tmin > t1) tmin = t1;
|
if (tmax < t2) tmax = t2;
|
}
|
|
if (ray.viewDirection.y == 0)
|
{
|
if (ray.eyePoint.y <= min.y || ray.eyePoint.y >= max.y)
|
return false;
|
}
|
else
|
{
|
t1 = (min.y - ray.eyePoint.y) / ray.viewDirection.y;
|
t2 = (max.y - ray.eyePoint.y) / ray.viewDirection.y;
|
|
if (t1 > t2)
|
{
|
double t = t1;
|
t1 = t2;
|
t2 = t;
|
}
|
|
if (tmin > t1) tmin = t1;
|
if (tmax < t2) tmax = t2;
|
}
|
|
if (ray.viewDirection.z == 0)
|
{
|
if (ray.eyePoint.z <= min.z || ray.eyePoint.z >= max.z)
|
return false;
|
}
|
else
|
{
|
t1 = (min.z - ray.eyePoint.z) / ray.viewDirection.z;
|
t2 = (max.z - ray.eyePoint.z) / ray.viewDirection.z;
|
|
if (t1 > t2)
|
{
|
double t = t1;
|
t1 = t2;
|
t2 = t;
|
}
|
|
if (tmin > t1) tmin = t1;
|
if (tmax < t2) tmax = t2;
|
}
|
|
return tmax >= tmin && tmax > 0.0;
|
}
|
}
|