# Coordinate Calculations (Volume, Distance, and more!) [in 3d]

## Recommended Posts

Hello, I originally started writing these functions in autoit, because of how easy it was to debug my code (the algorithms are actually implemented in php, though the same functionality could be used without conversion by using aucgi).

My original intended purpose for these functions was to allow my web server to calculate if a player was between two points(inside a "region") in a game(minecraft).

Currently my functions can do the following:

• Calculate the absolute distance between two points
• Calculate the volume between two points(to the nearest whole number)
• Calculate all points between two points, including their volume(to the nearest whole numbers)
• Check is a point is between two points(to the nearest whole number)
• ​(Maybe more I haven't though of?)

I then expanded on the code to add some additional functionality. This code could be used with little modification to create a voxel style game engine. (It could actually even be further modified to support decimal values, though this would significantly slow it's performance exponentially per decimal place, though this shouldn't be necessary, except in rare cases such precision collision detection[ex: detect if a bullet hit a player or npc])

I encourage everyone to submit your modifications/optimizations to my code so everyone can use them. I know my code isn't perfect, and it's functions could be expanded on with the right knowledge(things like collision detection, world generation, etc).

So finally here's the code(including examples of all functions being used):

voxel.au3

Edited by nullschritt
##### Share on other sites
Known Bugs:
• Second set of coordinates cannot = 0,0,0
• -> (Fixed by conditionally swapping values)
• Quick count does not accuratley return the volume.
Edited by nullschritt

## Create an account

Register a new account

• ### Similar Content

i tried to create a function that read a folder files to 3d array
e.g
\$array[n][0][0] = ctName
\$array[n][0][1] = ctFilePath
\$array[n][0][2] = crtsections number
\$array[n][m][0] = KeyName
\$array[n][m][1] = KeyVal
\$array[n][m][2] = keySectionName

that the array
when i put one file into the folder all things work fine
but when i put more than one file
the last file worked fine but the others only the first key is showing
please can you help me to correct this problem
here is the example with the folder

array3d.zip

• Hello, it has been a long time since I have posted here
I am working on an AutoIt project where I need to enable to user to interactively choose any point or coordinate on the screen... something like a big overlay where the user can click anywhere on the screen to select that point. @UEZ's screenshot tool may have something similar to what I need:
I just checked the source code for the tool and I see that the Mark_Area function has a part in selecting the area to screenshot, I tried to figure out how it works but it is simply too complex and long...
So I was wondering if there were any examples of interactively selecting points on a screen? Maybe an UDF that I can just use in my script to make the whole thing a matter of adding few lines
Thank you for the replies in advance!

• Afternoon!
This is my first post, so I apologize if this is in the wrong place.
I've created a while loop to click in a certain area of an application, and have the y axis change at the end of each loop. My loop continues to click at x:27, x:10, even though the \$y is adding 15 at the end of each loop. I did a Send(\$x) and Send(\$y) into a Notepad to see if the \$y had changed after each loop, and the 15 was being added to \$y each loop. (If this makes sense)

I'm unsure where I'm going wrong, and would be extremely grateful if someone can point me in the correct direction to fix this.
Local \$rDirectory = "H:\oDemandProject\fList.txt" Local \$rLine = _FileCountLines(\$rDirectory) Local \$x = 27 Local \$y = 10 While \$rline > 0 WinActivate("OnDemand", "-> 1") WinWaitActive("OnDemand", "-> 1") ControlClick("OnDemand", "", "[CLASS:AfxFrameOrView120u; INSTANCE:1]", "left", 4, \$x, \$y) \$y += 15 \$rLine -= 1 WEnd
• By Gianni
just for further fun Here is a Javascript version of the nice 3D sine wave posted from @UEZ
This version uses this nice javascript library:(http://visjs.org/graph3d_examples.html).  (All the 'dirty' work is done by the javascript library, so the whole credit goes of course to that library and not to me...) I've simply injected all the html/javascript stuff into a BrowserControl embedded into an AutoIt GUI.
Have fun
• By UEZ
As requested by @Lakes here:
GDI and GDI+ versions of 3D Sinus Wave. GDI ≠ GDI+!

GDI:
;coded by UEZ build 2017-01-18 #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico") #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #include <GuiConstantsEx.au3> #include <WinAPIGdi.au3> #include <WindowsConstants.au3> Global \$__f1, \$__f2, \$__f3, \$__fY0, \$__fZ0, \$__fX1, \$__fY1 Global \$hGUI, \$iFPS = 0, \$iShowFPS = 0, \$bExit, \$fZoom = 5.0 Global Const \$iW = @DesktopWidth * 0.75, \$iH = @DesktopHeight * 0.75, \$iWh = \$iW / 2, \$iHh = \$iH / 2, \$sTitle = "GDI+ 3D Sinus Wave v1.1 coded by UEZ / FPS: " Global Const \$fPi = ACos(-1), \$fRad = \$fPi / 180, \$fDeg = 180 / \$fPi, \$fPi2 = ACos(-1) * 2 AutoItSetOption("GUIOnEventMode", 1) GDIPlus_3DSinusWave() AutoItSetOption("GUIOnEventMode", 0) Func GDIPlus_3DSinusWave() \$bExit = False \$hGUI = GUICreate(\$sTitle, \$iW, \$iH) ;, 0, 0, \$WS_POPUP) GUISetState(@SW_SHOW, \$hGUI) ;~ GUISetCursor(16, 1) ;create canvas elements Local Const \$hDC = _WinAPI_GetDC(\$hGUI) Local Const \$hBitmapGDI = _WinAPI_CreateCompatibleBitmap(\$hDC, \$iW, \$iH) Local Const \$hGfxDC = _WinAPI_CreateCompatibleDC(\$hDC) Local Const \$hObjOld = _WinAPI_SelectObject(\$hGfxDC, \$hBitmapGDI) Local Const \$hPen = _WinAPI_GetStockObject(\$DC_PEN) Local Const \$hPen_Old = _WinAPI_SelectObject(\$hGfxDC, \$hPen) _WinAPI_SetStretchBltMode(\$hDC, \$HALFTONE) \$iFPS = 0 Local Const \$fEuler = 2.7182818284 Local \$fSpace = 6, \$iPoints = 16, \$fSpace2 = \$fSpace / 2, \$iPoints2 = \$iPoints / 2 Local \$fRotX = Random(-360, 360), \$fRotY = Random(-360, 360), \$fRotZ = Random(-360, 360), \$fPower = 20.0 Local \$fRx = Random(-1.5, 1,5), \$fRy = Random(-1.5, 1,5), \$fRz = Random(-1.5, 1,5) Local \$c = 0, \$t = 0, \$aCoords[\$iPoints ^ 2][3] Local \$i, \$j, \$x, \$y, \$z, \$x1, \$y1, \$z1, \$x2, \$y2, \$z2, \$x3, \$y3, \$z3, \$fDistance, \$r, \$g, \$b Local \$hDLL_gdi32 = DllOpen("gdi32.dll") Local \$tLOGBRUSH = DllStructCreate(\$tagLOGBRUSH) GUISetOnEvent(\$GUI_EVENT_CLOSE, "_Exit_About") GUIRegisterMsg(\$WM_MOUSEWHEEL, "WM_MOUSEWHEEL") AdlibRegister("CalcFPS", 1000) Do _WinAPI_BitBlt(\$hGfxDC, 0, 0, \$iW, \$iH, \$hGfxDC, 0, 0, \$WHITENESS) ;erase canvas background \$c = 0 For \$i = 0 To \$iPoints - 1 For \$j = 0 To \$iPoints - 1 \$aCoords[\$c][0] = \$fSpace * \$i + \$fSpace2 - \$fSpace * \$iPoints2 \$aCoords[\$c][1] = \$fSpace * \$j + \$fSpace2 - \$fSpace * \$iPoints2 \$fDistance = Dist(0, 0, \$aCoords[\$c][0], \$aCoords[\$c][1]) \$aCoords[\$c][2] = \$fEuler ^ (-\$fDistance / 50) * Sin((\$fDistance / 10) - \$t) * \$fPower \$c += 1 \$t += 0.00075 Next Next For \$i = 0 To \$iPoints - 2 For \$j = 0 To \$iPoints - 2 \$r = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][0] * 2) \$g = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][1] * 2) \$b = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][2] * 2) DllCall(\$hDLL_gdi32, "dword", "SetDCPenColor", "handle", \$hGfxDC, "dword", BitShift(\$b, -16) + BitShift(\$g, -8) + \$r) _3Dto2D(\$aCoords[\$j + \$iPoints * \$i][0], \$aCoords[\$j + \$iPoints * \$i][1], \$aCoords[\$j + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x1, \$y1, \$z1) _3Dto2D(\$aCoords[\$j + \$iPoints * (\$i + 1)][0], \$aCoords[\$j + \$iPoints * (\$i + 1)][1], \$aCoords[\$j + \$iPoints * (\$i + 1)][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$hDLL_gdi32, "bool", "MoveToEx", "handle", \$hGfxDC, "int", \$iWh + \$x1 * \$fZoom, "int", \$iHh + \$y1 * \$fZoom, "ptr", 0) DllCall(\$hDLL_gdi32, "bool", "LineTo", "handle", \$hGfxDC, "int", \$iWh + \$x2 * \$fZoom, "int", \$iHh + \$y2 * \$fZoom) _3Dto2D(\$aCoords[(\$j + 1) + \$iPoints * \$i][0], \$aCoords[(\$j + 1) + \$iPoints * \$i][1], \$aCoords[(\$j + 1) + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$hDLL_gdi32, "bool", "MoveToEx", "handle", \$hGfxDC, "int", \$iWh + \$x1 * \$fZoom, "int", \$iHh + \$y1 * \$fZoom, "ptr", 0) DllCall(\$hDLL_gdi32, "bool", "LineTo", "handle", \$hGfxDC, "int", \$iWh + \$x2 * \$fZoom, "int", \$iHh + \$y2 * \$fZoom) Next Next For \$i = 0 To \$iPoints - 2 \$r = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][0] * 2) \$g = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][1] * 2) \$b = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][2] * 2) DllCall(\$hDLL_gdi32, "dword", "SetDCPenColor", "handle", \$hGfxDC, "dword", BitShift(\$b, -16) + BitShift(\$g, -8) + \$r) _3Dto2D(\$aCoords[\$j + \$iPoints * \$i][0], \$aCoords[\$j + \$iPoints * \$i][1], \$aCoords[\$j + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x1, \$y1, \$z1) _3Dto2D(\$aCoords[\$j + \$iPoints * (\$i + 1)][0], \$aCoords[\$j + \$iPoints * (\$i + 1)][1], \$aCoords[\$j + \$iPoints * (\$i + 1)][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$hDLL_gdi32, "bool", "MoveToEx", "handle", \$hGfxDC, "int", \$iWh + \$x1 * \$fZoom, "int", \$iHh + \$y1 * \$fZoom, "ptr", 0) DllCall(\$hDLL_gdi32, "bool", "LineTo", "handle", \$hGfxDC, "int", \$iWh + \$x2 * \$fZoom, "int", \$iHh + \$y2 * \$fZoom) Next For \$j = 0 To \$iPoints - 2 \$r = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][0] * 2) \$g = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][1] * 2) \$b = Int(0x80 + \$aCoords[\$j + \$iPoints * \$i][2] * 2) DllCall(\$hDLL_gdi32, "dword", "SetDCPenColor", "handle", \$hGfxDC, "dword", BitShift(\$b, -16) + BitShift(\$g, -8) + \$r) _3Dto2D(\$aCoords[\$j + \$iPoints * \$i][0], \$aCoords[\$j + \$iPoints * \$i][1], \$aCoords[\$j + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x1, \$y1, \$z1) _3Dto2D(\$aCoords[(\$j + 1) + \$iPoints * \$i][0], \$aCoords[(\$j + 1) + \$iPoints * \$i][1], \$aCoords[(\$j + 1) + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$hDLL_gdi32, "bool", "MoveToEx", "handle", \$hGfxDC, "int", \$iWh + \$x1 * \$fZoom, "int", \$iHh + \$y1 * \$fZoom, "ptr", 0) DllCall(\$hDLL_gdi32, "bool", "LineTo", "handle", \$hGfxDC, "int", \$iWh + \$x2 * \$fZoom, "int", \$iHh + \$y2 * \$fZoom) Next \$fRotX += \$fRx \$fRotY += \$fRy \$fRotZ += \$fRz _WinAPI_BitBlt(\$hDC, 0, 0, \$iW, \$iH, \$hGfxDC, 0, 0, \$SRCCOPY) ;blit drawn bitmap to GUI \$iFPS += 1 If \$bExit Then ExitLoop Until Not Sleep(10) GUIRegisterMsg(\$WM_MOUSEWHEEL, "") AdlibUnRegister("CalcFPS") ;release resources _WinAPI_SelectObject(\$hGfxDC, \$hPen_Old) _WinAPI_DeleteObject(\$hPen) _WinAPI_SelectObject(\$hGfxDC, \$hObjOld) _WinAPI_ReleaseDC(\$hGUI, \$hDC) _WinAPI_DeleteDC(\$hGfxDC) _WinAPI_DeleteObject(\$hBitmapGDI) GUIDelete(\$hGUI) DllClose(\$hDLL_gdi32) EndFunc ;==>GDIPlus_3DSinusWave Func WM_MOUSEWHEEL(\$hGUI, \$iMsg, \$wParam, \$lParam) Local \$wheel_Dir = _WinAPI_HiWord(\$wParam) If \$wheel_Dir > 0 Then \$fZoom += 0.25 \$fZoom = \$fZoom > 20 ? 20 : \$fZoom Else \$fZoom -= 0.25 \$fZoom = \$fZoom < 0.25 ? 0.25 : \$fZoom EndIf Return "GUI_RUNDEFMSG" EndFunc ;==>WM_MOUSEWHEEL Func Dist(\$x1, \$y1, \$x2, \$y2) Return Sqrt((\$x1 - \$x2) * (\$x1 - \$x2) + (\$y1 - \$y2) * (\$y1 - \$y2)) EndFunc ;==>Dist Func _3Dto2D(\$fX, \$fY, \$fZ, \$fRotX, \$fRotY, \$fRotZ, ByRef \$__fXPos, ByRef \$__fYPos, ByRef \$__fZPos) ;apply the x-axis rotation to transform coordinates (\$fX, \$fY, \$fZ) into coordinates (\$fX0, \$fY0, \$fZ0) \$__f1 = \$fRotX * \$fRad \$__f2 = Cos(\$__f1) \$__f3 = Sin(\$__f1) \$__fY0 = \$fY * \$__f2 + \$fZ * \$__f3 \$__fZ0 = \$fZ * \$__f2 - \$fY * \$__f3 ;apply the y-axis rotation to (\$fX0, \$__fY0, \$fZ0) to obtain (\$__fX1, \$__fY1, \$fZ1) \$__f1 = \$fRotY * \$fRad \$__f2 = Cos(\$__f1) \$__f3 = Sin(\$__f1) \$__fX1 = \$fX * \$__f2 - \$__fZ0 * \$__f3 \$__fY1 = \$__fY0 ;~ \$__fZ1 = \$__fZ0 * \$__f2 + \$fX * \$__f2 ;finally, apply the z-axis rotation to obtain the point (\$fXPos, \$fYPos) \$__f1 = \$fRotZ * \$fRad \$__f2 = Cos(\$__f1) \$__f3 = Sin(\$__f1) \$__fXPos = \$__fX1 * \$__f2 + \$__fY1 * \$__f3 \$__fYPos = \$__fY1 * \$__f2 - \$__fX1 * \$__f3 \$__fZPos = \$__fZ0 EndFunc ;==>_3Dto2D Func _Exit_About() \$bExit = True EndFunc ;==>_Exit_About Func CalcFPS() ;display FPS \$iShowFPS = \$iFPS \$iFPS = 0 WinSetTitle(\$hGUI, "", \$sTitle & \$iShowFPS) EndFunc ;==>CalcFPS
GDI+
;coded by UEZ build 2017-01-17 #pragma compile(Icon, "c:\Program Files (x86)\AutoIt3\Icons\au3.ico") #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/so /pe /rm #AutoIt3Wrapper_Run_After=del /f /q "%scriptdir%\%scriptfile%_stripped.au3" #include <GDIPlus.au3> #include <GuiConstantsEx.au3> #include <WindowsConstants.au3> _GDIPlus_Startup() Global \$__f1, \$__f2, \$__f3, \$__fY0, \$__fZ0, \$__fX1, \$__fY1 Global \$hGUI, \$iFPS = 0, \$iShowFPS = 0, \$bExit Global Const \$iW = @DesktopWidth * 0.75, \$iH = @DesktopHeight * 0.75, \$iWh = \$iW / 2, \$iHh = \$iH / 2, \$sTitle = "GDI+ 3D Sinus Wave v1.0 coded by UEZ" Global Const \$fPi = ACos(-1), \$fRad = \$fPi / 180, \$fDeg = 180 / \$fPi, \$fPi2 = ACos(-1) * 2 AutoItSetOption("GUIOnEventMode", 1) GDIPlus_3DSinusWave() AutoItSetOption("GUIOnEventMode", 0) _GDIPlus_Shutdown() Func GDIPlus_3DSinusWave() \$bExit = False \$hGUI = GUICreate(\$sTitle, \$iW, \$iH) ;, 0, 0, \$WS_POPUP) GUISetState(@SW_SHOW, \$hGUI) ;~ GUISetCursor(16, 1) ;create canvas elements Local Const \$hDC = _WinAPI_GetDC(\$hGUI) Local Const \$hHBitmap = _WinAPI_CreateCompatibleBitmap(\$hDC, \$iW, \$iH) Local Const \$hDC_backbuffer = _WinAPI_CreateCompatibleDC(\$hDC) Local Const \$DC_obj = _WinAPI_SelectObject(\$hDC_backbuffer, \$hHBitmap) Local Const \$hCanvas = _GDIPlus_GraphicsCreateFromHDC(\$hDC_backbuffer) _GDIPlus_GraphicsSetSmoothingMode(\$hCanvas, \$GDIP_SMOOTHINGMODE_HIGHQUALITY) _GDIPlus_GraphicsSetPixelOffsetMode(\$hCanvas, \$GDIP_PIXELOFFSETMODE_HIGHQUALITY) Local Const \$hBrush_Clr = _GDIPlus_BrushCreateSolid(0xFFFFFFFF), _ \$hBrush_FPS = _GDIPlus_BrushCreateSolid(0xF0808080), _ \$hFormat_FPS = _GDIPlus_StringFormatCreate(), _ \$hFamily_FPS = _GDIPlus_FontFamilyCreate("Arial"), _ \$hFont_FPS = _GDIPlus_FontCreate(\$hFamily_FPS, 8), _ \$tLayout_FPS = _GDIPlus_RectFCreate(0, 0, 60, 16), _ \$hPath = _GDIPlus_PathCreate(), _ \$hPen = _GDIPlus_PenCreate(0xCF101010, 1.25) _GDIPlus_PenSetLineJoin(\$hPen, 2) ;~ _GDIPlus_PenSetDashCap(\$hPen, \$GDIP_DASHCAPROUND) ;~ _GDIPlus_PenSetLineCap(\$hPen, 0x12, 0x12, 2) \$iFPS = 0 Local \$fEuler = 2.7182818284 Local \$fSpace = 6, \$iPoints = 16, \$fSpace2 = \$fSpace / 2, \$iPoints2 = \$iPoints / 2 Local \$fRotX = Random(-360, 360), \$fRotY = Random(-360, 360), \$fRotZ = Random(-360, 360), \$fZoom = 5.0, \$fPower = 20.0 Local \$fRx = Random(-1.5, 1,5), \$fRy = Random(-1.5, 1,5), \$fRz = Random(-1.5, 1,5) Local \$c = 0, \$t = 0, \$aCoords[\$iPoints ^ 2][3] Local \$i, \$j, \$x, \$y, \$z, \$x1, \$y1, \$z1, \$x2, \$y2, \$z2, \$x3, \$y3, \$z3, \$fDistance, \$r, \$g, \$b GUISetOnEvent(\$GUI_EVENT_CLOSE, "_Exit_About") AdlibRegister("CalcFPS", 1000) Do ;~ DllCall(\$__g_hGDIPDll, "int", "GdipFillRectangle", "handle", \$hCanvas, "handle", \$hBrush_Clr, "float", 0, "float", 0, _ ;~ "float", \$iW, "float", \$iH) ;erase canvas background _WinAPI_BitBlt(\$hDC_backbuffer, 0, 0, \$iW, \$iH, \$hDC_backbuffer, 0, 0, \$WHITENESS) \$c = 0 For \$i = 0 To \$iPoints - 1 For \$j = 0 To \$iPoints - 1 \$aCoords[\$c][0] = (\$fSpace * \$i + \$fSpace2 - \$fSpace * \$iPoints2) \$aCoords[\$c][1] = (\$fSpace * \$j + \$fSpace2 - \$fSpace * \$iPoints2) \$fDistance = Dist(0, 0, \$aCoords[\$c][0], \$aCoords[\$c][1]) \$aCoords[\$c][2] = \$fEuler ^ (-\$fDistance / 50) * Sin((\$fDistance / 10) - \$t) * \$fPower \$c += 1 \$t += 0.00075 Next Next For \$i = 0 To \$iPoints - 2 For \$j = 0 To \$iPoints - 2 _3Dto2D(\$aCoords[\$j + \$iPoints * \$i][0], \$aCoords[\$j + \$iPoints * \$i][1], \$aCoords[\$j + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x1, \$y1, \$z1) _3Dto2D(\$aCoords[\$j + \$iPoints * (\$i + 1)][0], \$aCoords[\$j + \$iPoints * (\$i + 1)][1], \$aCoords[\$j + \$iPoints * (\$i + 1)][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$__g_hGDIPDll, "int", "GdipDrawLine", "handle", \$hCanvas, "handle", \$hPen, _ "float", \$iWh + \$x1 * \$fZoom, "float", \$iHh + \$y1 * \$fZoom, "float", \$iWh + \$x2 * \$fZoom, "float", \$iHh + \$y2 * \$fZoom) _3Dto2D(\$aCoords[(\$j + 1) + \$iPoints * \$i][0], \$aCoords[(\$j + 1) + \$iPoints * \$i][1], \$aCoords[(\$j + 1) + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$__g_hGDIPDll, "int", "GdipDrawLine", "handle", \$hCanvas, "handle", \$hPen, _ "float", \$iWh + \$x1 * \$fZoom, "float", \$iHh + \$y1 * \$fZoom, "float", \$iWh + \$x2 * \$fZoom, "float", \$iHh + \$y2 * \$fZoom) Next Next For \$i = 0 To \$iPoints - 2 _3Dto2D(\$aCoords[\$j + \$iPoints * \$i][0], \$aCoords[\$j + \$iPoints * \$i][1], \$aCoords[\$j + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x1, \$y1, \$z1) _3Dto2D(\$aCoords[\$j + \$iPoints * (\$i + 1)][0], \$aCoords[\$j + \$iPoints * (\$i + 1)][1], \$aCoords[\$j + \$iPoints * (\$i + 1)][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$__g_hGDIPDll, "int", "GdipDrawLine", "handle", \$hCanvas, "handle", \$hPen, _ "float", \$iWh + \$x1 * \$fZoom, "float", \$iHh + \$y1 * \$fZoom, "float", \$iWh + \$x2 * \$fZoom, "float", \$iHh + \$y2 * \$fZoom) Next For \$j = 0 To \$iPoints - 2 _3Dto2D(\$aCoords[\$j + \$iPoints * \$i][0], \$aCoords[\$j + \$iPoints * \$i][1], \$aCoords[\$j + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x1, \$y1, \$z1) _3Dto2D(\$aCoords[(\$j + 1) + \$iPoints * \$i][0], \$aCoords[(\$j + 1) + \$iPoints * \$i][1], \$aCoords[(\$j + 1) + \$iPoints * \$i][2], \$fRotX, \$fRotY, \$fRotZ, \$x2, \$y2, \$z2) DllCall(\$__g_hGDIPDll, "int", "GdipDrawLine", "handle", \$hCanvas, "handle", \$hPen, _ "float", \$iWh + \$x1 * \$fZoom, "float", \$iHh + \$y1 * \$fZoom, "float", \$iWh + \$x2 * \$fZoom, "float", \$iHh + \$y2 * \$fZoom) Next \$fRotX += \$fRx \$fRotY += \$fRy \$fRotZ += \$fRz _GDIPlus_GraphicsDrawStringEx(\$hCanvas, "FPS: " & \$iShowFPS, \$hFont_FPS, \$tLayout_FPS, \$hFormat_FPS, \$hBrush_FPS) ;draw background message text _WinAPI_BitBlt(\$hDC, 0, 0, \$iW, \$iH, \$hDC_backbuffer, 0, 0, \$SRCCOPY) ;blit drawn bitmap to GUI \$iFPS += 1 If \$bExit Then ExitLoop Until Not Sleep(10) AdlibUnRegister("CalcFPS") ;release resources _GDIPlus_PenDispose(\$hPen) _GDIPlus_PathDispose(\$hPath) _GDIPlus_FontDispose(\$hFont_FPS) _GDIPlus_FontFamilyDispose(\$hFamily_FPS) _GDIPlus_StringFormatDispose(\$hFormat_FPS) _GDIPlus_BrushDispose(\$hBrush_Clr) _GDIPlus_BrushDispose(\$hBrush_FPS) _GDIPlus_GraphicsDispose(\$hCanvas) _WinAPI_SelectObject(\$hDC_backbuffer, \$DC_obj) _WinAPI_DeleteDC(\$hDC_backbuffer) _WinAPI_DeleteObject(\$hHBitmap) _WinAPI_ReleaseDC(\$hGUI, \$hDC) GUIDelete(\$hGUI) EndFunc ;==>GDIPlus_3DSinusWave Func Dist(\$x1, \$y1, \$x2, \$y2) Return Sqrt((\$x1 - \$x2) * (\$x1 - \$x2) + (\$y1 - \$y2) * (\$y1 - \$y2)) EndFunc ;==>Dist Func _3Dto2D(\$fX, \$fY, \$fZ, \$fRotX, \$fRotY, \$fRotZ, ByRef \$__fXPos, ByRef \$__fYPos, ByRef \$__fZPos) ;apply the x-axis rotation to transform coordinates (\$fX, \$fY, \$fZ) into coordinates (\$fX0, \$fY0, \$fZ0) \$__f1 = \$fRotX * \$fRad \$__f2 = Cos(\$__f1) \$__f3 = Sin(\$__f1) \$__fY0 = \$fY * \$__f2 + \$fZ * \$__f3 \$__fZ0 = \$fZ * \$__f2 - \$fY * \$__f3 ;apply the y-axis rotation to (\$fX0, \$__fY0, \$fZ0) to obtain (\$__fX1, \$__fY1, \$fZ1) \$__f1 = \$fRotY * \$fRad \$__f2 = Cos(\$__f1) \$__f3 = Sin(\$__f1) \$__fX1 = \$fX * \$__f2 - \$__fZ0 * \$__f3 \$__fY1 = \$__fY0 ;~ \$__fZ1 = \$__fZ0 * \$__f2 + \$fX * \$__f2 ;finally, apply the z-axis rotation to obtain the point (\$fXPos, \$fYPos) \$__f1 = \$fRotZ * \$fRad \$__f2 = Cos(\$__f1) \$__f3 = Sin(\$__f1) \$__fXPos = \$__fX1 * \$__f2 + \$__fY1 * \$__f3 \$__fYPos = \$__fY1 * \$__f2 - \$__fX1 * \$__f3 \$__fZPos = \$__fZ0 EndFunc ;==>_3Dto2D Func _Exit_About() \$bExit = True EndFunc ;==>_Exit_About Func CalcFPS() ;display FPS \$iShowFPS = \$iFPS \$iFPS = 0 EndFunc ;==>CalcFPS
In the attached 7-Zip file you can find the compiled and also a FreeBasic version. -> DL: 3D Sinus Wave.7z

Have fun.
×

• Wiki

• Back

• #### Beta

• Git
• FAQ
×
• Create New...