Liebe Community,
vor kurzen habe ich mal als ich mir die Rekursion in Java angeeignet habe das Sierpinski-Dreieck programmiert. Wer nicht weiß was das Sierpinski-Dreieck ist, der findet hier etwas dazu.
Ich wollte das gleiche nochmal in AutoIt verfassen und hier ist das fertige Script.
Man kann einstellen ob das Dreieck nur Schwarz/Weiß dargestellt werden soll oder mit unterschiedlichen Farben (hier: Rot/Blau/Grün/Weiß).
Und man kann noch die Anzahl der Runden festlegen, also wie oft das Dreieck zerteilt werden soll.
Nur damit ihr nicht eine zu große Zahl eingebt und euer Computer dann nachhechelt, auf meinem PC ist "7" eine gute Anzahl von Runden. Ich brauche dafür ca. 10 Sekunden.
Außerdem wenn man die Anzahl von Runden zu hoch einstellt, dann sieht es nicht mehr besonders gut aus :).
Also ich hoffe es gefällt euch.
Spoiler anzeigen
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.6.1
Author: Bakku
Script Function:
Sierpinski-Dreieck
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]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-----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate($sTitle, $iWidth, $iHeight)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
$hWnd = WinGetHandle($sTitle)
[/autoit] [autoit][/autoit] [autoit]$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)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsFillPolygon($hBuffer, $aStartCoordinates, $hBrushWhite)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_PAINT, "WM_PAINT")
[/autoit] [autoit][/autoit] [autoit];----------------------------------------END Sierpinski-GUI --------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];---------------------------------------Preferences-GUI-------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]$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)
[/autoit] [autoit][/autoit] [autoit]GUICtrlCreateLabel("Rounds:", 60, 70)
[/autoit] [autoit][/autoit] [autoit]$hInput = GUICtrlCreateInput("", 110, 68, 20, 20, $ES_NUMBER)
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $hGUIPreferences)
[/autoit] [autoit][/autoit] [autoit]; As long as $bPreferences is true, the Preferences-GUI is visible and $hGUI not
While ($bPreferences)
WEnd
GUISetState(@SW_HIDE, $hGUIPreferences)
[/autoit] [autoit][/autoit] [autoit];---------------------------------------END Preferences-GUI-----------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW, $hGUI)
[/autoit] [autoit][/autoit] [autoit]; 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)
[/autoit] [autoit][/autoit] [autoit]WEnd
[/autoit] [autoit][/autoit] [autoit]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