// Press the Space Bar to start/stop expansion of the cubes. // Left mouse button initiates manual mode; right button resets // to auto-expansion mode. Int x, y, z Float size[]={0,20,40,60,80,100,120} Float dsize[]={0.0,0.25,0.5,0.75,1.0,1.25,1.5} graphon; move mouse (320, 240) r=100.0; auto=1; moving=0; ang1=4.0; ang2=5.0 Do key=read key() If key=27 Call quit If key=32 Set moving=1-moving read mouse (x, y, z) If z=1 Set auto=0 If z=2 Do k=1,6 size[k]=0 Loop ang1=0.0; ang2=0.0; auto=1; moving=1 Endif If auto ang1=ang1+0.0271; If ang1>6.2832 Set ang1=ang1-6.2832 ang2=ang2+0.0379; If ang2>6.2832 Set ang2=ang2-6.2832 x=1.5*r*cos(ang1)+320; y=r*sin(ang2)+240 move mouse (x, y) Endif theta=(y-240)/180.0; phi=(x-320)/240.0 unit cube (theta, phi) @ ndx=0 Do k=1,6 project (size[k], 750.0, ndx, k) @ If moving size[k]=size[k]+dsize[k] If size[k]<0 Or size[k]>150 Set dsize[k]=-dsize[k] Endif Loop k sort @ draw (ndx) @ delay (29) Loop //--------------------------------------------------------------------------- Task draw (Int num) Common Float ax[72], ay[72], bx[72], by[72] Common Int light[72] cls Do k=0,num-1 line color (light[k]) line (ax[k]+320, 240-ay[k], bx[k]+320, 240-by[k]) Loop End draw //--------------------------------------------------------------------------- Task project (Float size, Float dist, Int ndx, Int color) Common Int a[]={0,1,2,3,4,5,6,7,0,1,2,3} Common Int b[]={1,3,0,2,5,7,4,6,4,5,6,7} Common Int c[]={2,2,2,2,0,0,0,0,1,1,1,1} Common Float xxx[8], yyy[8], zzz[8] Common Float ax[72], ay[72], bx[72], by[72], prox[72] Common Int light[72] f=dist*size Do k=0,11 scale=f/(dist-size*zzz[a[k]]) ax[ndx]=scale*xxx[a[k]] ay[ndx]=scale*yyy[a[k]] scale=f/(dist-size*zzz[b[k]]) bx[ndx]=scale*xxx[b[k]] by[ndx]=scale*yyy[b[k]] prox[ndx]=size*(zzz[a[k]]+zzz[b[k]]) If c[k]=0 Set light[ndx]=8 If c[k]=1 Set light[ndx]=color If c[k]=2 Set light[ndx]=color+8 ndx=ndx+1 Loop End project //--------------------------------------------------------------------------- Task unit cube (Float theta, Float phi) Common Int xhat[]={-1,+1,-1,+1,-1,+1,-1,+1} Common Int yhat[]={+1,+1,-1,-1,+1,+1,-1,-1} Common Int zhat[]={+1,+1,+1,+1,-1,-1,-1,-1} Common Float xxx[8], yyy[8], zzz[8] ct=cos(theta); st=sin(theta) cp=cos(phi); sp=sin(phi) Do k=0,7 xxx[k]=cp*xhat[k]+sp*(ct*zhat[k]+st*yhat[k]) yyy[k]=ct*yhat[k]-st*zhat[k] zzz[k]=cp*(ct*zhat[k]+st*yhat[k])-sp*xhat[k] Loop End unit cube //--------------------------------------------------------------------------- Task sort Common Float ax[72], ay[72], bx[72], by[72], prox[72] Common Int light[72] Do j=1,71 Do k=1,71 If prox[k-1]<=prox[k] Continue t=ax[k-1]; ax[k-1]=ax[k]; ax[k]=t t=ay[k-1]; ay[k-1]=ay[k]; ay[k]=t t=bx[k-1]; bx[k-1]=bx[k]; bx[k]=t t=by[k-1]; by[k-1]=by[k]; by[k]=t t=prox[k-1]; prox[k-1]=prox[k]; prox[k]=t tt=light[k-1]; light[k-1]=light[k]; light[k]=tt Loop Loop End sort