예제 #1
0
 public IEnumerable<ISect> Intersect(Ray r)
 {
     foreach (SceneObject obj in Things)
     {
         yield return obj.Intersect(r);
     }
 }
예제 #2
0
파일: Sphere.cs 프로젝트: Farouq/semclone
 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);
 }
예제 #3
0
 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);
 }
예제 #4
0
 private double TestRay(Ray ray, Scene scene)
 {
     ISect isect = MinIntersection(ray, scene);
     if (ISect.IsNull(isect))
         return 0;
     return isect.Dist;
 }
예제 #5
0
 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;
 }