DO SYSTEM >RAND(-1) > >LOCAL oBMP AS xfcBitmap >LOCAL oGFX AS xfcGraphics, oCan >LOCAL oBrush AS xfcLinearGradientBrush > >loFrm=NEWOBJECT("gdiform") > >#DEFINE hWidth 1200 >#DEFINE hHeight 700 >#DEFINE hPixPer1 450 > > >loFrm.SHOW(0) >READ EVENTS > > >*--------------------------------------------------- > >DEFINE CLASS gdiForm AS FORM > WIDTH=hWidth+100 > HEIGHT=hHeight+100 > BACKCOLOR=-1 > DIMENSION aPoints[41, 41] > pixelsPer1=hPixPer1 > ADD OBJECT cmd1 AS COMMANDBUTTON ; > WITH LEFT=40, TOP=3, CAPTION="flip 1" > ADD OBJECT cmd3 AS COMMANDBUTTON ; > WITH LEFT=200, TOP=3, CAPTION="redraw" > ADD OBJECT img1 AS IMAGE ; > WITH TOP=30, LEFT=50, WIDTH=hWidth, HEIGHT=hHeight > ADD OBJECT img2 AS IMAGE ; > WITH TOP=30, LEFT=50, WIDTH=hWidth, HEIGHT=hHeight > > > PROCEDURE INIT() > THIS.PopulateCursor() > > > PROCEDURE cmd3.CLICK > THISFORM.loPov.angle = THISFORM.loPov.angle + 0.1 > THISFORM.SHOW() > > PROCEDURE SHOW(tnHow) > LOCAL loPov, loPov2 >*!* LOCAL lcPng, lcPng2 >*!* lcPng=FORCEPATH(FORCEEXT(SYS(2015), "png"), GETENV("TEMP")) >*!* lcPng2=FORCEPATH(FORCEEXT(SYS(2015), "png"), GETENV("TEMP")) > IF NOT PEMSTATUS(THISFORM, "lopov",5) > loPov=CREATEOBJECT("empty") > ADDPROPERTY(loPov, "x", 12) > ADDPROPERTY(loPov, "y", 12) > ADDPROPERTY(loPov, "z", 12) > ADDPROPERTY(loPov, "angle", 0) > ADDPROPERTY(loPov, "color", 0xffff0000) > THISFORM.ADDPROPERTY("loPov", loPov) > ELSE > loPov=THISFORM.loPov > ENDIF > THIS.dodraw(THIS.img1, loPov) > loPov2=THIS.MakeDup(loPov) >* loPov2.angle = loPov2.angle + 0.05 > loPov2.x=loPov.x+0.5 > loPov2.COLOR=0xaf007f7f > THIS.dodraw(THIS.img2, loPov2) > > > > PROCEDURE dodraw(tcPng, toPOV) > LOCAL oBMP AS xfcBitmap > LOCAL oGFX AS xfcGraphics > LOCAL oBrush AS xfcLinearGradientBrush, loPen, lni, lnJ, oP1, op2 > > WITH _SCREEN.SYSTEM.Drawing > oBMP = .BITMAP.New(hWidth, hHeight) > oGFX = .Graphics.FromImage(oBMP) > oGFX.useprecision=.T. > oBrush=.SolidBrush.New(toPOV.COLOR) > loPen=.PEN.New(oBrush, 1) > > * draw the coordinates, xy plane first >*!* oBrush=.SolidBrush.New(0xff00ffff) >*!* loPen=.PEN.New(oBrush, 1) > > * x fixed > oP1=THIS.xyzToPix(make3(-1, -1, 0), toPOV) > op2=THIS.xyzToPix(make3(-1, 1, 0), toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > > oP1=THIS.xyzToPix(make3(0, -1, 0), toPOV) > op2=THIS.xyzToPix(make3(0, 1, 0), toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > > oP1=THIS.xyzToPix(make3(1, -1, 0), toPOV) > op2=THIS.xyzToPix(make3(1, 1, 0), toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > * y fixed > oP1=THIS.xyzToPix(make3(-1, -1, 0), toPOV) > op2=THIS.xyzToPix(make3(1, -1, 0), toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > > oP1=THIS.xyzToPix(make3(-1, 0, 0), toPOV) > op2=THIS.xyzToPix(make3(1, 0, 0), toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > > oP1=THIS.xyzToPix(make3(-1, 1, 0), toPOV) > op2=THIS.xyzToPix(make3(1, 1, 0), toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > > > > > FOR lni=1 TO 41 > FOR lnJ=1 TO 40 > ASSERT not (lni=20 and lnj=19) > oP1=THIS.xyzToPix(THIS.aPoints[lni, lnJ], toPOV) > op2=THIS.xyzToPix(THIS.aPoints[lni, lnJ+1], toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > ENDFOR > ENDFOR > FOR lnJ=1 TO 41 > FOR lni=1 TO 40 > oP1=THIS.xyzToPix(THIS.aPoints[lni, lnJ], toPOV) > op2=THIS.xyzToPix(THIS.aPoints[lni+1, lnJ], toPOV) > oGFX.DrawLine(loPen, oP1.x, oP1.Y, op2.x, op2.Y) > ENDFOR > ENDFOR > > oBMP.SAVE(tcPng,.Imaging.ImageFormat.png) > ENDWITH > ENDPROC > >*--------------------------------------------------- > FUNCTION MakeDup(toObj) > LOCAL loRec, lni, aMm[1] > loRec=CREATEOBJECT("empty") > FOR lni=1 TO AMEMBERS(aMm, toObj) > ADDPROPERTY(loRec, aMm[lni], GETPEM(toObj, aMm[lni])) > ENDFOR > RETURN loRec > > PROCEDURE cmd1.CLICK > THIS.PARENT.img1.VISIBLE= NOT THIS.PARENT.img1.VISIBLE > ENDPROC > >*--------------------------------------------------- > PROCEDURE DESTROY() >*-- dn 2012/06/20 > CLEAR EVENTS > >*--------------------------------------------------- > PROCEDURE xyzToPix(to3, toPOV) > LOCAL xFactor, lnTx, lnTy, lnXR, lnYR >* first parameter has 3 coordinates, 2nd also (the point of view) > lnAngle=toPOV.angle > lnCos=COS(lnAngle) > lnSin=SIN(lnAngle) >* rotate the POV around z axis > lnXR=toPOV.x*lnCos+toPOV.Y*lnSin > lnYR=toPOV.x*lnSin-toPOV.Y*lnCos > lnZR=topov.z > >* project to z=0 plane > lnSq=lnXR * lnXR + lnYR * lnYR + lnZR * lnZR > xFactor = lnSq / (lnSq - lnXR * to3.x - lnYR * to3.Y - lnZR * to3.z) > lnTx=lnXR + xFactor*(to3.x-lnXR) > lnTy=lnYR + xFactor*(to3.Y-lnYR) >* rotate by 45 degrees > lnGx=(lntx+lnty)*0.7 > lnGy=(lntx-lnty)*0.7 >* now adjust for graphics > lnPxX=hWidth/2 + (lnGx+.0)*THIS.pixelsPer1 > lnPxY=hHeight/2 + (.0-lnGy)*THIS.pixelsPer1 > o=make3(lnPxX, lnPxY, 0) > RETURN o >*--------------------------------------------------- > PROCEDURE PopulateCursor() > LOCAL lnAngle, lnCos, lnSin, lni, lnx, lnJ, lny, lnZ, lnXR, lnYR, xFactor, lnTx, lnTy >*-- dn 2012/06/22 > > FOR lni=1 TO 41 > lnx=lni/20 - 1.05 > FOR lnJ=1 TO 41 > lny=lnJ/20 - 1.05 >* calculate in absolute coordinates >*!* lnZ=.4*lnx*lnx+0.2* lny*lny+.2*x*(Y-0.3*x) >*!* lnZ=int(3*x*y-2) >* lnZ=EXP((2*lnx-.2*lnY)/(2+.1*lnx-.2*lnY)) > lnZ=-max(.5*SIN((1-2*lnx)*(2-3*lny)+lnx*lnx-lny*lny), 0) >* lnz=int(4* lnx*lnx+4*lny*lny)/4 > THIS.aPoints[lni, lnj]=make3(lnx, lny, lnZ) > ENDFOR > ENDFOR >ENDDEFINE > > >PROCEDURE make3(tnx, tny, tnz) > LOCAL o > o=CREATEOBJECT("empty") > ADDPROPERTY(o, "x",tnx) > ADDPROPERTY(o, "Y",tny) > ADDPROPERTY(o, "z",tnz) > RETURN o >