GwieF.com : project.GrieF.com : Classes : Box
logo

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);
    }
}