#include <GUIConstants.au3>
#include <GDIPlus.au3>

Global $GUIWidth = 400 ;Breite des Fensters
Global $GUIHeight = 400 ;Höhe des Fensters
Global $Size = 3 ;Durchmesser des Kreises der die einzelnen Bögen vervollständigt
Global $PenSize = 1 ;Randstärke der Linie
Global $Angle = Random(0, 3, 1) * 90 ;Startwinkel (Gültige Werte: 0°, 90°, 180°, 270°)
Global $iX = Random($Size, $GUIWidth / $Size - $Size, 1) * $Size ;X-Startkoordinate
Global $iY = Random($Size, $GUIHeight / $Size - $Size, 1) * $Size ;Y-Startkoordinate
Global $GUIColorBG = 0xFFFFFFFF ;Hintergrundfarbe der GUI
Global $LineColor = 0xFF000000 ;Farbe der geschlängelten Linie
Global $RandomFactor = 40 ;Wahrscheinlichkeit eines Richtungswechsels (1 zu...)

If $Angle = 0 Then
	Global $VectorX = $Size
	Global $VectorY = 0
ElseIf $Angle = 90 Then
	Global $VectorX = 0
	Global $VectorY = $Size
ElseIf $Angle = 180 Then
	Global $VectorX = $Size * - 1
	Global $VectorY = 0
ElseIf $Angle = 270 Then
	Global $VectorX = 0
	Global $VectorY = $Size * - 1
EndIf

Global $Switch180 = 180

$hGUI = GUICreate("Schlangenlinien", $GUIWidth, $GUIHeight)
GUISetState()

_GDIPlus_Startup()

Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($GUIWidth, $GUIHeight, $hGraphics)
Global $Buffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($Buffer, 2)
_GDIPlus_GraphicsClear($Buffer, $GUIColorBG)

Global $hPen = _GDIPlus_PenCreate($LineColor, $PenSize)

AdlibRegister("_DrawArc", 20)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			_GDIPlus_GraphicsDispose($hGraphics)
			_GDIPlus_PenDispose($hPen)
			_GDIPlus_Shutdown()
			Exit
	EndSwitch
WEnd

Func _DrawArc()
	If Random(1, 40, 1) = 1 Then
		_ChangeDirection()
	EndIf
	#Region CollisionCheck
	If $iX >= $GUIWidth - $Size * 2 And $Angle = 0 And $iY < $GUIHeight / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size
		$Angle = 90
	EndIf
	If $iX >= $GUIWidth - $Size * 2 And $Angle = 0 And $iY >= $GUIHeight / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size * - 1
		$Angle = 270
	EndIf
	If $iX <= 0 And $Angle = 180 And $iY < $GUIHeight / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size
		$Angle = 90
	EndIf
	If $iX <= 0 And $Angle = 180 And $iY >= $GUIHeight / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = 0
		$VectorY = $Size * - 1
		$Angle = 270
	EndIf
	If $iY >= $GUIHeight - $Size * 2 And $Angle = 90 And $iX < $GUIWidth / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size
		$VectorY = 0
		$Angle = 0
	EndIf
	If $iY >= $GUIHeight - $Size * 2 And $Angle = 90 And $iX >= $GUIWidth / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size * - 1
		$VectorY = 0
		$Angle = 180
	EndIf
	If $iY <= 0 And $Angle = 270 And $iX < $GUIHeight / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size
		$VectorY = 0
		$Angle = 0
	EndIf
	If $iY <= 0 And $Angle = 270 And $iX >= $GUIHeight / 2 Then
		_GDIPlus_GraphicsDrawEllipse($Buffer, $iX, $iY, $Size, $Size, $hPen)
		$VectorX = $Size * - 1
		$VectorY = 0
		$Angle = 180
	EndIf
	#EndRegion CollisionCheck
	$iX += $VectorX
	$iY += $VectorY
	$Switch180 *= -1
	_GDIPlus_GraphicsDrawArc($Buffer, $iX, $iY, $Size, $Size, $Angle, $Switch180, $hPen)
	_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $GUIWidth, $GUIHeight)
EndFunc   ;==>_DrawArc

Func _ChangeDirection()
	If $Angle = 0 Or $Angle = 180 Then
		If Random(0, 1, 1) = 1 Then
			$Angle = 90
		Else
			$Angle = 270
		EndIf
	ElseIf $Angle = 90 Or $Angle = 270 Then
		If Random(0, 1, 1) = 1 Then
			$Angle = 0
		Else
			$Angle = 180
		EndIf
	EndIf
	If $iX >= $GUIWidth - $Size * 2 Then $Angle = 180
	If $iY >= $GUIHeight - $Size * 2 Then $Angle = 270
	If $iX <= 0 Then $Angle = 0
	If $iY <= 0 Then $Angle = 90
	If $Angle = 0 Then
		$VectorX = $Size
		$VectorY = 0
	ElseIf $Angle = 90 Then
		$VectorX = 0
		$VectorY = $Size
	ElseIf $Angle = 180 Then
		$VectorX = $Size * - 1
		$VectorY = 0
	ElseIf $Angle = 270 Then
		$VectorX = 0
		$VectorY = $Size * - 1
	EndIf
	_GDIPlus_GraphicsDrawEllipse($hGraphics, $iX, $iY, $Size, $Size, $hPen)
EndFunc   ;==>_ChangeDirection
