// fast vector recursive ray-tracer // http://www.ffconsultancy.com/free/ray_tracer/comparison.html // http://ompf.org/ray/sphereflake/#files // http://shootout.alioth.debian.org/sandbox/benchmark.php?test=raytracer&lang=all&sort=fullcpu / unit vector U:{x%\:_sqrt x _dot x} / ray_sphere S:{[m;p;q;c;r]t:e[i]+f:_sqrt d i:&~0>d:_sqr[r]+_sqr[e:v _dot q]-v _dot v:c-p @[m#0i;i;:;@[@[t;&j;:;0i];l k;:;u k:&0t]]} / fast ray_sphere S_:{[b;p;q;c;r]@[b;i@&~0>e[i]+_sqrt d i:&~0>d:_sqr[r]+_sqr[e:v _dot q]-v _dot v:c-p;:;1]} / intersect I:{[m;p;q;z;s;o].[z;(;i);:;:[4:s;(,t),U p[;i]-s-q[;i]*\:t@:i:&z[0]>t:S[m;p;q;s;o] z[;i:&z[0]>S[m;p;q]. s]{I[#i;p[;i];q[;i];x]. y}/o]]} / fast intersect I_:{[m;p;q;b;s;o]:[4:s;S_[b;p;q;s;o];@[b;i;:;b[i:&S_[&m;p;q]. s]{I_[#i;p[;i];q[;i];x]. y}/o]]} / ray_trace T:{[m;p;q;s;o]n:#j:&0>g:h[1;;i:&~0i=l:**h:0 1_ I[m;p;q;m#'z:0i 0 0 0;s;o]]_dot u:U -1 -3 2. @[m#0.;i k;:;-g k:j@&~I_[n;p[;k]+(l[k]*/:q[;k])+h[1;;k:i j]*_sqrt 2^-42;n#'-u;&n;s;o]]} / sum rays N:{[m;n;i;j;s;o],/|+(n,n)#0{x+T[m;m#'0 0 -4.;U(i+(y%4)-.5*n),,m#n*1.;s;o]}/j} / ray tracer -> PGM R:{[k;n]"P5\n",(5:n,n),"\n255\n",_ci _.5+15.9375*N[m;n;n _vs!m:n*n;+4_vs!16]. C[k;0 -1 0.]1.} / create scene = sphere or (sphere;5-scenes) C:{[k;c;r]:[k=1;(c;r);((c;r*3);(,(c;r)),C[k-1;;r%2]'+c+-3 3[2_vs 2 3 6 7]*r%_sqrt 12)]} \t q:R[6]160 "temp.pgm"6:q \"C:\\Program Files\\IrfanView\\i_view32.exe" temp.pgm