GwieF.com : Project : Classes : Sphere
logo

Sphere.java


package com.gwief.jTrace;

/*
    Sphere.java by Damian Newport
    Implements a sphere
*/

class Sphere {
    
    /* Takes a Ray. if no intersection returns array length 0
    if intersection returns array length 2 with intersections in */
    public static final double[] intersect(Ray i){
        Vector3D Ro = new Vector3D(i.origin);
        Vector3D Rd = new Vector3D(i.direction);
        double b,c,check;
        
        Rd.multiply(2);
        
        b = Rd.dot(Ro);
        c = (Ro.dot(Ro)) - 0.25d ;
        
        check = (b*b)-(4*c);
        if (check < 0){
            return new double[0];
        }else{
            double[] result = new double[2];
            check = Math.sqrt(check);
            b = (b * -1);
            result[0] = (b + check)/2;
            result[1] = (b - check)/2;
            
            if (result[0] > result[1]){
                b = result[1];
                result[1] = result[0];
                result[0] = b;
            }

            if (result[1] < 0){
                return new double[0];
            }
            
            return result;
        }
    }
    
    /* takes a intersection point as a Vector3D.
    returns the normal as a Vector3D */
    public static final Vector3D normal(Vector3D a){
        if ((0.5 - a.modulus()) < rayTrace.TINY){
            return  new Vector3D(a);
        }
        System.out.println("Error! Point " + a.out() + " not found on Sphere surface");
        System.out.println("Radius Error " + (0.5-a.modulus()));
        // System.exit(1);
        return new Vector3D(0,0,1);
    }
}