/** Sphere * (see Glassner p 281) * @author: Phil Gage */ class Sphere extends AbstractObject { Point center; double radius; double radius2; // radius squared private Vector3 v = new Vector3(); Sphere (Point center, double radius, Color color) { super(color); this.center = center; this.radius = radius; this.radius2 = radius*radius; } double intersect (Ray ray, Intersection intersection) { double b, discriminant, t, t1, t2; ++Statistics.intersectionCount; // stats v.set(center); v.subtract(ray.origin); b = v.dot(ray.direction); discriminant = b*b - v.dot(v) + radius2; if (discriminant <= 0.0) return 0.0; discriminant = Math.sqrt(discriminant); t2 = b + discriminant; if (t2 < Constants.EPSILON) return 0.0; t1 = b - discriminant; if (t1 > Constants.EPSILON) t = t1; else t = t2; // Set intersection object fields intersection.obj = null; intersection.incident.set(ray.direction); ray.extrapolate(t,intersection.point); intersection.normal.set(intersection.point); intersection.normal.subtract(center); intersection.normal.normalize(); return t; } /** Return bounding box around this object */ Extent getExtent () { return new Extent ( new Point(center.x-radius,center.y-radius,center.z-radius), new Point(center.x+radius,center.y+radius,center.z+radius)); } }