FN.DEF _printMnMx(a[]) ARRAY.MAX max,a[] : ARRAY.MIN min,a[] PRINT ROUND(min,4),ROUND(max,4) FN.END 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 cy = sy/2 GR.SET.ACCELERATION 1 isOutlineGrender = 0 stsz = 0.085 radMax = 14 *sca radMin = 8 *sca c1 = -3 c2 = 5 LIST.CREATE n,ballsOrg LIST.CREATE n,ballsTmp FOR x = -1 TO 1 STEP stsz FOR y = -1 TO 1 STEP stsz z = EXP(c1*(x^2+y^2))*COS((x^2+y^2)*c2) LIST.ADD ballsOrg, x, y, z nbb++ NEXT y NEXT x PRINT nbb DIM d[2] : d[1] = nbb : d[2] = 3 DIM balls [nbb,3], kr[nbb] DIM c1[nbb],c2[nbb],sx[nbb],sy[nbb],bl[nbb] DIM xb[nbb] , yb[nbb] , zb[nbb] DIM bl[nbb],gr[nbb], rad[nbb] LIST.CREATE n,zval LIST.CREATE n,idxlist LIST.CREATE n,ballsOrg2 LIST.ADD.LIST ballsOrg2,ballsOrg !main -------- dtDes = 90 DO PAUSE 1 lopctr++ !apply sine to z-val for oszillation-anim LIST.TOARRAY ballsOrg2, balls[] ARRAY.TO.DIMS balls[], d[], balls[] ARRAY.MAT.TRANSPOSE balls[], balls[] ARRAY.COPY balls[2*nbb+1 ,nbb], zb[] ARRAY.FILL c1[],SIN(lopctr/10) ARRAY.MATH c1[],zb[],"_*",zb[] ARRAY.COPY zb[],balls[2*nbb+1] ARRAY.MAT.TRANSPOSE balls[], balls[] LIST.CLEAR ballsOrg LIST.ADD.ARRAY ballsOrg,balls[] 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() GOSUB toScr sumtoScr += 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 "3d2d :", ROUND(sum2d3d/lopctr,1) PRINT "toScr:", ROUND(sumtoScr/lopctr,1) PRINT "rend :", ROUND(sumrend/lopctr,1) ENDIF pause max(dtDes-clock()+tic,1):tic=clock() UNTIL 0 !--------------- !--------------- _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[],4000*sca 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[],4000*sca 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[] ! darker if further away (z) ARRAY.MIN mn, zb[] ARRAY.MAX mx, zb[] ARRAY.FILL c1[],mn ARRAY.FILL c2[],mx ARRAY.MATH c2[],c1[],"_-",c1[] ARRAY.FILL c2[],200 ARRAY.MATH c2[],c1[],"_/",c1[] ARRAY.FILL c2[],mn ARRAY.MATH zb[],c2[],"_-",c2[] ARRAY.MATH c2[],c1[],"_*",gr[] ARRAY.FILL c2[],55 ARRAY.MATH gr[],c2[],"_+",gr[] ARRAY.FILL c2[],2 ARRAY.MATH gr[],c2[],"_/",bl[] !circle, smaler if further away (z) ARRAY.FILL c1[],mn ARRAY.FILL c2[],mx ARRAY.MATH c2[],c1[],"_-",c1[] ARRAY.FILL c2[],radMax-radmin ARRAY.MATH c2[],c1[],"_/",c1[] ARRAY.FILL c2[],mn ARRAY.MATH zb[],c2[],"_-",c2[] ARRAY.MATH c2[],c1[],"_*",rad[] ARRAY.FILL c2[],radMin ARRAY.MATH rad[],c2[],"_+",rad[] RETURN !--------------- !--------------- toScr: GR.CLS FOR i = 1 TO nbb GR.COLOR 255, 0, gr[i],bl[i],1 GR.CIRCLE kr , sx[i], sy[i], rad[i] NEXT i RETURN !--------------- !--------------- Rotate2: a += 1.5 b += 1.5 c = 10 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 !---------------