[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