Während minx letzte Nacht an dem Hopalong Fraktal gearbeitet hat, habe ich, wie auch schon in der Shoutbox angekündigt, eine kleine UDF geschreiben, um Fraktale von BASIC fast 1:1 in AutoIt übernehmen zu können.
BASIC.au3
#include-once
; BASIC.au3 by James1337
; thanks to Jojo (forum.qbasic.at)
AutoItSetOption("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global $PLOT[3] = [False, -1, -1]
Func PLOT($x, $y, $color=0xFFFFFF, $gdi32="gdi32.dll")
If $PLOT[0] Then
SetPixel($PLOT[2], $x+320, $y+240, $color, $gdi32)
Else
$PLOT[0] = True
$PLOT[1] = GUICreate("BASIC", 640, 480)
GUISetOnEvent(-3, "ExitB", $PLOT[1])
GUISetBkColor(0x000000, $PLOT[1])
GUISetState(@SW_SHOW, $PLOT[1])
$PLOT[2] = GetDC($PLOT[1])
PLOT($x, $y, $color, $gdi32)
EndIf
EndFunc
Func IDLE()
While Sleep(10)
WEnd
EndFunc
Func ExitB()
Exit
EndFunc
Func POKE($address, $color, $screenwidth=320, $gdi32="gdi32.dll")
PLOT(Mod($address, $screenwidth), ($address / $screenwidth), $color, $gdi32)
EndFunc
Global $PALETTE[256]
Func PALETTE($x, $y)
Local $R = Mod($y, 64) * 4
Local $G = Mod(($y / 256), 64) * 4
Local $B = Mod(($y / 65536), 64) * 4
$PALETTE[$x] = "0x" & Hex($B, 2) & Hex($G, 2) & Hex($R, 2)
EndFunc
Func SIGN($x)
Return ( ($x > 0) - ($x < 0) )
EndFunc ; by Mars
Func GetDC($hWnd, $user32="user32.dll")
$DC = DllCall($user32, "int", "GetDC", "hwnd", $hWnd)
If @error Then Return SetError(@error, 0, -1)
Return $DC[0]
EndFunc
Func SetPixel($hdc, $X, $Y, $Color, $gdi32="gdi32.dll")
DllCall($gdi32, "long", "SetPixel", "long", $hdc, "long", $X, "long", $Y, "long", $Color)
EndFunc
Da wir uns beide zufällig Hopalong ausgesucht haben nehme ich das hier auch gleich als Beispiel:
Zitat von http://www.fraktalwelt.de/myhome/simpiter2.htm
In AutoIt sieht das dann so aus:
#NoTrayIcon
#include "BASIC.au3"
Local $num, $a, $v, $c, $x, $y, $xx, $yy
[/autoit][autoit][/autoit][autoit]$num = InputBox("", "num", 50000)
$a = InputBox("", "a", 94)
$b = InputBox("", "b", 58)
$c = InputBox("", "c", -99)
$x = 0
$y = 0
For $i = 1 To $num
$xx = $y - SIGN($x) * Sqrt(Abs($b*$x - $c))
$yy = $a - $x
$x = $xx
$y = $yy
PLOT($x, $y, 0xFF*$i)
Next
IDLE()
Wie man sieht, besteht da kein großer Unterschied.
- aus Variable wurde $Variable (was man sich in der neuen Beta auch sparen kann)
- aus INPUT wurde InputBox und die Syntax ist leicht anders
- aus ^0.5 wurde Sqrt(), was aber eigentlich das Gleiche ist
- PLOT() steht jetzt in der For-Schleife
- damit sich das Fenster nicht sofort wieder schließt, wurde IDLE() eingefügt
Man könnte jetzt natürlich noch Farben einbauen (siehe 3. Parameter von PLOT, wobei die Farbe das Format 0xBBGGRR hat) und gdi32.dll mit DllOpen/DllClose verwenden (siehe 4. Parameter von PLOT), aber so im Großen und Ganzen funktioniert es ja.
MfG, James
PS: Fall jemand noch Funktionen hat (oder kennt), die in diese UDF passen würden, hinterlasst einfach einen Kommentar.