19
Jun
05

The following Mathematica code demonstrates how to write a very simple ray tracer:
```(* runtime: 11.5 minutes *) n = 275; r = 1; plight = {0, 0, 1}; Normalize[x_] := x/Sqrt[x.x]; spheres = {{{1, 1.0/Sqrt[3], 0}, {1, 0,0}}, {{-1, 1.0/Sqrt[3], 0}, {0, 1, 0}}, {{0, -2.0/Sqrt[3], 0}, {0, 0, 1}}, {{0, 0, -Sqrt[8.0/3]}, {1, 1, 1}}}; Intersections[p_, dir_] := Module[{a = p.dir, b}, b = r^2 + a^2 - p.p; If[b > 0, Select[Sqrt[b]{-1, 1} - a, # > 10^-10 &], {}]]; RayTrace[p_, dir_, depth_] := Module[{dlist = Map[Min[Intersections[p - #[[1]], dir]] &, spheres], d, i, p2, normal, color, lightdir, intensity}, d = Min[dlist]; If[d < Infinity, p2 = p + d dir; i = Position[dlist, d, 1, 1][[1, 1]]; normal = Normalize[p2 - spheres[[i, 1]]]; color = If[depth > 50, {0, 0, 0}, RayTrace[p2, Normalize[dir - 2(normal.dir)normal], depth + 1]]; lightdir = Normalize[plight - p2]; intensity = normal.lightdir; If[intensity > 0, shadowed = Or @@ Map[Intersections[p2 - #[[1]], lightdir] =!= {} &, spheres]; If[! shadowed,color += intensity spheres[[i, 2]]]]; color, {0, 0, 0}]]; Show[Graphics[RasterArray[Table[RGBColor @@ Map[Min[1, Max[0, #]] &, RayTrace[{0, 0, 1},Normalize[{x,y, -1}], 1]], {y, -0.5, 0.5, 1.0/n}, {x, -0.5, 0.5, 1.0/n}]], AspectRatio -> 1]];```You can also easily ray trace Wada Basins using POV-Ray:
```// runtime: 4 seconds global_settings{max_trace_level 50} camera{location z look_at 0} light_source{z,1} #default{finish{reflection 1 ambient 0}} sphere{<1,sqrt(1/3),0> 1 pigment{rgb <1,0,0>}} sphere{<-1,1/sqrt(3),0> 1 pigment{rgb <0,1,0>}} sphere{<0,-2/sqrt(3),0> 1 pigment{rgb <0,0,1>}} sphere{<0,0,-sqrt(8/3)> 1 pigment{rgb 1}}```

## Welcome !

You will find here some of my favorite hobbies and interests, especially science and art.

I hope you enjoy it!

Subscribe to the RSS feed to stay informed when I publish something new here.

I would love to hear from you! Please feel free to send me an email : bugman123-at-gmail-dot-com