Impulssimulation (physikalisch richtig)

  • So,

    nach einer längeren Pause habe ich mal wieder was neues fertiggestellt.

    Eine relativ simple Simulation zweier Kugeln, die zur Kollision gebracht werden, Seitenansicht.

    Die Eigenschaften der Kugeln sind alle einstellbar(Dichte,Masse,Anfangsgeschwindigkeit).

    Über F1 ist eine Hilfe aufzurufen, in der die Steuerung genau beschrieben wird.

    Je nach Rechnerleistung ist die Variable $FPS (Zeile 15) einzustellen, damit die Zeit 1:1 abläuft, und damit auch die Geschwindigkeit, sonst erhält man eine Zeitlupen- oder Zeitrafferansicht :D.

    Ich hoffe, es funktioniert alles, und hoffentlich sind auch alle Recourcen wieder frei(bei dem Teil bin ich mir nie sicher). Hoffe auf Antwort und FeedBack.


    Gruß mazZ


    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>
    #include <Misc.au3>
    Opt("GUIOnEventMode",1)
    Opt("MouseCoordMode",2)
    Global $iWidth = @DesktopWidth-10, $iHeight = 500, $iWidthHilfe = 500, $iHeightHilfe = 300
    Global $BodenY = $iHeight/1.1
    Global $Kugel1Dichte = 7800, $Kugel1Masse = 1, $Kugel1Radius = (($Kugel1Masse/$Kugel1Dichte)/((4/3)*3.141))^(1/3)*1000, $Kugel1Mittelpunktkreis = 5, $Kugel1Geschwindigkeit = 0, $Kugel1X = $Kugel1Radius, $Kugel1Y = $BodenY - $Kugel1Radius, $Kugel2Dichte = 7800, $Kugel2Masse = 1, $Kugel2Radius = (($Kugel2Masse/$Kugel2Dichte)/((4/3)*3.141))^(1/3)*1000, $Kugel2Mittelpunktkreis = 5, $Kugel2Geschwindigkeit = 0, $Kugel2X = $iWidth - $Kugel2Radius, $Kugel2Y = $BodenY - $Kugel2Radius
    Global $BackKugel1Geschwindigkeit, $BackKugel2Geschwindigkeit
    Global $aPoints1[4][2] = [[3,0],[70,25],[80,15],[90,25]], $aPoints2[4][2] = [[3,0],[70,50],[80,60],[90,50]], $aPoints3[4][2] = [[3,0],[185,25],[195,15],[205,25]], $aPoints4[4][2] = [[3,0],[185,50],[195,60],[205,50]]
    Global $aPoints5[4][2] = [[3,0],[310,25],[320,15],[330,25]], $aPoints6[4][2] = [[3,0],[310,50],[320,60],[330,50]], $aPoints7[4][2] = [[3,0],[425,25],[435,15],[445,25]], $aPoints8[4][2] = [[3,0],[425,50],[435,60],[445,50]]
    Global $aGeschwindigkeitspfeile[2][5] = [[0,0,0,0,-1],[0,0,0,0,-1]]
    Global $aPlayDreieck[4][2] = [[3,0],[$iWidth/2 - 100,$iHeight/2],[$iWidth/2+100,$iHeight/2-100],[$iWidth/2+100,$iHeight/2+100]], $aPlayDreieckklein[4][2] = [[3,0],[$iWidth-57.5,17.5],[$iWidth-57.5,32.5],[$iWidth-72.5,25]]
    Global $aPfeilrot1[4][2], $aPfeilrot2[4][2], $aPfeilgruen1[4][2], $aPfeilgruen2[4][2]
    Global $Kugel1Halten = 0, $Kugel2Halten = 0, $StartStop = 0, $StartStopZahl = 0
    Global $FPS = 100, $Zeit = 0, $Sekunden, $Minuten, $Stunden, $hBackBrush

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

    $hWnd = GUICreate("Impuls - Simulation",$iWidth,$iHeight,-1,-1)
    GUISetState(@SW_SHOW)
    GUISetOnEvent(-3,"_Exit")
    WinSetTrans("Impuls - Simulation","",255)
    HotKeySet("{F1}","_Hilfe")

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

    $hWndHilfe = GUICreate("Hilfe",$iWidthHilfe,$iHeightHilfe,-1,-1)
    $Tab = GUICtrlCreateTab(0,0,$iWidth,$iHeight)
    $TabWerte = GUICtrlCreateTabItem("Werte")
    GUICtrlCreateLabel("Die Werte der Körper kann man mit den Pfeilen ober- und unterhalb von ihnen verändern. Die Werte ohne Pfeile dienen nur zum Beobachten während der Simulation." & @CRLF & @CRLF & "Um die Anfangsgeschwindigkeit einer Kugel vor dem Start festzulegen, muss man mit der Maus auf den Mittelpunkt der Kugel fahren, bis er markiert wird. Dann mit gehaltener Maustaste die Maus in die gewünschte Richtung bewegen. Der entsprechende Werte wird über dem Pfeil und in der Werteanzeige angezeigt. Wenn die gewümschte Geschwindigkeit erreicht ist, die Maustaste loslassen. Der Pfeil, der in die Richtung zeigt und dessen Länge für den Wert der Anfangsgeschwindigkeit steht wird nach dem Start der Simulation ausgeblendet." & @CRLF & @CRLF & "Zum Festlegen der Startpositionen der Kugeln muss man mit der Maus auf die gewünschte Kugel gehen, bis sie markiert wird (aber nicht der Mittelpunkt, sonst wird die Anfangsgeschwindigkeit fetsgelegt!), anschließend mit gedrückter rechter Maustaste die Kugel zum gewünschten Ort bewegen und die Maustaste wieder loslassen.",10,30,$iWidthHilfe-20,200)
    $TabStart = GUICtrlCreateTabItem("Start der Simulation")
    GUICtrlCreateLabel("Zum Starten der Simulation Leertaste drücken. Anschließend kann sie verwendet werden um zu Pausieren, bzw. Fortzufahren." & @CRLF & "Im Hintergrund ist das entsprechende Symbol zu aktuellen Simulationsstatus zu sehen." & @CRLF & "Um die Simulation zurückzusetzen, müssen die linke und die rechte Maustaste gleichzeitig gedrückt werden. D.h. die Kugeln werden auf Anfang gesetzt, jedoch nicht ihre Größe, bzw. Dichte und Masse, und man kann die Anfangsgeschwindigkeit neu einstellen.",10,30,$iWidthHilfe-20,200)
    $TabSteuerung = GUICtrlCreateTabItem("Steuerung")
    GUICtrlCreateLabel("LINKE MAUSTASTE - Bedienen der Werteeinstellung, Einstellung der Startgeschwindigkeit" & @CRLF & @CRLF & "RECHTE MAUSTASTE - Verschieben der Kugeln" & @CRLF & @CRLF & "LINKE +" & @CRLF & "RECHTE MAUSTASTE - Zurücksetzen" & @CRLF & @CRLF & "LEERTASTE - Start/Pause" & @CRLF & @CRLF & @CRLF & "T - Aufrufen des Fensters zur Einstellung der Ablaufgeschwindigkeit",10,30,$iWidthHilfe-20,200)
    GUICtrlCreateTabItem("")
    GUISetOnEvent(-3,"_Hide")

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth,$iHeight,$hGraphics)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hFormat = _GDIPlus_StringFormatCreate()
    $hFamily = _GDIPlus_FontFamilyCreate("Arial")
    $hFont = _GDIPlus_FontCreate($hFamily,12)
    $tLayout = _GDIPlus_RectFCreate(0,0,0,0)
    $hPenrot = _GDIPlus_PenCreate(0xFFFF0000)
    $hPengruen = _GDIPlus_PenCreate(0xFF00FF00)
    $hPenhellrot = _GDIPlus_PenCreate(0xFFFF5500,5)
    $hPendunkelgruen = _GDIPlus_PenCreate(0xFF00BB00,5)
    $hPenblau = _GDIPlus_PenCreate(0xFF0000FF)
    $hPengrau = _GDIPlus_PenCreate(0xFF555555)
    $hBrushrot = _GDIPlus_BrushCreateSolid(0xFFFF0000)
    $hBrushgruen = _GDIPlus_BrushCreateSolid(0xFF00FF00)
    $hBrushweiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $hBrushschwarz = _GDIPlus_BrushCreateSolid(0xFF000000)
    $hBrushhellrot = _GDIPlus_BrushCreateSolid(0xFFFF5500)
    $hBrushrottransparent = _GDIPlus_BrushCreateSolid(0x20FF0000)
    $hBrushgruentransparent = _GDIPlus_BrushCreateSolid(0x2000FF00)

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

    AdlibRegister("_Draw",1000/$FPS)
    While 1
    WEnd
    Func _Draw()
    _GDIPlus_GraphicsClear($hBuffer,0xFF777777)
    ;Simulationsstatus Stop Pause Play
    If $StartStop = 0 Then
    _GDIPlus_GraphicsFillRect($hBuffer,$iWidth/2 - 100,$iHeight/2 - 100 ,200,200,$hBrushrottransparent)
    ElseIf $StartStop = 1 Then
    _GDIPlus_GraphicsFillRect($hBuffer,$iWidth/2 - 100,$iHeight/2 -100,200/3,200,$hBrushrottransparent)
    _GDIPlus_GraphicsFillRect($hBuffer,$iWidth/2 - 100 + 2*200/3,$iHeight/2 - 100,200/3,200,$hBrushrottransparent)
    ElseIf $StartStop = 2 Then
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPlayDreieck,$hBrushgruentransparent)
    EndIf
    ;Boden zeichen, mit Maßstab für 10 cm
    _GDIPlus_GraphicsDrawLine($hBuffer,0,$BodenY,$iWidth,$BodenY,$hPengrau)
    For $i = 100 To $iWidth Step 100
    _GDIPlus_GraphicsDrawLine($hBuffer,$i,$BodenY-4,$i,$BodenY+4,$hPengrau)
    _GDIPlus_GraphicsDrawString($hBuffer,$i/10,$i-8,$BodenY+6)
    Next
    _GDIPlus_GraphicsDrawString($hBuffer,"cm",$iWidth/2,$BodenY + 25)
    ;Kugeln zeichnen
    _GDIPlus_GraphicsFillEllipse($hBuffer,$Kugel1X - $Kugel1Radius,$Kugel1Y - $Kugel1Radius,2*$Kugel1Radius,2*$Kugel1Radius,$hBrushrot)
    _GDIPlus_GraphicsFillEllipse($hBuffer,$Kugel2X - $Kugel2Radius,$Kugel2Y - $Kugel2Radius,2*$Kugel2Radius,2*$Kugel2Radius,$hBrushgruen)
    ;Kugeln markieren wenn die Maus berührt
    If MouseGetPos(0) > $Kugel1X- $Kugel1Radius And MouseGetPos(0) < $Kugel1X + $Kugel1Radius And MouseGetPos(1) < $Kugel1Radius*Sin(($kugel1X+$Kugel1Radius-MouseGetPos(0))*(3.141/(2*$Kugel1Radius)))+$Kugel1Y And MouseGetPos(1) > - $Kugel1Radius*Sin(($kugel1X+$Kugel1Radius-MouseGetPos(0))*(3.141/(2*$Kugel1Radius)))+$Kugel1Y Then _GDIPlus_GraphicsDrawEllipse($hBuffer,$Kugel1X - $Kugel1Radius,$Kugel1Y - $Kugel1Radius,2*$Kugel1Radius,2*$Kugel1Radius,$hPenhellrot)
    If MouseGetPos(0) > $Kugel2X- $Kugel2Radius And MouseGetPos(0) < $Kugel2X + $Kugel2Radius And MouseGetPos(1) < $Kugel2Radius*Sin(($Kugel2X+$Kugel2Radius-MouseGetPos(0))*(3.141/(2*$Kugel2Radius)))+$Kugel2Y And MouseGetPos(1) > - $Kugel2Radius*Sin(($Kugel2X+$Kugel2Radius-MouseGetPos(0))*(3.141/(2*$Kugel2Radius)))+$Kugel2Y Then _GDIPlus_GraphicsDrawEllipse($hBuffer,$Kugel2X - $Kugel2Radius,$Kugel2Y - $Kugel2Radius,2*$Kugel2Radius,2*$Kugel2Radius,$hPendunkelgruen)
    ;Einstellen der Startgeschwindigkeit
    If MouseGetPos(0) > $Kugel1X- $Kugel1Mittelpunktkreis And MouseGetPos(0) < $Kugel1X + $Kugel1Mittelpunktkreis And MouseGetPos(1) < $Kugel1Mittelpunktkreis*Sin(($kugel1X+$Kugel1Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel1Mittelpunktkreis)))+$Kugel1Y And MouseGetPos(1) > - $Kugel1Mittelpunktkreis*Sin(($Kugel1X +$Kugel1Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel1Mittelpunktkreis)))+$Kugel1Y Then _GDIPlus_GraphicsDrawEllipse($hBuffer,$Kugel1X - $Kugel1Mittelpunktkreis,$Kugel1Y - $Kugel1Mittelpunktkreis,2*$Kugel1Mittelpunktkreis,2*$Kugel1Mittelpunktkreis,$hPenhellrot)
    If MouseGetPos(0) > $Kugel2X- $Kugel2Mittelpunktkreis And MouseGetPos(0) < $Kugel2X + $Kugel2Mittelpunktkreis And MouseGetPos(1) < $Kugel2Mittelpunktkreis*Sin(($kugel2X+$Kugel2Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel2Mittelpunktkreis)))+$Kugel2Y And MouseGetPos(1) > - $Kugel2Mittelpunktkreis*Sin(($Kugel2X +$Kugel2Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel2Mittelpunktkreis)))+$Kugel2Y Then _GDIPlus_GraphicsDrawEllipse($hBuffer,$Kugel2X - $Kugel2Mittelpunktkreis,$Kugel2Y - $Kugel2Mittelpunktkreis,2*$Kugel2Mittelpunktkreis,2*$Kugel2Mittelpunktkreis,$hPendunkelgruen)
    If MouseGetPos(0) > $Kugel1X- $Kugel1Mittelpunktkreis And MouseGetPos(0) < $Kugel1X + $Kugel1Mittelpunktkreis And MouseGetPos(1) < $Kugel1Mittelpunktkreis*Sin(($kugel1X+$Kugel1Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel1Mittelpunktkreis)))+$Kugel1Y And MouseGetPos(1) > - $Kugel1Mittelpunktkreis*Sin(($Kugel1X +$Kugel1Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel1Mittelpunktkreis)))+$Kugel1Y And _IsPressed("01") And $aGeschwindigkeitspfeile[0][4] = -1 Then $aGeschwindigkeitspfeile[0][4] = 0
    If MouseGetPos(0) > $Kugel2X- $Kugel2Mittelpunktkreis And MouseGetPos(0) < $Kugel2X + $Kugel2Mittelpunktkreis And MouseGetPos(1) < $Kugel2Mittelpunktkreis*Sin(($kugel2X+$Kugel2Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel2Mittelpunktkreis)))+$Kugel2Y And MouseGetPos(1) > - $Kugel2Mittelpunktkreis*Sin(($Kugel2X +$Kugel2Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel2Mittelpunktkreis)))+$Kugel2Y And _IsPressed("01") And $aGeschwindigkeitspfeile[1][4] = -1 Then $aGeschwindigkeitspfeile[1][4] = 0
    If $StartStop = 0 Then
    If $aGeschwindigkeitspfeile[0][4] = 0 Then
    $aGeschwindigkeitspfeile[0][0] = MouseGetPos(0)
    $aGeschwindigkeitspfeile[0][1] = $BodenY - $Kugel1Radius
    EndIf
    If $aGeschwindigkeitspfeile[1][4] = 0 Then
    $aGeschwindigkeitspfeile[1][0] = MouseGetPos(0)
    $aGeschwindigkeitspfeile[1][1] = $BodenY - $Kugel2Radius
    EndIf
    EndIf
    If MouseGetPos(0) > $Kugel1X- $Kugel1Mittelpunktkreis And MouseGetPos(0) < $Kugel1X + $Kugel1Mittelpunktkreis And MouseGetPos(1) < $Kugel1Mittelpunktkreis*Sin(($kugel1X+$Kugel1Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel1Mittelpunktkreis)))+$Kugel1Y And MouseGetPos(1) > - $Kugel1Mittelpunktkreis*Sin(($Kugel1X +$Kugel1Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel1Mittelpunktkreis)))+$Kugel1Y And _IsPressed("01") And $aGeschwindigkeitspfeile[0][4] = 0 Then $aGeschwindigkeitspfeile[0][4] = 1
    If MouseGetPos(0) > $Kugel2X- $Kugel2Mittelpunktkreis And MouseGetPos(0) < $Kugel2X + $Kugel2Mittelpunktkreis And MouseGetPos(1) < $Kugel2Mittelpunktkreis*Sin(($kugel2X+$Kugel2Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel2Mittelpunktkreis)))+$Kugel2Y And MouseGetPos(1) > - $Kugel2Mittelpunktkreis*Sin(($Kugel2X +$Kugel2Mittelpunktkreis-MouseGetPos(0))*(3.141/(2*$Kugel2Mittelpunktkreis)))+$Kugel2Y And _IsPressed("01") And $aGeschwindigkeitspfeile[1][4] = 0 Then $aGeschwindigkeitspfeile[1][4] = 1
    If $StartStop = 0 Then
    If $aGeschwindigkeitspfeile[0][4] = 1 Then
    $aGeschwindigkeitspfeile[0][2] = MouseGetPos(0)
    $aGeschwindigkeitspfeile[0][3] = $BodenY - $Kugel1Radius
    EndIf
    If $aGeschwindigkeitspfeile[1][4] = 1 Then
    $aGeschwindigkeitspfeile[1][2] = MouseGetPos(0)
    $aGeschwindigkeitspfeile[1][3] = $BodenY - $Kugel2Radius
    EndIf
    EndIf
    If $StartStop = 0 Then
    $aPfeilrot1[0][0] = 3
    $aPfeilrot1[1][0] = $aGeschwindigkeitspfeile[0][2]
    $aPfeilrot1[1][1] = $aGeschwindigkeitspfeile[0][3]
    $aPfeilrot1[2][0] = $aGeschwindigkeitspfeile[0][2] - 7
    $aPfeilrot1[2][1] = $aGeschwindigkeitspfeile[0][3] - 3
    $aPfeilrot1[3][0] = $aGeschwindigkeitspfeile[0][2] - 7
    $aPfeilrot1[3][1] = $aGeschwindigkeitspfeile[0][3] + 3
    $aPfeilrot2[0][0] = 3
    $aPfeilrot2[1][0] = $aGeschwindigkeitspfeile[0][2]
    $aPfeilrot2[1][1] = $aGeschwindigkeitspfeile[0][3]
    $aPfeilrot2[2][0] = $aGeschwindigkeitspfeile[0][2] + 7
    $aPfeilrot2[2][1] = $aGeschwindigkeitspfeile[0][3] - 3
    $aPfeilrot2[3][0] = $aGeschwindigkeitspfeile[0][2] + 7
    $aPfeilrot2[3][1] = $aGeschwindigkeitspfeile[0][3] + 3
    $aPfeilgruen1[0][0] = 3
    $aPfeilgruen1[1][0] = $aGeschwindigkeitspfeile[1][2]
    $aPfeilgruen1[1][1] = $aGeschwindigkeitspfeile[1][3]
    $aPfeilgruen1[2][0] = $aGeschwindigkeitspfeile[1][2] - 7
    $aPfeilgruen1[2][1] = $aGeschwindigkeitspfeile[1][3] - 3
    $aPfeilgruen1[3][0] = $aGeschwindigkeitspfeile[1][2] - 7
    $aPfeilgruen1[3][1] = $aGeschwindigkeitspfeile[1][3] + 3
    $aPfeilgruen2[0][0] = 3
    $aPfeilgruen2[1][0] = $aGeschwindigkeitspfeile[1][2]
    $aPfeilgruen2[1][1] = $aGeschwindigkeitspfeile[1][3]
    $aPfeilgruen2[2][0] = $aGeschwindigkeitspfeile[1][2] + 7
    $aPfeilgruen2[2][1] = $aGeschwindigkeitspfeile[1][3] - 3
    $aPfeilgruen2[3][0] = $aGeschwindigkeitspfeile[1][2] + 7
    $aPfeilgruen2[3][1] = $aGeschwindigkeitspfeile[1][3] + 3
    If $aGeschwindigkeitspfeile[0][4] > -1 Then
    If $aGeschwindigkeitspfeile[0][2] >= $aGeschwindigkeitspfeile[0][0] Then
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPfeilrot1,$hBrushrot)
    DllStructSetData($tLayout,"x",$aGeschwindigkeitspfeile[0][2] - 70)
    DllStructSetData($tLayout,"y",$aGeschwindigkeitspfeile[0][3] - 20)
    ElseIf $aGeschwindigkeitspfeile[0][2] < $aGeschwindigkeitspfeile[0][0] Then
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPfeilrot2,$hBrushrot)
    DllStructSetData($tLayout,"x",$aGeschwindigkeitspfeile[0][2] + 10)
    DllStructSetData($tLayout,"y",$aGeschwindigkeitspfeile[0][3] - 20)
    EndIf
    _GDIPlus_GraphicsDrawLine($hBuffer,$aGeschwindigkeitspfeile[0][0],$aGeschwindigkeitspfeile[0][1],$aGeschwindigkeitspfeile[0][2],$aGeschwindigkeitspfeile[0][3],$hPenrot)
    _GDIPlus_GraphicsDrawStringEx($hBuffer,Round($Kugel1Geschwindigkeit/1000,1) & " m/s",$hFont,$tLayout,$hFormat,$hBrushrot)
    Endif
    If $aGeschwindigkeitspfeile[1][4] > -1 Then
    If $aGeschwindigkeitspfeile[1][2] >= $aGeschwindigkeitspfeile[1][0] Then
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPfeilgruen1,$hBrushgruen)
    DllStructSetData($tLayout,"x",$aGeschwindigkeitspfeile[1][2] - 70)
    DllStructSetData($tLayout,"y",$aGeschwindigkeitspfeile[1][3] - 20)
    ElseIf $aGeschwindigkeitspfeile[1][2] < $aGeschwindigkeitspfeile[1][0] Then
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPfeilgruen2,$hBrushgruen)
    DllStructSetData($tLayout,"x",$aGeschwindigkeitspfeile[1][2] + 10)
    DllStructSetData($tLayout,"y",$aGeschwindigkeitspfeile[1][3] - 20)
    EndIf
    _GDIPlus_GraphicsDrawLine($hBuffer,$aGeschwindigkeitspfeile[1][0],$aGeschwindigkeitspfeile[1][1],$aGeschwindigkeitspfeile[1][2],$aGeschwindigkeitspfeile[1][3],$hPengruen)
    _GDIPlus_GraphicsDrawStringEx($hBuffer,Round($Kugel2Geschwindigkeit/1000,1) & " m/s",$hFont,$tLayout,$hFormat,$hBrushgruen)
    Endif
    If Not _IsPressed("01") And $aGeschwindigkeitspfeile[0][4] = 1 Then $aGeschwindigkeitspfeile[0][4] = 2
    If Not _IsPressed("01") And $aGeschwindigkeitspfeile[1][4] = 1 Then $aGeschwindigkeitspfeile[1][4] = 2
    EndIf
    ;graphische Werteeinstellungsaktionen
    _GDIPlus_GraphicsFillRect($hBuffer,10,10,230,120,$hBrushweiss)
    _GDIPlus_GraphicsDrawRect($hBuffer,10,10,230,120,$hPenrot)
    _GDIPlus_GraphicsDrawString($hBuffer,"Dichte:",20,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints1,$hBrushschwarz)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel1Dichte/1000,2) & " g/cm³",65,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints2,$hBrushschwarz)
    _GDIPlus_GraphicsDrawString($hBuffer,"Masse:",140,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints3,$hBrushschwarz)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel1Masse,1) & " kg",185,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints4,$hBrushschwarz)
    If MouseGetPos(0) > $aPoints1[1][0] And MouseGetPos(0) < $aPoints1[3][0] And MouseGetPos(1) > $aPoints1[2][1] And MouseGetPos(1) < $aPoints1[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints1,$hPenblau)
    If MouseGetPos(0) > $aPoints2[1][0] And MouseGetPos(0) < $aPoints2[3][0] And MouseGetPos(1) < $aPoints2[2][1] And MouseGetPos(1) > $aPoints2[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints2,$hPenblau)
    If MouseGetPos(0) > $aPoints3[1][0] And MouseGetPos(0) < $aPoints3[3][0] And MouseGetPos(1) > $aPoints3[2][1] And MouseGetPos(1) < $aPoints3[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints3,$hPenblau)
    If MouseGetPos(0) > $aPoints4[1][0] And MouseGetPos(0) < $aPoints4[3][0] And MouseGetPos(1) < $aPoints4[2][1] And MouseGetPos(1) > $aPoints4[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints4,$hPenblau)
    _GDIPlus_GraphicsDrawString($hBuffer,"v:",20,90)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel1Geschwindigkeit/1000,2) & " m/s",40,90)
    _GDIPlus_GraphicsDrawString($hBuffer,"Impuls:",115,90)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel1Masse*$Kugel1Geschwindigkeit/1000,2) & " kg*m/s",160,90)
    _GDIPlus_GraphicsFillRect($hBuffer,250,10,230,120,$hBrushweiss)
    _GDIPlus_GraphicsDrawRect($hBuffer,250,10,230,120,$hPengruen)
    _GDIPlus_GraphicsDrawString($hBuffer,"Dichte:",260,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints5,$hBrushschwarz)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel2Dichte/1000,2) & " g/cm³",305,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints6,$hBrushschwarz)
    _GDIPlus_GraphicsDrawString($hBuffer,"Masse:",380,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints7,$hBrushschwarz)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel2Masse,1) & " kg",425,30)
    _GDIPlus_GraphicsFillPolygon($hBuffer,$aPoints8,$hBrushschwarz)
    If MouseGetPos(0) > $aPoints5[1][0] And MouseGetPos(0) < $aPoints5[3][0] And MouseGetPos(1) > $aPoints5[2][1] And MouseGetPos(1) < $aPoints5[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints5,$hPenblau)
    If MouseGetPos(0) > $aPoints6[1][0] And MouseGetPos(0) < $aPoints6[3][0] And MouseGetPos(1) < $aPoints6[2][1] And MouseGetPos(1) > $aPoints6[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints6,$hPenblau)
    If MouseGetPos(0) > $aPoints7[1][0] And MouseGetPos(0) < $aPoints7[3][0] And MouseGetPos(1) > $aPoints7[2][1] And MouseGetPos(1) < $aPoints7[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints7,$hPenblau)
    If MouseGetPos(0) > $aPoints8[1][0] And MouseGetPos(0) < $aPoints8[3][0] And MouseGetPos(1) < $aPoints8[2][1] And MouseGetPos(1) > $aPoints8[1][1] Then _GDIPlus_GraphicsDrawPolygon($hBuffer,$aPoints8,$hPenblau)
    _GDIPlus_GraphicsDrawString($hBuffer,"v:",260,90)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel2Geschwindigkeit/1000,2) & " m/s",280,90)
    _GDIPlus_GraphicsDrawString($hBuffer,"Impuls:",355,90)
    _GDIPlus_GraphicsDrawString($hBuffer,Round($Kugel2Masse*$Kugel2Geschwindigkeit/1000,2) & " kg*m/s",400,90)
    ;Zeitangabe
    _GDIPlus_GraphicsFillRect($hBuffer,500,10,115,27,$hBrushweiss)
    _GDIPlus_GraphicsDrawRect($hBuffer,500,10,115,27,$hPenblau)
    _GDIPlus_GraphicsDrawString($hBuffer,"Zeit: ",505,15,"Arial",12)
    If $StartStop = 0 Or $StartStop = 1 Then
    $hBackBrush = $hBrushrot
    ElseIf $StartStop = 2 Then
    $hBackBrush = $hBrushgruen
    EndIf
    DllStructSetData($tLayout,"x",540)
    DllStructSetData($tLayout,"y",15)
    $Stunden = Floor($Zeit/3600)
    $Minuten = Floor(($Zeit - $Stunden*3600)/60)
    $Sekunden = Floor($Zeit - $Stunden*3600 - $Minuten*60)
    _GDIPlus_GraphicsDrawStringEx($hBuffer,Floor($Stunden/10) & $Stunden-Floor($Stunden/10)*10 & ":" & Floor($Minuten/10) & $Minuten-Floor($Minuten/10)*10 & ":" & Floor($Sekunden/10) & $Sekunden-Floor($Sekunden/10)*10,$hFont,$tLayout,$hFormat,$hBackBrush)
    If $StartStop = 2 Then $Zeit += 1/$FPS
    If _IsPressed("54") Then $FPS = InputBox("FPS","Frames Per Second:",$FPS)
    ;Verschieben der Kugeln mit der Maus
    If $StartStop = 0 Then
    If $Kugel2Halten = 0 And MouseGetPos(0) > $Kugel1X- $Kugel1Radius And MouseGetPos(0) < $Kugel1X + $Kugel1Radius And MouseGetPos(1) < $Kugel1Radius*Sin(($kugel1X+$Kugel1Radius-MouseGetPos(0))*(3.141/(2*$Kugel1Radius)))+$Kugel1Y And MouseGetPos(1) > - $Kugel1Radius*Sin(($kugel1X+$Kugel1Radius-MouseGetPos(0))*(3.141/(2*$Kugel1Radius)))+$Kugel1Y And _IsPressed("02") Then $Kugel1Halten = 1
    If $Kugel1Halten = 1 And $aGeschwindigkeitspfeile[0][4] = -1 Then $Kugel1X = MouseGetPos(0)
    If Not _IsPressed("02") Then $Kugel1Halten = 0
    If $Kugel1Halten = 0 And MouseGetPos(0) > $Kugel2X- $Kugel2Radius And MouseGetPos(0) < $Kugel2X + $Kugel2Radius And MouseGetPos(1) < $Kugel2Radius*Sin(($Kugel2X+$Kugel2Radius-MouseGetPos(0))*(3.141/(2*$Kugel2Radius)))+$Kugel2Y And MouseGetPos(1) > - $Kugel2Radius*Sin(($Kugel2X+$Kugel2Radius-MouseGetPos(0))*(3.141/(2*$Kugel2Radius)))+$Kugel2Y And _IsPressed("02") Then $Kugel2Halten = 1
    If $Kugel2Halten = 1 And $aGeschwindigkeitspfeile[1][4] = -1 Then $Kugel2X = MouseGetPos(0)
    If Not _IsPressed("02") Then $Kugel2Halten = 0
    ;Verändern der Werte durch Mausklicks
    If MouseGetPos(0) > $aPoints1[1][0] And MouseGetPos(0) < $aPoints1[3][0] And MouseGetPos(1) > $aPoints1[2][1] And MouseGetPos(1) < $aPoints1[1][1] And _IsPressed("01") Then $Kugel1Dichte += 100
    If MouseGetPos(0) > $aPoints2[1][0] And MouseGetPos(0) < $aPoints2[3][0] And MouseGetPos(1) < $aPoints2[2][1] And MouseGetPos(1) > $aPoints2[1][1] And _IsPressed("01") Then $Kugel1Dichte -= 100
    If MouseGetPos(0) > $aPoints3[1][0] And MouseGetPos(0) < $aPoints3[3][0] And MouseGetPos(1) > $aPoints3[2][1] And MouseGetPos(1) < $aPoints3[1][1] And _IsPressed("01") Then $Kugel1Masse += 0.1
    If MouseGetPos(0) > $aPoints4[1][0] And MouseGetPos(0) < $aPoints4[3][0] And MouseGetPos(1) < $aPoints4[2][1] And MouseGetPos(1) > $aPoints4[1][1] And _IsPressed("01") Then $Kugel1Masse -= 0.1
    If MouseGetPos(0) > $aPoints5[1][0] And MouseGetPos(0) < $aPoints5[3][0] And MouseGetPos(1) > $aPoints5[2][1] And MouseGetPos(1) < $aPoints5[1][1] And _IsPressed("01") Then $Kugel2Dichte += 100
    If MouseGetPos(0) > $aPoints6[1][0] And MouseGetPos(0) < $aPoints6[3][0] And MouseGetPos(1) < $aPoints6[2][1] And MouseGetPos(1) > $aPoints6[1][1] And _IsPressed("01") Then $Kugel2Dichte -= 100
    If MouseGetPos(0) > $aPoints7[1][0] And MouseGetPos(0) < $aPoints7[3][0] And MouseGetPos(1) > $aPoints7[2][1] And MouseGetPos(1) < $aPoints7[1][1] And _IsPressed("01") Then $Kugel2Masse += 0.1
    If MouseGetPos(0) > $aPoints8[1][0] And MouseGetPos(0) < $aPoints8[3][0] And MouseGetPos(1) < $aPoints8[2][1] And MouseGetPos(1) > $aPoints8[1][1] And _IsPressed("01") Then $Kugel2Masse -= 0.1
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,$iWidth,$iHeight)

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

    ;Wertebeschränkung
    If $Kugel1Dichte <= 10 Then $Kugel1Dichte = 10
    If $Kugel1Masse <= 0.1 Then $Kugel1Masse = 0.1
    If $Kugel2Dichte <= 10 Then $Kugel2Dichte = 10
    If $Kugel2Masse <= 0.1 Then $Kugel2Masse = 0.1
    If _IsPressed("01") And $Kugel1X < $Kugel1Radius Then $Kugel1X = $Kugel1Radius
    If _IsPressed("01") And $Kugel1X > $iWidth-$Kugel1Radius Then $Kugel1X = $iWidth - $Kugel1Radius
    If _IsPressed("01") And $Kugel2X < $Kugel2Radius Then $Kugel2X = $Kugel2Radius
    If _IsPressed("01") And $Kugel2X > $iWidth - $Kugel2Radius Then $Kugel2X = $iWidth-$Kugel2Radius
    ;Werteaktualisierung
    $Kugel1Radius = (($Kugel1Masse/$Kugel1Dichte)/((4/3)*3.141))^(1/3)*1000
    $Kugel2Radius = (($Kugel2Masse/$Kugel2Dichte)/((4/3)*3.141))^(1/3)*1000
    If $StartStop = 0 Then
    $Kugel1Geschwindigkeit = $aGeschwindigkeitspfeile[0][2]-$aGeschwindigkeitspfeile[0][0]
    $Kugel2Geschwindigkeit = $aGeschwindigkeitspfeile[1][2] - $aGeschwindigkeitspfeile[1][0]
    EndIf
    If $StartStop = 2 Then
    $Kugel1X += $Kugel1Geschwindigkeit/$FPS
    $Kugel2X += $Kugel2Geschwindigkeit/$FPS
    EndIf
    If $Kugel1X < $Kugel1Radius Then $Kugel1Geschwindigkeit *= -1
    If $Kugel1X > $iWidth - $Kugel1Radius Then $Kugel1Geschwindigkeit *= -1
    If $Kugel2X < $Kugel2Radius Then $Kugel2Geschwindigkeit *= -1
    If $Kugel2X > $iWidth - $Kugel2Radius Then $Kugel2Geschwindigkeit *= -1
    ;Kollisionsberechnung
    If Sqrt(($Kugel2X-$Kugel1X)^2+($Kugel2Y-$Kugel1Y)^2) <= $Kugel1Radius+$Kugel2Radius Then
    $BackKugel1Geschwindigkeit = $Kugel1Geschwindigkeit
    $BackKugel2Geschwindigkeit = $Kugel2Geschwindigkeit
    $Kugel1Geschwindigkeit = (2*$Kugel2Masse*$BackKugel2Geschwindigkeit + ($Kugel1Masse-$Kugel2Masse)*$BackKugel1Geschwindigkeit)/($Kugel1Masse+$Kugel2Masse)
    $Kugel2Geschwindigkeit = (2*$Kugel1Masse*$BackKugel1Geschwindigkeit + ($Kugel2Masse-$Kugel1Masse)*$BackKugel2Geschwindigkeit)/($Kugel1Masse+$Kugel2Masse)
    EndIf
    $Kugel1Y = $BodenY - $Kugel1Radius
    $Kugel2Y = $BodenY - $Kugel2Radius
    ;Zurücksetzen
    If _IsPressed("01") And _IsPressed("02") Then
    $Kugel1X = $Kugel1Radius
    $kugel2X = $iWidth - $Kugel2Radius
    $aGeschwindigkeitspfeile[0][0] = 0
    $aGeschwindigkeitspfeile[0][1] = 0
    $aGeschwindigkeitspfeile[0][2] = 0
    $aGeschwindigkeitspfeile[0][3] = 0
    $aGeschwindigkeitspfeile[0][4] = -1
    $aGeschwindigkeitspfeile[1][0] = 0
    $aGeschwindigkeitspfeile[1][1] = 0
    $aGeschwindigkeitspfeile[1][2] = 0
    $aGeschwindigkeitspfeile[1][3] = 0
    $aGeschwindigkeitspfeile[1][4] = -1
    $StartStop = 0
    $Zeit = 0
    EndIf
    ;Starten Pause
    If _IsPressed("20") And $StartStop = 0 And $StartStopZahl = 0 Then
    $StartStop = 2
    $StartStopZahl = 1
    ElseIf _IsPressed("20") And $StartStop > 0 And $StartStopZahl = 0 Then
    $StartStop += 1
    $StartStopZahl = 1
    EndIf
    If Not _IsPressed("20") Then $StartStopZahl = 0
    If $StartStop > 2 Then $StartStop = 1
    EndFunc
    Func _Hilfe()
    GUISetState(@SW_SHOW,$hWndHilfe)
    EndFunc
    Func _Hide()
    GUISetState(@SW_HIDE)
    EndFunc
    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    _GDIPlus_PenDispose($hPenrot)
    _GDIPlus_PenDispose($hPengruen)
    _GDIPlus_PenDispose($hPenhellrot)
    _GDIPlus_PenDispose($hPendunkelgruen)
    _GDIPlus_PenDispose($hPenblau)
    _GDIPlus_PenDispose($hPengrau)
    _GDIPlus_BrushDispose($hBrushrot)
    _GDIPlus_BrushDispose($hBrushgruen)
    _GDIPlus_BrushDispose($hBrushweiss)
    _GDIPlus_BrushDispose($hBrushschwarz)
    _GDIPlus_BrushDispose($hBrushhellrot)
    _GDIPlus_BrushDispose($hBrushrottransparent)
    _GDIPlus_BrushDispose($hBrushgruentransparent)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von mazZ (21. November 2010 um 21:09)

  • Wow, sieht prima aus. :thumbup:
    Das lässt sich auch noch effektiver gestalten, aber scheint ja ganz gut zu funktionieren. Allerdings scheint mir die FPS Variable ein wenig falsch verwendet...
    So würde ich es machen (dann ist es auch nicht so sehr von der Computerleistung abhängig) ;).

    [autoit]

    AdlibRegister("_Draw", Round(1/$FPS*1000))

    [/autoit]
  • So,

    des mit $FPS hab ich behoben und noch eine extra Einstellung der Variablen mit der Taste "T" eingebaut.

    Doch weil ich an einem sehr laaangsamen LapTop zur Zeit arbeiten muss, wollt ich mal fragen, bei welchem Wert für $FPS das ganze normal in Echtzeit an anderen Computern läuft.

    Wenn jemand noch mal Fehlerlesen könnte, damit auch keine Fehler unentdeckt bleiben, fänd ich das super, denn ich überseh manchmal welche :S .

    Vielen Dank im Vorraus


    mazZ

  • Zitat

    Wenn jemand noch mal Fehlerlesen könnte, damit auch keine Fehler unentdeckt bleiben, fänd ich das super, denn ich überseh manchmal welche :S .


    Fehler sind meiner Meinung nach in "Spaghetticode" auch schwer zu finden :D. Ich denke mit ein paar mehr Funktionen könnte man das auch übersichtlicher gestalten. So fällt die Fehlersuche oft leichter.

  • Srry,
    übersichtlich ist es wirklich nicht;
    ich hab auch mehr so was wie Recourcen richtig freigegeben gemeint und so...

    Zitat

    " Das lässt sich auch noch effektiver gestalten, aber scheint ja ganz gut zu funktionieren."(name22)

    Was ist damit gemeint?

    Einmal editiert, zuletzt von mazZ (21. November 2010 um 22:59)