Hi,
aus Langeweile und dem derzeitigen Unterrichtsthema in Mathe (3D-Koordinatensysteme) ist dieses Skript entstanden:
Draw3D
#include <GDIPlus.au3>
#include <File.au3>
Opt("GUIOnEventMode", True)
[/autoit] [autoit][/autoit] [autoit]$sFile = InputBox(0, "Datei: ")
[/autoit] [autoit][/autoit] [autoit]HotKeySet("{LEFT}", "_IncDeg")
HotKeySet("{RIGHT}", "_DecDeg")
HotKeySet("{SPACE}", "_ToggleSign")
HotKeySet("{UP}", "_IncScope")
HotKeySet("{DOWN}", "_DecScope")
Local $aPoints[1][3], $aLines[1][2], $aInfo
_FileReadToArray($sFile, $aInfo)
For $i = 0 To $aInfo[0]
Switch StringLeft($aInfo[$i], 1)
Case "p" ;Point
$aTemp1 = StringSplit(StringTrimLeft($aInfo[$i], 1), ":", 3)
$aTemp2 = StringSplit($aTemp1[1], "/", 3)
If UBound($aPoints) <= $aTemp1[0] Then
ReDim $aPoints[$aTemp1[0] + 1][3]
EndIf
$aPoints[$aTemp1[0]][0] = $aTemp2[0]
$aPoints[$aTemp1[0]][1] = $aTemp2[1]
$aPoints[$aTemp1[0]][2] = $aTemp2[2]
Case "l" ;Line
$aPJump = StringSplit(StringTrimLeft($aInfo[$i], 2), "-", 3)
$aLines[UBound($aLines) - 1][0] = $aPJump[0]
$aLines[UBound($aLines) - 1][1] = $aPJump[1]
ReDim $aLines[UBound($aLines) + 1][2]
EndSwitch
Next
$hGUI = GUICreate("3D Polygon Drawer", 400, 400)
GUISetOnEvent(-3, "_Shutdown")
GUISetState()
$iUnit = 50 ;px
$iBaseXY = 200 ;px
$iCircleR = 5 ;px
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphics)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsClear($hGraphics, 0xffffffff)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF0000FF)
$hPen = _GDIPlus_PenCreate(0xFF00ff00)
$iDeg = 0
$iFPS = 0
$iGlobalFPS = 0
$bToggleSign = True
Const $nRadConst = ACos(-1) / 180
AdlibRegister("_FPS", 1000)
[/autoit] [autoit][/autoit] [autoit]While True
_GDIPlus_GraphicsClear($hBuffer, 0xffffffff)
_OnPaint($hBuffer, $iDeg)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 400, 400)
$iFPS += 1
WEnd
Func _Coord_3dTo2d($iX1, $iX2or3)
Return $iX2or3 - 0.5 * $iX1
EndFunc ;==>_Coord_3dTo2d
Func _OnPaint($hGraphics, $iDeg)
For $i = 0 To UBound($aLines, 1) - 1
$iX1 = _Coord_3dTo2d($aPoints[$aLines[$i][0]][0], $aPoints[$aLines[$i][0]][1] * Cos($iDeg * $nRadConst) + $aPoints[$aLines[$i][0]][2] * Sin($iDeg * $nRadConst))
$iY1 = _Coord_3dTo2d($aPoints[$aLines[$i][0]][0], -$aPoints[$aLines[$i][0]][1] * Sin($iDeg * $nRadConst) + $aPoints[$aLines[$i][0]][2] * Cos($iDeg * $nRadConst))
$iX2 = _Coord_3dTo2d($aPoints[$aLines[$i][1]][0], $aPoints[$aLines[$i][1]][1] * Cos($iDeg * $nRadConst) + $aPoints[$aLines[$i][1]][2] * Sin($iDeg * $nRadConst))
$iY2 = _Coord_3dTo2d($aPoints[$aLines[$i][1]][0], -$aPoints[$aLines[$i][1]][1] * Sin($iDeg * $nRadConst) + $aPoints[$aLines[$i][1]][2] * Cos($iDeg * $nRadConst))
_GDIPlus_GraphicsDrawLine($hGraphics, $iBaseXY + ($iX1 * $iUnit), $iBaseXY + ($iY1 * $iUnit), $iBaseXY + ($iX2 * $iUnit), $iBaseXY + ($iY2 * $iUnit), $hPen)
Next
For $i = 0 To UBound($aPoints, 1) - 1
$iX2d = _Coord_3dTo2d($aPoints[$i][0], $aPoints[$i][1] * Cos($iDeg * $nRadConst) + $aPoints[$i][2] * Sin($iDeg * $nRadConst))
$iY2d = _Coord_3dTo2d($aPoints[$i][0], -$aPoints[$i][1] * Sin($iDeg * $nRadConst) + $aPoints[$i][2] * Cos($iDeg * $nRadConst))
_GDIPlus_GraphicsFillEllipse($hGraphics, $iBaseXY + ($iX2d * $iUnit) - $iCircleR / 2, $iBaseXY + ($iY2d * $iUnit) - $iCircleR / 2, $iCircleR, $iCircleR, $hBrush)
If $bToggleSign Then _GDIPlus_GraphicsDrawString($hGraphics, "p" & $i, $iBaseXY + ($iX2d * $iUnit) + $iCircleR / 2, $iBaseXY + ($iY2d * $iUnit) + $iCircleR / 2)
Next
_GDIPlus_GraphicsDrawString($hGraphics, "FPS: " & $iGlobalFPS & @CRLF & $iDeg & "°", 0, 0)
EndFunc ;==>_OnPaint
Func _IncDeg()
$iDeg += 1
EndFunc ;==>_IncDeg
Func _DecDeg()
$iDeg -= 1
EndFunc ;==>_DecDeg
Func _IncScope()
$iUnit += 1
EndFunc ;==>_IncScope
Func _DecScope()
$iUnit -= 1
EndFunc ;==>_DecScope
Func _Shutdown()
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_PenDispose($hPen)
_GDIPlus_Shutdown()
Exit
EndFunc ;==>_Shutdown
Func _FPS()
$iGlobalFPS = $iFPS
$iFPS = 0
EndFunc ;==>_FPS
Func _ToggleSign()
$bToggleSign = Not $bToggleSign
EndFunc ;==>_ToggleSign
Die Steuerung ist recht einfach:
- Left und Right: Rotieren des Objektes um die X1-Achse (Tiefe)
- Up und Down: Ran- und Rauszoomen
- Space: Beschriftungen ein- oder ausschalten
Die Dateien sind nach folgendem Format aufgebaut (Beispiel -> Einfacher Würfel):
Spoiler anzeigen
pn:X1/X2/X3
Erstellt einen Punkt n an den Koordinaten (X1|X2|X3).
l:x-y
Zeichnet eine Linie von Punkt Nummer x zu Punkt Nummer y.
Hier noch ein anderes Bespielobjekt.^^
Pyramide mit Quader
lg^^