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