#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.1
Author: Bakku
Script Function:
Sierpinski-Dreieck
#ce ----------------------------------------------------------------------------
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
_GDIPlus_Startup()
Global $sTitle = "Sierpinski - by Bakku (http://www.autoit.de)"
Global $iWidth = 500
Global $iHeight = 400
Global $hWnd, $hGUI
Global $hGraphics, $hBitmap, $hBuffer
Global $hBrushWhite, $hBrushRed, $hBrushGreen, $hBrushBlue, $hBrushBlack
Global $aStartCoordinates[4][2] ; Coordinates for the first Polygon
Global $bRandomBrush ; Should the colors just be black and white or random
Global $hGUIPreferences, $hGenerate, $hInput, $hCheckbox
Global $bPreferences = True
Global $iN ; Amount of Rounds
$aStartCoordinates[0][0] = 3
$aStartCoordinates[1][0] = 250
$aStartCoordinates[1][1] = 50
$aStartCoordinates[2][0] = 50
$aStartCoordinates[2][1] = 350
$aStartCoordinates[3][0] = 450
$aStartCoordinates[3][1] = 350
;--------------------------------------Sierpinski-GUI Creation-----------------------------------------------------------------------------
$hGUI = GUICreate($sTitle, $iWidth, $iHeight)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$hWnd = WinGetHandle($sTitle)
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
$hBrushWhite = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
$hBrushRed = _GDIPlus_BrushCreateSolid(0xFFFF0000)
$hBrushGreen = _GDIPlus_BrushCreateSolid(0xFF00FF00)
$hBrushBlue = _GDIPlus_BrushCreateSolid(0xFF0000FF)
$hBrushBlack = _GDIPlus_BrushCreateSolid(0xFF000000)
_GDIPlus_GraphicsClear($hBuffer, 0xFF000000)
_GDIPlus_GraphicsFillPolygon($hBuffer, $aStartCoordinates, $hBrushWhite)
GUIRegisterMsg($WM_PAINT, "WM_PAINT")
;----------------------------------------END Sierpinski-GUI --------------------------------------------------------------------------------------
;---------------------------------------Preferences-GUI-------------------------------------------------------------------------------------------
$hGUIPreferences = GUICreate("Generate", 200, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$hGenerate = GUICtrlCreateButton("Generate", 50, 150, 100, 25)
GUICtrlSetOnEvent($hGenerate, "_Generate")
$hCheckbox = GUICtrlCreateCheckbox("Black/White", 60, 20)
GUICtrlCreateLabel("Rounds:", 60, 70)
$hInput = GUICtrlCreateInput("", 110, 68, 20, 20, $ES_NUMBER)
GUISetState(@SW_SHOW, $hGUIPreferences)
; As long as $bPreferences is true, the Preferences-GUI is visible and $hGUI not
While ($bPreferences)
WEnd
GUISetState(@SW_HIDE, $hGUIPreferences)
;---------------------------------------END Preferences-GUI-----------------------------------------------------------------------------------------
GUISetState(@SW_SHOW, $hGUI)
; Starts the first Sierpinski-Round
Sierpinski($aStartCoordinates[1][0], $aStartCoordinates[1][1], $aStartCoordinates[2][0], $aStartCoordinates[2][1], $aStartCoordinates[3][0], $aStartCoordinates[3][1], $iN)
While 1 * Sleep(10)
WEnd
Func Sierpinski($iX1, $iY1, $iX2, $iY2, $iX3, $iY3, $n)
; If $n == 0 --> end of the sierpinski-triangle
If ($n > 0) Then
Local $aReturnCoordinates[4][2]
$aReturnCoordinates[0][0] = 3
; ax = (x1 + x2) / 2
; ay = (y1 + y2) / 2
$aReturnCoordinates[1][0] = ($iX1 + $iX2) / 2
$aReturnCoordinates[1][1] = ($iY1 + $iY2) / 2
; bx = (x2 + x3) / 2
; by = (y2 + y3) / 2
$aReturnCoordinates[2][0] = ($iX2 + $iX3) / 2
$aReturnCoordinates[2][1] = ($iY2 + $iY3) / 2
; cx = (x1 + x3) / 2
; cx = (y1 + y3) / 2
$aReturnCoordinates[3][0] = ($iX1 + $iX3) / 2
$aReturnCoordinates[3][1] = ($iY1 + $iY3) / 2
_GDIPlus_GraphicsFillPolygon($hBuffer, $aReturnCoordinates, _RandomBrush())
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_INTERNALPAINT)
; sierpinski-function calls for the new three triangles
Sierpinski($iX1, $iY1, $aReturnCoordinates[1][0], $aReturnCoordinates[1][1], $aReturnCoordinates[3][0], $aReturnCoordinates[3][1], $n - 1)
Sierpinski($iX2, $iY2, $aReturnCoordinates[1][0], $aReturnCoordinates[1][1], $aReturnCoordinates[2][0], $aReturnCoordinates[2][1], $n - 1)
Sierpinski($iX3, $iY3, $aReturnCoordinates[2][0], $aReturnCoordinates[2][1], $aReturnCoordinates[3][0], $aReturnCoordinates[3][1], $n - 1)
EndIf
EndFunc
Func _RandomBrush()
If ($bRandomBrush == True) Then
Local $Rnd
$Rnd = Random(1, 4, 1)
Switch $Rnd
Case 1
Return $hBrushWhite
Case 2
Return $hBrushRed
Case 3
Return $hBrushGreen
Case 4
Return $hBrushBlue
EndSwitch
EndIf
EndFunc
Func _Generate()
If (GUICtrlRead($hInput) == "") Then
MsgBox(16, "Error", "No number of rounds given!")
Return 0
EndIf
$iN = GUICtrlRead($hInput)
If (GUICtrlRead($hCheckbox) == $GUI_CHECKED) Then
$bRandomBrush = False
Else
$bRandomBrush = True
EndIf
$bPreferences = False
EndFunc
Func WM_PAINT()
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iWidth, $iHeight)
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
EndFunc
Func _Exit()
_GDIPlus_BrushDispose($hBrushBlack)
_GDIPlus_BrushDispose($hBrushBlue)
_GDIPlus_BrushDispose($hBrushGreen)
_GDIPlus_BrushDispose($hBrushRed)
_GDIPlus_BrushDispose($hBrushWhite)
_GDIPlus_ImageDispose($hBuffer)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
Exit
EndFunc