Advertisement
Guest User

Untitled

a guest
Jun 21st, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 7.95 KB | None | 0 0
  1.  
  2. Opt('GUIOnEventMode', 1)
  3.  
  4. #include <GDIPlus.au3>
  5. #include <Array.au3>
  6. #include <WindowsConstants.au3>
  7.  
  8. Global $iAnzahl      = 30
  9. Global $fKnotenMasse = 0.05 ; Kilogramm
  10. Global $fLenRuhe     = 0.5  ; Meter
  11. Global $fZeitschritt = 1/60/2 ; Sekunden
  12. Global $iMaxSteps    = 9
  13. Global $iD = 6
  14.  
  15. Global $dtQuadratDurchZwei = $fZeitschritt * $fZeitschritt * 0.5
  16. Global $dtQuadrat = $fZeitschritt * $fZeitschritt
  17.  
  18. Global $fFederKonstanteProLen_Struktur = 50  ; Größere Zahlen = härtere federn
  19. Global $fFederKonstanteProLen_Biege1   = 10   ;
  20. Global $fFederKonstanteProLen_Biege2   = 2.0   ;
  21. Global $fDaempfungsgrad_Struktur       = 0.2 ; 0.0 = Ungedämpft
  22. Global $fDaempfungsgrad_Biege1         = 0.2 ; 0.5 = Etwas gedämpft
  23. Global $fDaempfungsgrad_Biege2         = 0.1   ; 1.0 = Aperiodischer Grenzfall (kein Überschwingen)
  24.  
  25. Global $fGravityZ = 9.81
  26. Global $aOffset = Vec2()
  27. Global $fLen_Struktur = 1 * $fLenRuhe
  28. Global $fLen_Biege1   = 2 * $fLenRuhe
  29. Global $fLen_Biege2   = 3 * $fLenRuhe
  30. Global $fFederKonstante_Struktur = $fFederKonstanteProLen_Struktur * $fLen_Struktur
  31. Global $fFederKonstante_Biege1 = $fFederKonstanteProLen_Biege1 * $fLen_Biege1
  32. Global $fFederKonstante_Biege2 = $fFederKonstanteProLen_Biege2 * $fLen_Biege2
  33. Global $fDaempfungskonstante_Struktur = 2 * Sqrt($fKnotenMasse * $fFederKonstante_Struktur) * $fDaempfungsgrad_Struktur
  34. Global $fDaempfungskonstante_Biege1 = 2 * Sqrt($fKnotenMasse * $fFederKonstante_Biege1) * $fDaempfungsgrad_Biege1
  35. Global $fDaempfungskonstante_Biege2 = 2 * Sqrt($fKnotenMasse * $fFederKonstante_Biege2) * $fDaempfungsgrad_Biege2
  36. Global $afLen = [$fLen_Struktur, $fLen_Biege1, $fLen_Biege2]
  37. Global $afFederKonstante = [$fFederKonstante_Struktur, $fFederKonstante_Biege1, $fFederKonstante_Biege2]
  38. Global $afDaempfungskonstante = [$fDaempfungskonstante_Struktur, $fDaempfungskonstante_Biege1, $fDaempfungskonstante_Biege2]
  39.  
  40.  
  41. Global $aPos_Minus1[$iAnzahl][2]
  42. Global $aPos[$iAnzahl][4]
  43. Global $aVel[$iAnzahl][2]
  44.  
  45. ;~ Global $aFedern[][2]
  46.  
  47. Reset2()
  48.  
  49. ;~ Func Knoten($x = 0, $x_minus_1 = 0, $v = 0)
  50. ;~  Local $v = DllStructCreate('float x;float y;float x_minus1;float y_minus1;float vx;float vy')
  51. ;~ EndFunc
  52.  
  53. ;~ Func Feder($i, $j, $fLen, $fFederKonst, $fDaempfungsKonst)
  54. ;~ EndFunc
  55.  
  56.  
  57. Global $bExit = False
  58.  
  59. _GDIPlus_Startup()
  60. Global $iW = 500, $iH = 600
  61. Global $hGUI = GUICreate('Pendel', $iW, $iH)
  62.  
  63. Global Const $hDC = _WinAPI_GetDC($hGUI)
  64. Global Const $hDC_backbuffer = _WinAPI_CreateCompatibleDC($hDC)
  65. Global Const $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
  66. Global Const $DC_obj = _WinAPI_SelectObject($hDC_backbuffer, $hHBitmap)
  67. Global Const $hBUF = _GDIPlus_GraphicsCreateFromHDC($hDC_backbuffer)
  68.  
  69. Global $hBRU = _GDIPlus_BrushCreateSolid(0xFFE5BE01)
  70. Global $hPEN = _GDIPlus_PenCreate(0xFFD4D9DB)
  71. _GDIPlus_GraphicsSetSmoothingMode($hBUF, 2)
  72. _GDIPlus_GraphicsSetPixelOffsetMode($hBUF, 2)
  73.  
  74. GUISetOnEvent(-3, EVENT, $hGUI)
  75. GUISetState(@SW_SHOW, $hGUI)
  76.  
  77. Global $iTimer = TimerInit()
  78. Global $fFrameTime, $fOverlap, $iStepCounter = 0, $count = 0
  79.  
  80. While Not $bExit And Sleep(0)
  81.     $fFrameTime = TimerDiff($iTimer)
  82.     $iTimer = TimerInit()
  83.     _GDIPlus_GraphicsClear($hBUF, 0xFF606060)
  84.  
  85.     $iStepCounter = 0
  86.     For $i = $fFrameTime + $fOverlap To 0 Step -$fZeitschritt * 1000
  87.         Verlet2()
  88.         $iStepCounter += 1
  89.         If $iStepCounter = $iMaxSteps Then
  90.             $fFrameTime = -($fOverlap - $iStepCounter * $fZeitschritt * 1000)
  91.             ExitLoop
  92.         EndIf
  93.     Next
  94.     $count += 1
  95. ;~  ConsoleWrite($iStepCounter & ' ')
  96. ;~  If IsInt($count/50) Then ConsoleWrite(@CRLF)
  97.     $fOverlap = $fFrameTime + $fOverlap - $iStepCounter * $fZeitschritt * 1000
  98.     Render()
  99.     _WinAPI_BitBlt($hDC, 0, 0, $iW, $iH, $hDC_backbuffer, 0, 0, $SRCCOPY)
  100. WEnd
  101.  
  102. _GDIPlus_PenDispose($hPEN)
  103. _GDIPlus_BrushDispose($hBRU)
  104. _GDIPlus_GraphicsDispose($hBUF)
  105. _WinAPI_SelectObject($hDC_backbuffer, $DC_obj)
  106. _WinAPI_DeleteDC($hDC_backbuffer)
  107. _WinAPI_DeleteObject($hHBitmap)
  108. _WinAPI_DeleteObject($hDC_backbuffer)
  109. _WinAPI_ReleaseDC($hGUI, $hDC)
  110. _GDIPlus_Shutdown()
  111.  
  112. Func Render($bKugel = 1)
  113.     For $i = 0 To $iAnzahl - 1 Step 1
  114.         $aPos[$i][2] = $aPos[$i][0] * $iW / ($iAnzahl + 1) + $iW/2 - $iD/2
  115.         $aPos[$i][3] = $aPos[$i][1] * $iW / ($iAnzahl - 10) + $iH/10 - $iD/2
  116.         If $i > 0 Then
  117.             DllCall($__g_hGDIPDll, "int", "GdipDrawLine", "handle", $hBUF, "handle", $hPEN, "float", $aPos[$i][2] + $iD / 2, "float", $aPos[$i][3] + $iD / 2, _
  118.                 "float", $aPos[$i - 1][2] + $iD / 2, "float", $aPos[$i - 1][3] + $iD / 2)
  119.         EndIf
  120.     Next
  121.     If $bKugel Then
  122.         For $i = 0 To $iAnzahl - 1 Step 1
  123.             DllCall($__g_hGDIPDll, "int", "GdipFillEllipse", "handle", $hBUF, "handle", $hBRU, "float", $aPos[$i][2], "float", $aPos[$i][3], "float", $iD, "float", $iD)
  124.         Next
  125.     EndIf
  126. EndFunc
  127.  
  128. Func EVENT()
  129.     Switch @GUI_CtrlId
  130.         Case -3
  131.             $bExit = True
  132.     EndSwitch
  133. EndFunc
  134.  
  135. Func Verlet2()
  136.     Local $f, $aPos_Plus1[$iAnzahl][2], $pos_plus_1
  137.     For $i = 0 To $iAnzahl - 1 Step 1
  138.         $aVel[$i][0] = ($aPos[$i][0] - $aPos_Minus1[$i][0])/$fZeitschritt
  139.         $aVel[$i][1] = ($aPos[$i][1] - $aPos_Minus1[$i][1])/$fZeitschritt
  140.     Next
  141.     For $i = 0 To $iAnzahl - 1 Step 1
  142.         $f = Kraft2($i, $aPos, $aVel)
  143.         $aPos_Plus1[$i][0] = $aPos[$i][0] * 2 - $aPos_Minus1[$i][0] + $f[0] * $dtQuadrat
  144.         $aPos_Plus1[$i][1] = $aPos[$i][1] * 2 - $aPos_Minus1[$i][1] + $f[1] * $dtQuadrat
  145.     Next
  146.     For $i = 0 To $iAnzahl - 1 Step 1
  147.         $aPos_Minus1[$i][0] = $aPos[$i][0]
  148.         $aPos_Minus1[$i][1] = $aPos[$i][1]
  149.         $aPos[$i][0] = $aPos_Plus1[$i][0]
  150.         $aPos[$i][1] = $aPos_Plus1[$i][1]
  151.     Next
  152. EndFunc
  153.  
  154. Func Reset2()
  155.     Local $f, $pos0
  156.     For $i = 0 To $iAnzahl - 1 Step 1
  157.         $aPos_Minus1[$i][0] = $aOffset[0] + $i * $fLenRuhe / Sqrt(2); X
  158.         $aPos_Minus1[$i][1] = $aOffset[1] + $i * $fLenRuhe / Sqrt(2); Y
  159.     Next
  160.     For $i = 0 To $iAnzahl - 1 Step 1
  161.         $f = Kraft2($i, $aPos_Minus1, $aVel)
  162.         $pos0 = Add2(Vec2($aPos_Minus1[$i][0], $aPos_Minus1[$i][1]), Mul2(Div2($f, $fKnotenMasse),$dtQuadratDurchZwei))
  163.         $aPos[$i][0] = $Pos0[0]
  164.         $aPos[$i][1] = $Pos0[1]
  165.     Next
  166. EndFunc
  167.  
  168. Func FederKraft2($i, $iOffset, ByRef $x, ByRef $v, ByRef $f)
  169.     Local $xij = [$x[$i + $iOffset][0] - $x[$i][0], $x[$i + $iOffset][1] - $x[$i][1]]
  170.     Local $bxij = Sqrt($xij[0] * $xij[0] + $xij[1] * $xij[1]), $nxij = [$xij[0] / $bxij, $xij[1] / $bxij], $o = Abs($iOffset) - 1
  171.     Local $c = $afFederKonstante[$o] * ($bxij - $afLen[$o]) + $afDaempfungskonstante[$o] * (($v[$i + $iOffset][0] - $v[$i][0]) * $nxij[0] + ($v[$i + $iOffset][1] - $v[$i][1]) * $nxij[1])
  172.     $f[0] += $c * $nxij[0]
  173.     $f[1] += $c * $nxij[1]
  174. EndFunc
  175.  
  176.  
  177.  
  178. Func Kraft2($i, ByRef $x, ByRef $v)
  179.     If $i = 0 Then Return Vec2()
  180.     Local $f = [0, $fGravityZ * $fKnotenMasse]
  181.  
  182.     Switch $i ; Federn nach oben
  183.         Case 1 ; -1
  184.             FederKraft2($i, -1, $x, $v, $f)
  185.         Case 2 ; -1, -2
  186.             FederKraft2($i, -2, $x, $v, $f)
  187.             FederKraft2($i, -1, $x, $v, $f)
  188.         Case 3 To $iAnzahl ; -1, -2, -3
  189.             FederKraft2($i, -3, $x, $v, $f)
  190.             FederKraft2($i, -2, $x, $v, $f)
  191.             FederKraft2($i, -1, $x, $v, $f)
  192.     EndSwitch
  193.     Switch $iAnzahl - $i - 1
  194.         Case 1
  195.             FederKraft2($i, 1, $x, $v, $f)
  196.         Case 2
  197.             FederKraft2($i, 1, $x, $v, $f)
  198.             FederKraft2($i, 2, $x, $v, $f)
  199.         Case 3 To $iAnzahl
  200.             FederKraft2($i, 1, $x, $v, $f)
  201.             FederKraft2($i, 2, $x, $v, $f)
  202.             FederKraft2($i, 3, $x, $v, $f)
  203.     EndSwitch
  204.     $f[0] /= $fKnotenMasse
  205.     $f[1] /= $fKnotenMasse
  206.     Return $f
  207. EndFunc
  208.  
  209.  
  210. Func Betrag2($a)
  211.     Return Sqrt($a[0] * $a[0] + $a[1] * $a[1])
  212. EndFunc
  213.  
  214. Func Norm2($a)
  215.     Local $d = Sqrt($a[0] * $a[0] + $a[1] * $a[1]), $c = [$a[0] / $d, $a[1] / $d]
  216.     Return $c
  217. EndFunc
  218.  
  219. Func Vec2($a = 0, $b = 0)
  220.     Local $c = [$a, $b]
  221.     Return $c
  222. EndFunc
  223.  
  224. Func Div2($a, $b)
  225.     If IsArray($a) And Not IsArray($b) Then Return Vec2($a[0] / $b, $a[1] / $b)
  226. EndFunc
  227.  
  228. Func Mul2($a, $b)
  229.     If IsArray($a) Then
  230.         If IsArray($b) Then
  231.             Return $a[0] * $b[0] + $a[1] * $b[1]
  232.         Else
  233.             Return Vec2($a[0] * $b, $a[1] * $b)
  234.         EndIf
  235.     Else
  236.         If IsArray($b) Then
  237.             Return Vec2($b[0] * $a, $b[1] * $a)
  238.         Else
  239.             Return $a * $b
  240.         EndIf
  241.     EndIf
  242. EndFunc
  243.  
  244. Func Add2($a, $b)
  245.     Return Vec2($a[0] + $b[0], $a[1] + $b[1])
  246. EndFunc
  247.  
  248. Func Sub2($a, $b)
  249.     Return Vec2($a[0] - $b[0], $a[1] - $b[1])
  250. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement