[svn] r5986: nemerle/trunk/snippets/raytracer: Makefile ray3.n

malekith svnadmin at nemerle.org
Tue Nov 29 23:00:29 CET 2005


Log:
Yet another version.

Author: malekith
Date: Tue Nov 29 23:00:29 2005
New Revision: 5986

Added:
   nemerle/trunk/snippets/raytracer/ray3.n
      - copied, changed from rev 5985, nemerle/trunk/snippets/raytracer/ray2.n
Modified:
   nemerle/trunk/snippets/raytracer/Makefile

Modified: nemerle/trunk/snippets/raytracer/Makefile
==============================================================================
--- nemerle/trunk/snippets/raytracer/Makefile	(original)
+++ nemerle/trunk/snippets/raytracer/Makefile	Tue Nov 29 23:00:29 2005
@@ -48,9 +48,10 @@
 %.exe: %.cs
 	gmcs $<
 
-run: ray.exe ray-hand-opt.exe ray-cs.exe ray-compressed.exe ray2.exe
+run: ray.exe ray-hand-opt.exe ray-cs.exe ray-compressed.exe ray2.exe ray3.exe
 	time $(EXECUTE) ./ray.exe 9 128 > out1.ppm
 	time $(EXECUTE) ./ray2.exe 9 128 > out5.ppm
+	time $(EXECUTE) ./ray3.exe 9 128 > out6.ppm
 	time $(EXECUTE) ./ray-compressed.exe 9 128 > out4.ppm
 	time $(EXECUTE) ./ray-hand-opt.exe 9 128 > out2.ppm
 	time $(EXECUTE) ./ray-cs.exe 9 128 > out3.ppm

Copied: nemerle/trunk/snippets/raytracer/ray3.n (from rev 5985, nemerle/trunk/snippets/raytracer/ray2.n)
==============================================================================
--- nemerle/trunk/snippets/raytracer/ray2.n	(original)
+++ nemerle/trunk/snippets/raytracer/ray3.n	Tue Nov 29 23:00:29 2005
@@ -12,6 +12,18 @@
   | Sphere { m : Vec; r : double; }
   | Group { m : Vec; r : double; l : list [Scene]; }
 def delta = 1.49011611938476562e-08; def inf = double.PositiveInfinity
+def intersect' (orig, dir : Vec, scene)
+  def ray_sphere (center, radius : double)
+    def v = center - orig; def b = v ** dir
+    def disc = b * b - (v ** v) + radius * radius
+    disc >= 0 && b + System.Math.Sqrt (disc) >= 0
+  def aux (elt)
+    match (elt)
+      | Scene.Sphere (center, radius) =>
+        ray_sphere (center, radius)
+      | Scene.Group (center, radius, scenes) =>
+        ray_sphere (center, radius) && scenes.Exists (aux)
+  aux (scene)
 def intersect (orig, dir : Vec, scene)
   def ray_sphere (center, radius : double)
     def v = center - orig; def b = v ** dir
@@ -36,7 +48,7 @@
     def g = normal ** light
     if (g >= 0) 0.0 else
       def p = orig + lambda * dir + delta * normal
-      if ((intersect (p, -1 * light, scene)) [0] < inf) 0.0 else -g
+      if (intersect' (p, -1 * light, scene)) 0.0 else -g
 def create (level, c, r)
   def obj = Scene.Sphere (c, r)
   if (level == 1) obj else



More information about the svn mailing list