! 3D Animated Balls GR.OPEN 255,0,0,0, 0, 1 GR.SCREEN sx,sy refx = 1536 refy = 2048 sca = MAX(sx/refx,sy/refy) GR.SCALE sca,sca cx = sx/2 % center_screenwidth cy = sy/2 % center_screenheight GR.SET.ACCELERATION 1 isOutlineGrender = 0 nb = 7 nbb = nb^3 PRINT nb,nb^3 DIM d[2] : d[1] = nbb : d[2] = 3 DIM balls [nbb,3], kr[nbb] DIM c1[nbb],c2[nbb],sx[nbb],sy[nbb] DIM xb[nbb] , yb[nbb] , zb[nbb] , gr[nbb], rad[nbb] LIST.CREATE n,zval LIST.CREATE n,idxlist LIST.CREATE n,ballsOrg LIST.CREATE n,ballsTmp GR.COLOR 150,0,255, 155,1 FOR x = 0 TO nb-1 FOR y = 0 TO nb-1 FOR z = 0 TO nb-1 LIST.ADD ballsOrg, x-nb/2, y-nb/2, z-nb/2 GR.CIRCLE kr[++cc],0,0,0 NEXT z NEXT y NEXT x dphi = 3 dphiA = dphi *1 dphiB = dphi *0 dphiC = dphi *1 !main -------- DO lopctr++ tt = CLOCK() GOSUB Rotate2 sumrotate += CLOCK()-tt tt = CLOCK() GOSUB sort_z2 sumsort += CLOCK()-tt tt = CLOCK() GOSUB _3d_to_2d sum2d3d += CLOCK()-tt tt = CLOCK() IF !isOutlineGrender THEN GR.RENDER sumrend += CLOCK()-tt IF !MOD(lopctr,10) PRINT "---" PRINT lopctr PRINT "rota :", ROUND(sumrotate/lopctr,1) PRINT "sort :", ROUND(sumsort/lopctr,1) PRINT "2d3d :", ROUND(sum2d3d/lopctr,1) PRINT "rend :", ROUND(sumrend/lopctr,1) ENDIF UNTIL 0 !--------------- !--------------- Rotate2: a += dphiA b += dphiB c += dphiC LIST.CLEAR ballsTmp LIST.ADD.LIST ballsTmp, ballsOrg LIST.MAP.3D ballsTmp, ~ ,,,~ a , b , c , ~ ,,,~ ,,,~ ,, LIST.TOARRAY ballsTmp, balls[] ARRAY.TO.DIMS balls[], d[], balls[] RETURN !--------------- !--------------- sort_z2: ARRAY.MAT.TRANSPOSE balls[], balls[] ARRAY.COPY balls[2*nbb+1 ,nbb], zb[] ARRAY.MAT.TRANSPOSE balls[], balls[] ARRAY.COPY balls[], copyBalls[] LIST.CLEAR zval LIST.ADD.ARRAY zval, zb[] LIST.SORT.BY idxList, , zval LIST.TOARRAY idxList, idx[] FOR i = 0 TO nbb-1 ARRAY.COPY copyBalls[idx[i+1]*3-2,3],balls[i*3+1] NEXT RETURN !--------------- !--------------- _3d_to_2d: ARRAY.MAT.TRANSPOSE balls[], balls[] ARRAY.COPY balls[ 1 ,nbb], xb[] ARRAY.COPY balls[ nbb+1 ,nbb], yb[] ARRAY.COPY balls[2*nbb+1 ,nbb], zb[] ARRAY.MAT.TRANSPOSE balls[], balls[] ARRAY.FILL c1[],600 ARRAY.MATH c1[],xb[],"_*",c1[] ARRAY.FILL c2[],8 ARRAY.MATH zb[],c2[],"_-",c2[] ARRAY.MATH c1[],c2[],"_/",c1[] ARRAY.FILL c2[],cx ARRAY.MATH c1[],c2[],"_+",sx[] ARRAY.FILL c1[],600 ARRAY.MATH c1[],yb[],"_*",c1[] ARRAY.FILL c2[],8 ARRAY.MATH zb[],c2[],"_-",c2[] ARRAY.MATH c1[],c2[],"_/",c1[] ARRAY.FILL c2[],cy ARRAY.MATH c1[],c2[],"_+",sy[] !green, darker if further away (z) ARRAY.FILL c1[],2 ARRAY.MATH c1[],zb[],"_+",c1[] ARRAY.FILL c2[],40 ARRAY.MATH c1[],c2[],"_*",gr[] ARRAY.FILL c2[],255 ARRAY.MATH c2[],gr[],"_min",gr[] !circle, smaler if further away (z) ARRAY.FILL c1[],8 ARRAY.MATH c1[],zb[],"_*",c1[] ARRAY.FILL c2[],10 ARRAY.MATH c1[],c2[],"_+",rad[] !GR.CLS GR.COLOR 150,0,255, 155,1 FOR i = 1 TO nbb !GR.COLOR gr[i],0,255, gr[i] !GR.CIRCLE kr, sx[i], sy[i], rad[i] GR.MODIFY kr[i], "x", sx[i], "y", sy[i], "radius" , rad[i] NEXT i RETURN !---------------