Box.java
package com.gwief.jTrace;
/*
Box.java by Damian Newport
Implements behavior to find the intersection and normal for a cube
center3ed around (0,0,0) of dimentions (1,1,1)
*/
class Box{
public static final double[] intersect(Ray i){
Vector3D Ro = new Vector3D(i.origin);
Vector3D Rd = new Vector3D(i.direction);
double Tnear = rayTrace.NINFINITY;
double Tfar = rayTrace.INFINITY;
double T1,T2,temp;
double[] result = new double[0];
/* for X */
if (Math.abs(Rd.x) < rayTrace.TINY){
if ((Ro.x > 0.5) || (Ro.x < -0.5)){
return result;
}
}
T1 = -(0.5+Ro.x)/Rd.x;
T2 = (0.5-Ro.x)/Rd.x;
if (T1 > T2){
temp = T1;
T1 = T2;
T2 = temp;
}
if (T1 > Tnear){
Tnear = T1;
}
if (T2 < Tfar){
Tfar = T2;
}
if (Tnear > Tfar){
return result;
}
if (Tfar < 0){
return result;
}
/* for Y */
if (Math.abs(Rd.y) < rayTrace.TINY){
if ((Ro.y > 0.5) || (Ro.y < -0.5)){
return result;
}
}
T1 = -(0.5+Ro.y)/Rd.y;
T2 = (0.5-Ro.y)/Rd.y;
if (T1 > T2){
temp = T1;
T1 = T2;
T2 = temp;
}
if (T1 > Tnear){
Tnear = T1;
}
if (T2 < Tfar){
Tfar = T2;
}
if (Tnear > Tfar){
return result;
}
if (Tfar < 0){
return result;
}
/* for Z */
if (Math.abs(Rd.z) < rayTrace.TINY){
if ((Ro.z > 0.5) || (Ro.z < -0.5)){
return result;
}
}
T1 = -(0.5+Ro.z)/Rd.z;
T2 = (0.5-Ro.z)/Rd.z;
if (T1 > T2){
temp = T1;
T1 = T2;
T2 = temp;
}
if (T1 > Tnear){
Tnear = T1;
}
if (T2 < Tfar){
Tfar = T2;
}
if (Tnear > Tfar){
return result;
}
if (Tfar < 0){
return result;
}
if (Tnear < rayTrace.MIN){
return result;
}
if (Tfar > rayTrace.MAX){
return result;
}
result = new double[2];
result[0] = Tnear;
result[1] = Tfar;
return result;
}
public static final Vector3D normal(Vector3D a){
if ((0.5-a.x) < rayTrace.TINY){
return new Vector3D(1,0,0);
}
if ((0.5+a.x) < rayTrace.TINY){
return new Vector3D(-1,0,0);
}
if ((0.5-a.y) < rayTrace.TINY){
return new Vector3D(0,1,0);
}
if ((0.5+a.y) < rayTrace.TINY){
return new Vector3D(0,-1,0);
}
if ((0.5-a.z) < rayTrace.TINY){
return new Vector3D(0,0,1);
}
if ((0.5+a.z) < rayTrace.TINY){
return new Vector3D(0,0,-1);
}
System.out.println("Error! Point " + a.out() + " not found on Box surface");
// System.exit(1);
return new Vector3D(0,0,1);
}
}