#include <GDIP.au3>
#include <Array.au3>

$iWidth = 800
$iHeight = 800

$iIterations = 8 ;Bitte vorsichtig erhöhen, da ALLE Koordinaten des Fraktals zum selben Zeitpunkt im Speicher sind.

$hWnd = GUICreate("GDI+ Sierpinski-Triangle | Iterations: " & $iIterations, $iWidth, $iHeight)
GUISetState()

_GDIPlus_Startup()

$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
_GDIPlus_GraphicsSetPixelOffsetMode($hGraphics, 2)
_GDIPlus_GraphicsClear($hBuffer, 0xFFFFFFFF)

$hBrush = _GDIPlus_BrushCreateSolid()

Global $aCoord[3 ^ ($iIterations + 1) + 1][2] = [[3]]
$aCoord[1][0] = 0
$aCoord[1][1] = 0
$aCoord[2][0] = $iWidth
$aCoord[2][1] = 0
$aCoord[3][0] = $iWidth / 2
$aCoord[3][1] = Sqrt($iWidth ^ 2 - ($iWidth / 2) ^ 2)

For $iI = 1 To $iIterations
	$aOld = $aCoord
	$aCoord[0][0] = 0
	For $i = 1 To $aOld[0][0] Step 3
		$nTriBX = $aOld[$i + 2][0] - $aOld[$i][0]
		$nTriCX = ($aOld[$i + 2][0] - $aOld[$i][0]) / 2
		$nTriCY = ($aOld[$i + 2][1] - $aOld[$i][1]) / 2

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i][0]
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1]

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i][0] + $nTriBX
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1]

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i][0] + $nTriCX
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1] + $nTriCY

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i][0] + $nTriBX
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1]

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i + 1][0]
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1]

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i][0] + $nTriBX + $nTriCX
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1] + $nTriCY

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i][0] + $nTriCX
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1] + $nTriCY

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i][0] + $nTriBX + $nTriCX
		$aCoord[$aCoord[0][0]][1] = $aOld[$i][1] + $nTriCY

		$aCoord[0][0] += 1
		$aCoord[$aCoord[0][0]][0] = $aOld[$i + 2][0]
		$aCoord[$aCoord[0][0]][1] = $aOld[$i + 2][1]
	Next
Next

Dim $aTmp[4][2] = [[3]]
For $i = 1 To $aCoord[0][0] Step 3
	$aTmp[1][0] = $aCoord[$i][0]
	$aTmp[1][1] = $iHeight - $aCoord[$i][1]
	$aTmp[2][0] = $aCoord[$i + 1][0]
	$aTmp[2][1] = $iHeight - $aCoord[$i + 1][1]
	$aTmp[3][0] = $aCoord[$i + 2][0]
	$aTmp[3][1] = $iHeight - $aCoord[$i + 2][1]
	_GDIPlus_GraphicsFillPolygon($hBuffer, $aTmp, $hBrush)
Next

_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight)

_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_GraphicsDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_Shutdown()

While GUIGetMsg() <> -3
WEnd
