// // Program: Cosmikaleidoscope // Author: Lucia Grossberger // Revised: 2010 May 19 // Ultra-SiMPLE Common Int xxx[1200], yyy[1200], zzz[1200], c[1200] Common Int xc, yc, index Common Float ct, st, cp, sp Float x[24], y[24], z[24] Int xm, ym, zm randomize xc=xpixels()/2; yc=ypixels()/2 move mouse (xc, yc); hide mouse ndx=0; dxa=0; dya=0; dza=0 xx=0.0; yy=0.0; zz=0.0 Do k=0,23 x[k]=0; y[k]=0; z[k]=0 Loop a=0.01; s=20 line color (0) open screen (1) Do index=0 select screen (1) cls; stars @toys read mouse (xm, ym, zm) p=(xm-xc)/250.0; t=(ym-yc)/250.0 ct=cos(t); st=sin(t) cp=cos(p); sp=sin(p) If zm dxa=dxa+0.5*s*(rand()-0.5)-a*xx dya=dya+0.5*s*(rand()-0.5)-a*yy dza=dza+0.5*s*(rand()-0.5)-a*zz r=Sqrt(dxa*dxa+dya*dya+dza*dza)+1 dxa=s*dxa/r; dya=s*dya/r; dza=s*dza/r xx=xx+dxa; yy=yy+dya; zz=zz+dza Endif x[ndx]=xx; y[ndx]=yy; z[ndx]=zz Do k=0,23 mirror (x[k], y[k], z[k], 16*k) @ Loop zsort @ display @ If (zm) ndx=(ndx+1)%24 select screen (0) bitblt screen (1) If (readkey(27)) Break Loop close screen (1); quit Task mirror (Int x, Int y, Int z, Int hue) octants (x, y, z, hue) @ octants (x, z, y, hue) @ octants (y, z, x, hue) @ octants (y, x, z, hue) @ octants (z, x, y, hue) @ octants (z, y, x, hue) @ Task octants (Int x, Int y, Int z, Int hue) project (+x, +y, +z, hue) @ project (+x, +y, -z, hue) @ project (+x, -y, +z, hue) @ project (+x, -y, -z, hue) @ project (-x, +y, +z, hue) @ project (-x, +y, -z, hue) @ project (-x, -y, +z, hue) @ project (-x, -y, -z, hue) @ Task project (Int x, Int y, Int z, Int2 hue) Common Int xxx[1200], yyy[1200], zzz[1200], c[1200] Common Int xc, yc, index Common Float ct, st, cp, sp xx=cp*x+sp*(ct*z+st*y) yy=ct*y-st*z zz=cp*(ct*z+st*y)-sp*x xxx[index]=xc+xx yyy[index]=yc-yy zzz[index]=zz c[index]=hue index=index+1 Task zsort Common Int xxx[1200], yyy[1200], zzz[1200], c[1200] Common Int xc, yc, index Do j=0, index-2 Do k=j+1, index-1 If zzz[j]<=zzz[k] Continue tt=xxx[j]; xxx[j]=xxx[k]; xxx[k]=tt tt=yyy[j]; yyy[j]=yyy[k]; yyy[k]=tt tt=zzz[j]; zzz[j]=zzz[k]; zzz[k]=tt tt=c[j]; c[j]=c[k]; c[k]=tt Loop Loop Task display Common Int xxx[1200], yyy[1200], zzz[1200], c[1200] Common Int xc, yc, index flag=1 Do k=0,index-1 If (zzz[k]>0 And flag) flag=0; nucleus @ work=rainbow(c[k]) rw=work%256; work=work/256 gw=work%256; bw=work/256 rw=(zzz[k]+500.0)/1000.0*rw gw=(zzz[k]+500.0)/1000.0*gw bw=(zzz[k]+500.0)/1000.0*bw If (rw<16) rw=16 If (rw>255) rw=255 If (gw<16) gw=16 If (gw>255) gw=255 If (bw<16) bw=16 If (bw>255) bw=255 solid color (rgb(rw,gw,bw)) filled circle (xxx[k], yyy[k], 10) Loop Task nucleus Common Int xc, yc solid color (rgb(128,0,0)) filled circle (xc, yc, 10) Float rand() Return Random(25000)/25000.0