public IEnumerable<ISect> Intersect(Ray r) { foreach (SceneObject obj in Things) { yield return obj.Intersect(r); } }
public override ISect Intersect(Ray ray) { Vector eo = Vector.Minus(Center, ray.Start); double v = Vector.Dot(eo, ray.Dir); double dist; if (v < 0) { dist = 0; } else { double disc = Math.Pow(Radius, 2) - (Vector.Dot(eo, eo) - Math.Pow(v, 2)); dist = disc < 0 ? 0 : v - Math.Sqrt(disc); } if (dist == 0) return ISect.Null; return new ISect(this, ray, dist); }
private Color TraceRay(Ray ray, Scene scene, int depth) { ISect isect = MinIntersection(ray, scene); if (ISect.IsNull(isect)) return Color.Background; return Shade(isect, scene, depth); }
private double TestRay(Ray ray, Scene scene) { ISect isect = MinIntersection(ray, scene); if (ISect.IsNull(isect)) return 0; return isect.Dist; }
private ISect MinIntersection(Ray ray, Scene scene) { ISect min = ISect.Null; foreach (SceneObject obj in scene.Things) { ISect isect = obj.Intersect(ray); if (!ISect.IsNull(isect)) { if (ISect.IsNull(min) || min.Dist > isect.Dist) { min = isect; } } } return min; }