#!/bin/sh awk ' # adopted from http://users.tkk.fi/~jjsalon2/reddit/raytrace.html function fix(a) { if (a < 0) a = 0 if (a > 255) a = 255 return int(a) } function doframe() { A = sin(t*.8)*8; C = sin(t)*8; D = sin(t*.7)*8; for(y=-w; y<=w; y++) for(x=-w; x<=w; x++){ c = z = -7; G = x-A; H = y-A; J = x-C; K = y-D; for(i=0; i++<4; z-=p/Z){ u=G*G+H*H+z*z; v=J*J+K*K+z*z; U=u*u/2; V=v*v/2; X=G/U+J/V; Y=H/U+K/V; Z=z/U+z/V; p=.02-1/u-1/v } if(p < 3e-4){ h=(X*D+Y*C-Z*13)/sqrt(X*X+Y*Y+Z*Z); c=int(w+(h>0 ? h*h : 0)) } printf "color #%02x%02x%02x\n", fix(c-99), fix(c), fix(2*c) print "fillrect", x/w, y/w, "-", (x+1)/w, (y+1)/w } } BEGIN { w = 20 t = 70 print "bg black" for(t=70; ; t+=.2) { print "frame" doframe() print "flush" print "sleep 0.04" } } '