56 lines
2.1 KiB
AutoHotkey
56 lines
2.1 KiB
AutoHotkey
#NoEnv
|
|
SetBatchLines, -1
|
|
; Directions
|
|
Directions := {0: "North", 1: "East", 2: "South", 3: "West"}
|
|
; Initialize the plane (set all cells to white)
|
|
White := 0xFFFFFF
|
|
Plane := []
|
|
PW := PH := 100
|
|
loop, % PH {
|
|
I := A_Index
|
|
loop, % PW
|
|
Plane[I, A_Index] := White
|
|
}
|
|
; Let it run
|
|
DI := D := 0 ; initial direction
|
|
X := Y := 50 ; initial coordinates
|
|
while (X > 0) && (X <= PW) && (Y > 0) && (Y <= PH) {
|
|
D := (D + ((Plane[X, Y] ^= White) ? 1 : 3)) & 3
|
|
if (D & 1)
|
|
X += -(D = 3) + (D = 1)
|
|
else
|
|
Y += -(D = 0) + (D = 2)
|
|
}
|
|
; Show the result
|
|
HBM := CreateDIB(Plane, PW, PH, 400, 400, 0)
|
|
Gui, Margin, 0, 0
|
|
Gui, Add, Text, x0 y0 w20 h440 Center 0x200, W
|
|
Gui, Add, Text, x20 y0 w400 h20 Center 0x200, N
|
|
Gui, Add, Picture, x20 y20 w400 h400 0x4E hwndHPIC ; SS_REALSIZECONTROL = 0x40 | SS_BITMAP = 0xE
|
|
DllCall("User32.dll\SendMessage", "Ptr", HPIC, "UInt", 0x172, "Ptr", 0, "Ptr", HBM) ; STM_SETIMAGE = 0x172
|
|
Gui, Add, Text, xp+5 yp h20 0x200 BackgroundTrans, % "Initial direction: " . Directions[DI]
|
|
Gui, Add, Text, x20 y420 w400 h20 Center 0x200, S
|
|
Gui, Add, Text, x420 y0 w20 h440 Center 0x200, E
|
|
Gui, Show, , Langton's ant (%PW%x%PH%)
|
|
Return
|
|
|
|
GuiClose:
|
|
ExitApp
|
|
|
|
CreateDIB(PixelArray, PAW, PAH, BMW := 0, BMH := 0, Gradient := 1) { ; SKAN, 01-Apr-2014 / array version by just me
|
|
SLL := (PAW * 3) + (PAW & 1)
|
|
VarSetCapacity(BMBITS, SLL * PAH, 0)
|
|
P := &BMBITS
|
|
loop, % PAH {
|
|
R := A_Index
|
|
loop, % PAW
|
|
P := Numput(PixelArray[R, A_Index], P + 0, "UInt") - 1
|
|
P += (PAW & 1)
|
|
}
|
|
HBM := DllCall("Gdi32.dll\CreateBitmap", "Int", PAW, "Int", PAH, "UInt", 1, "UInt", 24, "Ptr", 0, "UPtr")
|
|
HBM := DllCall("User32.dll\CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "UInt", 0x2008, "UPtr")
|
|
DllCall( "Gdi32.dll\SetBitmapBits", "Ptr", HBM, "UInt", SLL * PAH, "Ptr", &BMBITS)
|
|
if (!Gradient)
|
|
HBM := DllCall("User32.dll\CopyImage", "Ptr", HBM, "UInt", 0, "Int", 0, "Int", 0, "Int", 8, "UPtr")
|
|
return DllCall("User32.dll\CopyImage", "Ptr", HBM, "UInt", 0, "Int", BMW, "Int", BMH, "UInt", 0x200C, "UPtr")
|
|
} ; http://ahkscript.org/boards/viewtopic.php?f=6&t=3203
|