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
#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
$hWnd = GUICreate("Impuls - Simulation",$iWidth,$iHeight,-1,-1)
GUISetState(@SW_SHOW)
GUISetOnEvent(-3,"_Exit")
WinSetTrans("Impuls - Simulation","",255)
HotKeySet("{F1}","_Hilfe")
$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")
_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)
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)
;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