GR.OPEN 255, 5,40,50,0,1 GR.SET.ACCELERATION 1 GR.SCREEN sx,sy : PRINT sx,sy refx = 1536 refy = 2048 cx = refx/2 cy = refy/2 sca = sx/refx GR.SCALE sca,sca GR.COLOR 255,255,255,155,1 !convolutionalFilter --------- ARRAY.LOAD convMat[],~ 1,1,1 ,~ 1,0,1 ,~ 1,1,1 BUNDLE.PUT filtConv, "_Filter", "_UseConvolutionMatrix" BUNDLE.PUT filtConv, "_ConvolutionMatrix", convMat[] BUNDLE.PUT filtConv, "_ColorSpace", "RGB_565" !=============================== fieldSz = 90 !=============================== fiSca = 1200/fieldSz fiSzSca = fieldSz*fiSca fieldSz2 = fieldSz*fieldSz ARRAY.LOAD dims[], fieldSz, fieldSz DIM field[fieldSz2], tmp[fieldSz2] DIM _3[fieldSz2], _2[fieldSz2], _0[fieldSz2] DIM _255[fieldSz2], _xxx[fieldSz2] ARRAY.FILL _0[],0 ARRAY.FILL _2[],2 ARRAY.FILL _3[],3 ARRAY.FILL _255[],255 ARRAY.TO.DIMS _255[], dims[],_255[] ARRAY.RND field[],fieldSz2 ARRAY.FILL tmp[], 0.5 ARRAY.MATH field[], tmp[], "_>=", field[] ARRAY.TO.DIMS field[], dims[], field[] ARRAY.MATH field[], _255[], "_*", fiBmp[] GR.BITMAP.SET.PIXARR fiBmp , _255[],fiBmp[],fiBmp[],fiBmp[] ds=fiSca-1 FOR i= 0 TO fieldSz-1 x= cx-fiSzSca/2+i*fiSca FOR j=0 TO fieldSz-1 y= cy-fiSzSca/2+j*fiSca GR.RECT nn,x,y,x+ds,y+ds NEXT NEXT LIST.CREATE n,dl LIST.CREATE n,idxList GR.BITMAP.SCALE fieldSca,fiBmp, fiSzSca,fiSzSca GR.BITMAP.DRAW fieldSca_,fieldSca, cx-fiSzSca/2,cy-fiSzSca/2 GR.GETDL dlFull[] ARRAY.LENGTH leDlFull,dlFull[] PRINT le DIM dlBmp[1] dlBmp[1] = dlFull[leDlFull] !GR.NEWDL dlBmp[] dataToScreen = 2 DEBUG.ON DO !count the neighbours -------- GR.BITMAP.SET.PIXARR field , _255[],field[],_0[],_0[] GR.BITMAP.FILTER filtOut , field, filtConv GR.BITMAP.GET.PIXARR filtOut , aa[],count[],gg[],bb[] !apply conways rules (...the original 23/3) ------ ARRAY.MATH count[], _3[] , "_=" , z3[] ARRAY.MATH count[], _2[] , "_=" , z2[] ARRAY.MATH field[], z2[] , "_*" , z2[] ARRAY.MATH z3[], z2[] , "_+" , field[] !stats ------ ARRAY.SUM sum, field[] cntActiveCells += sum tic=CLOCK() GOSUB dataToScreen, dataToScreen_1,dataToScreen_2 toc +=CLOCK()-tic : ctr++ IF ctr=20 THEN mspf = toc/ctr PRINT "---" PRINT "dataToScreenMethod: " ; int$(dataToScreen) print "avgActiveCells: "; cntActiveCells/ctr PRINT "avgMsPerFrame: "; mspf ctr=0 : toc=0 : cntActiveCells=0 IF ++dataToScreen >2 THEN dataToScreen=1:GR.NEWDL dlBmp[] ENDIF UNTIL0 END dataToScreen_1: ARRAY.MATH field[], _255[], "_*", fiBmp[] GR.BITMAP.SET.PIXARR fiBmp , _255[],_0[],fiBmp[],fiBmp[] GR.BITMAP.SCALE fieldSca,fiBmp, fiSzSca,fiSzSca GR.RENDER RETURN dataToScreen_2: ARRAY.SEARCH field[],1, pos_1st_1 LIST.CLEAR dl LIST.ADD.ARRAY dl, field[] LIST.SORT.BY idxList, , dl LIST.TOARRAY idxList, idx[] ARRAY.SEARCH idx[],pos_1st_1 , idx_1st_1 DIM dl[fieldSz2-idx_1st_1+1] ARRAY.COPY idx[idx_1st_1], dl[] GR.NEWDL dl[] GR.RENDER RETURN