Anonymous user
Hilbert curve: Difference between revisions
Added solution for Action!
m (→{{header|Phix}}: added syntax colouring, made p2js compatible) |
(Added solution for Action!) |
||
Line 136:
</pre>
=={{header|Action!}}==
Action! language does not support recursion. Therefore an iterative approach with a stack has been proposed.
<lang Action!>DEFINE MAXSIZE="12"
INT ARRAY
dxStack(MAXSIZE),dyStack(MAXSIZE)
BYTE ARRAY
depthStack(MAXSIZE),stageStack(MAXSIZE)
BYTE stacksize=[0]
BYTE FUNC IsEmpty()
IF stacksize=0 THEN RETURN (1) FI
RETURN (0)
BYTE FUNC IsFull()
IF stacksize=MAXSIZE THEN RETURN (1) FI
RETURN (0)
PROC Push(INT dx,dy BYTE depth,stage)
IF IsFull() THEN Break() FI
dxStack(stacksize)=dx dyStack(stacksize)=dy
depthStack(stacksize)=depth
stageStack(stackSize)=stage
stacksize==+1
RETURN
PROC Pop(INT POINTER dx,dy BYTE POINTER depth,stage)
IF IsEmpty() THEN Break() FI
stacksize==-1
dx^=dxStack(stacksize) dy^=dyStack(stacksize)
depth^=depthStack(stacksize)
stage^=stageStack(stacksize)
RETURN
PROC DrawHilbert(INT x BYTE y INT dx,dy BYTE depth)
BYTE stage
Plot(x,y)
Push(dx,dy,depth,0)
WHILE IsEmpty()=0
DO
Pop(@dx,@dy,@depth,@stage)
IF stage<3 THEN
Push(dx,dy,depth,stage+1)
FI
IF stage=0 THEN
IF depth>1 THEN
Push(dy,dx,depth-1,0)
FI
ELSEIF stage=1 THEN
x==+dx y==+dy
DrawTo(x,y)
IF depth>1 THEN
Push(dx,dy,depth-1,0)
FI
ELSEIF stage=2 THEN
x==+dy y==+dx
DrawTo(x,y)
IF depth>1 THEN
Push(dx,dy,depth-1,0)
FI
ELSEIF stage=3 THEN
x==-dx y==-dy
DrawTo(x,y)
IF depth>1 THEN
Push(-dy,-dx,depth-1,0)
FI
FI
OD
RETURN
PROC Main()
BYTE CH=$02FC,COLOR1=$02C5,COLOR2=$02C6
Graphics(8+16)
Color=1
COLOR1=$0C
COLOR2=$02
DrawHilbert(64,1,0,3,6)
DO UNTIL CH#$FF OD
CH=$FF
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Hilbert_curve.png Screenshot from Atari 8-bit computer]
=={{header|ALGOL 68}}==
|