• Hi,

    aus Langeweile und dem derzeitigen Unterrichtsthema in Mathe (3D-Koordinatensysteme) ist dieses Skript entstanden:

    Draw3D
    [autoit]


    #include <GDIPlus.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    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")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $aPoints[1][3], $aLines[1][2], $aInfo
    _FileReadToArray($sFile, $aInfo)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("3D Polygon Drawer", 400, 400)
    GUISetOnEvent(-3, "_Shutdown")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $iUnit = 50 ;px
    $iBaseXY = 200 ;px
    $iCircleR = 5 ;px
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    _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

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister("_FPS", 1000)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    _GDIPlus_GraphicsClear($hBuffer, 0xffffffff)
    _OnPaint($hBuffer, $iDeg)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 400, 400)

    [/autoit] [autoit][/autoit] [autoit]

    $iFPS += 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Coord_3dTo2d($iX1, $iX2or3)
    Return $iX2or3 - 0.5 * $iX1
    EndFunc ;==>_Coord_3dTo2d

    [/autoit] [autoit][/autoit] [autoit]

    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))

    [/autoit] [autoit][/autoit] [autoit]

    $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))

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawLine($hGraphics, $iBaseXY + ($iX1 * $iUnit), $iBaseXY + ($iY1 * $iUnit), $iBaseXY + ($iX2 * $iUnit), $iBaseXY + ($iY2 * $iUnit), $hPen)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawString($hGraphics, "FPS: " & $iGlobalFPS & @CRLF & $iDeg & "°", 0, 0)
    EndFunc ;==>_OnPaint

    [/autoit] [autoit][/autoit] [autoit]

    Func _IncDeg()
    $iDeg += 1
    EndFunc ;==>_IncDeg

    [/autoit] [autoit][/autoit] [autoit]

    Func _DecDeg()
    $iDeg -= 1
    EndFunc ;==>_DecDeg

    [/autoit] [autoit][/autoit] [autoit]

    Func _IncScope()
    $iUnit += 1
    EndFunc ;==>_IncScope

    [/autoit] [autoit][/autoit] [autoit]

    Func _DecScope()
    $iUnit -= 1
    EndFunc ;==>_DecScope

    [/autoit] [autoit][/autoit] [autoit]

    Func _Shutdown()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    EndFunc ;==>_Shutdown

    [/autoit] [autoit][/autoit] [autoit]

    Func _FPS()
    $iGlobalFPS = $iFPS
    $iFPS = 0
    EndFunc ;==>_FPS

    [/autoit] [autoit][/autoit] [autoit]

    Func _ToggleSign()
    $bToggleSign = Not $bToggleSign
    EndFunc ;==>_ToggleSign

    [/autoit]

    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^^

  • Es gibt doch ein ganz ähnliches 3D Format. kann man dafür nicht einen Konverter bauen ?
    Dann könntest du schön komplexe Sachen zeichnen lassen.

    Performance lässt sich noch etwas steigern:
    - Nur repaint, wenn es nötig ist
    - Funktionen durch den DllCall ersetzen (Dadurch entfällt das DefPen erstellen usw)
    - DrawStringEx nehmen. (nur den DllCall). das ist 10x so schnell wie DrawString
    - Timer statt Adlib

  • Fehlt nur noch die perspektivische Korrektur, so dass die hinteren Punkte näher zum Fluchtpunkt sind.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hier, mit der Z+-Formel lässt sich ganz einfach perspektivisch darstellen. Dabei wird ein Kamerapunkt definiert, der ebenfalls frei beweglich im Raum ist. Dazu eine UDF, die sich leicht auf GDI+ umbauen lässt. Das einzige was fehlt ist Z-Odering für Backface-Culling :D

    Spoiler anzeigen
    [autoit]

    #include <Main.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $n
    const $PI = 3.1415926535897;
    const $space = 20;
    const $VertexCount = (90 / $space) * (360 / $space) * 4;
    Local $R = 15, $H = 7, $K = 3, $Z

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hGraphics = alStartup("Test",800,600)
    Local $Cam = alCamera(10,50,100)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Model = 0

    [/autoit] [autoit][/autoit] [autoit]

    If $Model = 0 Then Cube()
    If $Model = 1 Then Cyl_Point()
    If $Model = 2 Then Cyl_Line()
    If $Model = 3 Then Quads()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg()=-3

    [/autoit] [autoit][/autoit] [autoit]

    Func Quads()
    alQuad($hGraphics, $Cam, -15, -15, 15, 15, -15, 15, 15, 15, 15, -15, 15, 15); Backface
    alQuad($hGraphics, $Cam, 15, -15, -15, 15, -15, 15, 15, 15, 15, 15, 15, -15); Right
    alQuad($hGraphics, $Cam, -15, -15, -15, -15, -15, 15, -15, 15, 15, -15, 15, -15); Left
    alQuad($hGraphics, $Cam, -15, -15, -15, 15, -15, -15, 15, 15, -15, -15, 15, -15); Frontface
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Cyl_Point()
    alAxis($hGraphics,$Cam)
    For $i=0 To 30
    Local $theta = (2*$PI*$i)/(30-1), $x = Sin($theta)*10, $y = -10, $z = Cos($theta)*10
    alPoint($hGraphics, $Cam, $x, $y, $z)
    alPoint($hGraphics, $Cam, $x, -$y, $z)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Cyl_Line()
    alAxis($hGraphics,$Cam)
    For $i=0 To 30
    Local $theta = (2*$PI*$i)/(30-1), $x = Sin($theta)*10, $y = -10, $z = Cos($theta)*10
    alLine($hGraphics, $Cam, $x, $y, $z, $x, -$y, $z)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Cube()
    alAxis($hGraphics,$Cam)
    alLine($hGraphics, $Cam, -15, -15, 15, 15, -15, 15)
    alLine($hGraphics, $Cam, -15, 15, 15, 15, 15, 15)
    alLine($hGraphics, $Cam, -15, -15, -15, 15, -15, -15)
    alLine($hGraphics, $Cam, -15, 15, -15, 15, 15, -15)
    alLine($hGraphics, $Cam, -15, -15, 15, -15, -15, -15)
    alLine($hGraphics, $Cam, -15, 15, 15, -15, 15, -15)
    alLine($hGraphics, $Cam, 15, -15, 15, 15, -15, -15)
    alLine($hGraphics, $Cam, 15, 15, 15, 15, 15, -15)
    alLine($hGraphics, $Cam, -15, -15, -15, -15, 15, -15)
    alLine($hGraphics, $Cam, -15, -15, 15, -15, 15, 15)
    alLine($hGraphics, $Cam, 15, -15, -15, 15, 15, -15)
    alLine($hGraphics, $Cam, 15, -15, 15, 15, 15, 15)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func alStartup($Title,$Width,$Height,$Left=-1,$Top=-1)
    Dim $Return[4]=[GUICreate($Title,$Width,$Height,$Left,$Top,Default,34078728),GUICtrlCreateGraphic(0,0,$Width,$Height),$Width,$Height]
    GUISetState()
    Return $Return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func alCamera($x=1,$y=1,$z=100)
    Dim $Cam[3]=[$x,$y,$z]
    Return $Cam
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func alAxis($hWnd,$Cam)
    alLine($hWnd,$Cam,-50,0,0,50,0,0)
    alLine($hWnd,$Cam,0,-50,0,0,50,0)
    alLine($hWnd,$Cam,0,0,-50,0,0,M(50,$Cam[2]-.1))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func alLine($hWnd,$Cam,$x,$y,$z,$xx,$yy,$zz)
    $Coord1=C($Cam,-$x,$y,-$z,$hWnd[2],$hWnd[3])
    $Coord2=C($Cam,-$xx,$yy,-$zz,$hWnd[2],$hWnd[3])
    GUICtrlSetGraphic($hWnd[1],6,$Coord1[0],$Coord1[1])
    GUICtrlSetGraphic($hWnd[1],2,$Coord2[0],$Coord2[1])
    GUICtrlSetGraphic($hWnd[1],22)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func alPoint($hWnd,$Cam,$x,$y,$z)
    $Coord1=C($Cam,-$x,$y,-$z,$hWnd[2],$hWnd[3])
    GUICtrlSetGraphic($hWnd[1],18,$Coord1[0],$Coord1[1])
    GUICtrlSetGraphic($hWnd[1],22)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func alQuad($hWnd, $Cam, $x, $y, $z, $x1, $y1, $z1, $x2, $y2, $z2, $x3, $y3, $z3)
    GUICtrlSetGraphic($hWnd[1], 24, 1)
    GUICtrlSetGraphic($hWnd[1], 8, 0xFFFFFF, Random(0,0xFFFFFF))
    $Coord1=C($Cam,-$x,$y,-$z,$hWnd[2],$hWnd[3])
    $Coord2=C($Cam,-$x1,$y1,-$z1,$hWnd[2],$hWnd[3])
    $Coord3=C($Cam,-$x2,$y2,-$z2,$hWnd[2],$hWnd[3])
    $Coord4=C($Cam,-$x3,$y3,-$z3,$hWnd[2],$hWnd[3])
    GUICtrlSetGraphic($hWnd[1],6,$Coord1[0],$Coord1[1])
    GUICtrlSetGraphic($hWnd[1],2,$Coord2[0],$Coord2[1])
    GUICtrlSetGraphic($hWnd[1],2,$Coord3[0],$Coord3[1])
    GUICtrlSetGraphic($hWnd[1],2,$Coord4[0],$Coord4[1])
    GUICtrlSetGraphic($hWnd[1],22)
    GUICtrlSetGraphic($hWnd[1], 24, 1)
    GUICtrlSetGraphic($hWnd[1], 8, 0x000000, -2)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func C($Cam,$x,$y,$z,$w,$h)
    If $z<$Cam[2] then
    Dim $return[3]=[(.5*$w*($x-$Cam[0])/($z-$Cam[2]))+.5*$h,(.5*$h*($y-$Cam[1])/($z-$Cam[2]))+.5*$h,0]
    Else
    Dim $return[3]=[0,0,-10000]
    EndIf
    Return $return
    EndFunc

    [/autoit]
  • Sooo hier schonmal ein Tool um Würfel zu generieren.

    Tool
    [autoit]


    ; Würfel($x, $y, $z, $dx, $dy, $dz)
    Local $s = 'Würfel(-1,-1,-1,2,2,2)' & @CRLF & 'Würfel(-0.5,-0.5,-0.5,1,1,1)'

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(_Translate($s) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func _Translate($s)
    ; Punkte - pn:x/y/z
    ; Linie - l:a-b
    ; Punkte haben Koordinaten
    ; Linien haben Punkte als Start und Ende
    Local $r = '', $a = StringSplit(StringReplace($s, @CR, '', 0, 1), @LF, 2), $u = UBound($a), $PunktNr = 0, $p, $l1 = '111444223567', $l2 = '268357358678'

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $u - 1 Step 1
    $p = StringSplit($a[$i], '(', 2)
    Switch $p[0]
    Case 'Würfel'
    $p = StringSplit(StringTrimRight($p[1],1), ',', 2)
    For $e = 0 To 7 Step 1
    $r &= 'p' & $PunktNr & ':' & $p[0] + $p[3] * ($e>0 and $e<5) & '/' & $p[1] + $p[4] * ($e>2 and $e<7) & '/' & $p[2] + $p[5] * (IsInt(($e+2)/4) Or IsInt(($e+1)/4)) & @CRLF
    $PunktNr += 1
    Next
    For $e = 1 To 12 Step 1
    $r &= 'l:' & $PunktNr + StringMid($l1, $e, 1) - 9 & '-' & $PunktNr + StringMid($l2, $e, 1) - 9 & @CRLF
    Next
    Case 'WasAuchImmer'

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Return $r
    EndFunc

    [/autoit]


    .
    .

  • Also, erstmal:

    Wavefront OBJ
    Konvertierungsskript
    [autoit]


    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sFile = ""

    [/autoit] [autoit][/autoit] [autoit]

    Local $aLines, $sResult, $iPointCounter = 0
    _FileReadToArray($sFile, $aLines)

    [/autoit] [autoit][/autoit] [autoit]

    For $iLine = 1 To $aLines[0]
    Switch StringLeft($aLines[$iLine], 1)
    Case "v" ;Point
    $aTemp = StringSplit(StringStripWS(StringTrimLeft($aLines[$iLine], 1), 7), " ", 3)
    $sResult &= "p" & $iPointCounter & ":" & $aTemp[0] & "/" & $aTemp[1] & "/" & $aTemp[2] & @CRLF
    $iPointCounter += 1
    Case "f"
    $aPoints = StringSplit(StringStripWS(StringTrimLeft($aLines[$iLine], 1), 7), " ", 3)
    For $iPoint = 0 To UBound($aPoints) - 2
    $sResult &= "l:" & $aPoints[$iPoint] - 1 & "-" & $aPoints[$iPoint + 1] - 1 & @CRLF
    Next
    $sResult &= "l:" & $aPoints[UBound($aPoints) - 1] - 1 & "-" & $aPoints[0] - 1 & @CRLF
    EndSwitch
    Next
    MsgBox(0, "", $sResult)
    ClipPut($sResult)

    [/autoit]


    <Beispiel im Anhang>

    Damit diese Dateien ohne größere Schwierigkeiten geöffnet und angeschaut werden können, muss eine veränderte Variante von meinem Skript benutzt werden (Sonst dauert das Laden dank ReDim Ewigkeiten. Ich weiß, dass ein überdimensioniertes Array auch doof ist, und ich weiß auch, dass man es mit einer Queue oder einem Stack deutlich einfacher lösen kann. Hatte ich jetzt aber keine Lust drauf. :D)

    Modifiziertes Skript
    [autoit]


    #include <GDIPlus.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", True)

    [/autoit] [autoit][/autoit] [autoit]

    $sFile = InputBox(0, "Datei: ")

    [/autoit] [autoit][/autoit] [autoit]

    Local $aInfo
    _FileReadToArray($sFile, $aInfo)
    Local $aPoints[$aInfo[0] + 1][3], $aLines[$aInfo[0] + 1][2], $iPointCounter = 0, $iLineCounter = 0

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", $aInfo[0] & " Anweisungen!")

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aInfo[0]
    Switch StringLeft($aInfo[$i], 1)
    Case "p" ;Point
    $aTemp1 = StringSplit(StringTrimLeft($aInfo[$i], 1), ":", 3)
    $aTemp2 = StringSplit($aTemp1[1], "/", 3)

    [/autoit] [autoit][/autoit] [autoit]

    $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[$iLineCounter][0] = $aPJump[0]
    $aLines[$iLineCounter][1] = $aPJump[1]
    $iLineCounter += 1
    EndSwitch
    ConsoleWrite($i & @CRLF)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    HotKeySet("{LEFT}", "_IncDeg")
    HotKeySet("{RIGHT}", "_DecDeg")
    HotKeySet("{SPACE}", "_ToggleSign")
    HotKeySet("p", "_TogglePoints")
    HotKeySet("{UP}", "_IncScope")
    HotKeySet("{DOWN}", "_DecScope")

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("3D Polygon Drawer", 400, 400)
    GUISetOnEvent(-3, "_Shutdown")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $iUnit = 50 ;px
    $iBaseXY = 200 ;px
    $iCircleR = 5 ;px
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(400, 400, $hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsClear($hGraphics, 0xffffffff)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF0000FF)
    $hPen = _GDIPlus_PenCreate(0xFF00ff00)
    $iDeg = 0
    $iFPS = 0
    $iGlobalFPS = 0
    $bToggleSign = True
    $bTogglePoints = True
    Const $nRadConst = ACos(-1) / 180

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister("_FPS", 1000)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    _GDIPlus_GraphicsClear($hBuffer, 0xffffffff)
    _OnPaint($hBuffer, $iDeg)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 400, 400)

    [/autoit] [autoit][/autoit] [autoit]

    $iFPS += 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Coord_3dTo2d($iX1, $iX2or3)
    Return $iX2or3 - 0.5 * $iX1
    EndFunc ;==>_Coord_3dTo2d

    [/autoit] [autoit][/autoit] [autoit]

    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))

    [/autoit] [autoit][/autoit] [autoit]

    $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))

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawLine($hGraphics, $iBaseXY + ($iX1 * $iUnit), $iBaseXY + ($iY1 * $iUnit), $iBaseXY + ($iX2 * $iUnit), $iBaseXY + ($iY2 * $iUnit), $hPen)
    Next
    If $bTogglePoints Then
    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))
    If ($iX2d <> 0) And ($iY2d <> 0) Then
    _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)
    EndIf
    Next
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawString($hGraphics, "FPS: " & $iGlobalFPS & @CRLF & $iDeg & "°", 0, 0)
    EndFunc ;==>_OnPaint

    [/autoit] [autoit][/autoit] [autoit]

    Func _IncDeg()
    $iDeg += 1
    EndFunc ;==>_IncDeg

    [/autoit] [autoit][/autoit] [autoit]

    Func _DecDeg()
    $iDeg -= 1
    EndFunc ;==>_DecDeg

    [/autoit] [autoit][/autoit] [autoit]

    Func _IncScope()
    $iUnit += 1
    EndFunc ;==>_IncScope

    [/autoit] [autoit][/autoit] [autoit]

    Func _DecScope()
    $iUnit -= 1
    EndFunc ;==>_DecScope

    [/autoit] [autoit][/autoit] [autoit]

    Func _Shutdown()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Shutdown

    [/autoit] [autoit][/autoit] [autoit]

    Func _FPS()
    $iGlobalFPS = $iFPS
    $iFPS = 0
    EndFunc ;==>_FPS

    [/autoit] [autoit][/autoit] [autoit]

    Func _ToggleSign()
    $bToggleSign = Not $bToggleSign
    EndFunc ;==>_ToggleSign

    [/autoit] [autoit][/autoit] [autoit]

    Func _TogglePoints()
    $bTogglePoints = Not $bTogglePoints
    EndFunc ;==>_TogglePoints

    [/autoit]


    Mit p blendet man die Punkte + Beschriftungen ein und aus (Sonst sieht das ganze etwas komisch aus).

    So viel dazu. :D

    Mars Ja, da lässt sich noch einiges verbessern. Werde ich die Tage alles mal umsetzen.^^

    minx

    Zitat


    ein switch zwischen Isometrischer (Axiometrischer) und Paralleler Darstellung


    Wenn du mir erklärst, was das ist... :D

    UEZ
    Heißt das nicht einfach, dass die Länge mit 0.707 multipliziert wird? Verkürzungsfaktor? Oder was meinst du? ^^

    minx (2. Post)
    Ne, das lassen wir mal lieber.
    Das hier soll bei GDI+ und meinen Mathe-Kenntnissen beruhen. Und die Darstellung einer frei beweglichen Kameraperspektive im Raum kann ich mathematisch (noch) nicht umsetzen.^^

    Sonst: Danke für das Lob. :)

    lg

  • @chess Ich glaube UEZ meinte die perspektivische Krümmung die Obekte, mit größerem Abstand zum Betrachter, kleiner erscheinen lässt. Der Verkürzungsfaktor wird normalerweise nur verwendet um Objekte in isometrischer Darstellung (das was du verwendest) etwas realistischer aussehen zu lassen.
    Zum Thema:
    Axonometrie
    Zentralprojektion

  • Überraschung ;)
    Spoiler anzeigen