REM Stardance 2.0c Coloured/scaleable 18/01/2003 REM by R.G.Weston REM After A.K. Dewdney, Sci.Am. Vol. 254(No.1)Page6 January 1986 MODE8:OFF *FLOAT64 REM 15 sig fig accuracy ORIGIN 640,512 COLOUR8,10 N=9:DIM vxs(N),vys(N),vzs(N),xs(N),ys(N),zs(N),ax(N),ay(N),az(N),vx(N),vy(N),vz(N),x(N),y(N),z(N) PRINTTAB(15,5)"Star Dance - Stars Moving under Gravity" PRINTTAB(7,10)"Press Space Bar to set off and when you want to go again" G=GET:CLS stop=0 REPEAT sf=1 :REM scale factor for plotting to screen offscreen=FALSE N=1+RND(8) R=RND(TIME) PROCrandom_setup PROCcopy_setup TIME=0 REPEAT FOR i=1 TO N ax(i)=0:ay(i)=0:az(i)=0 FOR j= 1 TO N PROCforce_acc(i,j) NEXT j NEXT i FOR i= 1 TO N PROCvel(i) NEXT i FOR i=1 TO N PROCnewpos(i) PROCdisplay NEXT i PRINTTAB(1,3);0.1*INT(TIME/10);" secs" UNTIL stop=32 CLS UNTIL FALSE : END : DEF PROCforce_acc(i,j) IF i=j THEN ENDPROC dsq=(x(i)-x(j))^2+(y(i)-y(j))^2 + (z(i)-z(j))^2 IF dsq=0 THEN PRINTTAB(0,0)"COLLISION!!":ENDPROC d=SQR(dsq) F=10000/dsq ax(i)=ax(i)+F*(x(j)-x(i))/d ay(i)=ay(i)+F*(y(j)-y(i))/d az(i)=az(i)+F*(z(j)-z(i))/d ENDPROC : DEF PROCvel(i) vx(i)=vx(i)+ax(i) vy(i)=vy(i)+ay(i) vz(i)=vz(i)+az(i) ENDPROC : DEF PROCnewpos(i) x(i)=x(i)+vx(i) y(i)=y(i)+vy(i) z(i)=z(i)+vz(i) ENDPROC : DEF PROCrandom_setup FOR i=1 TO N vxs(i)=(-1)^(RND(2))*RND(300)/100 vys(i)=(-1)^(RND(2))*RND(300)/100 vzs(i)=(-1)^(RND(2))*RND(300)/100 : xs(i)=(-1)^(RND(2))*RND(400) ys(i)=(-1)^(RND(2))*RND(400) zs(i)=(-1)^(RND(2))*RND(400) NEXT i ENDPROC : DEF PROCcopy_setup FORi=1 TO N vx(i)=vxs(i) vy(i)=vys(i) vz(i)=vzs(i) : x(i)=xs(i) y(i)=ys(i) z(i)=zs(i) NEXTi ENDPROC : DEF PROCdisplay REMIF i=1 THEN score=0 :REM resets score to zero PRINTTAB(1,1);N;" stars" PRINTTAB(1,28)"scale factor = ";(INT((1000*sf)+0.5))/1000 PRINTTAB(1,29)"Press the Down Arrow key to rescale" PRINTTAB(1,30)"Press the Left Arrow key to repeat" PRINTTAB(45,30)"Hold down Space Bar to restart" GCOL0,i stop=INKEY(0) IF stop=138 THEN REM 138 detects the "down" arrow key sf=sf*0.75 PROCcopy_setup PROCpause(0.5) CLS ENDIF IF stop=136 THEN REM 136 detects the left arrow key PROCcopy_setup PROCpause(0.5) CLS ENDIF PLOT69,sf*x(i),sf*y(i) ENDPROC : DEF PROCpause(s):delay=INKEY(s*100):ENDPROC