Dragon curve: Difference between revisions

Added solution for Action!
m (→‎{{header|Phix}}: added syntax colouring, made p2js compatible)
(Added solution for Action!)
Line 102:
 
The string rewrites can be done recursively without building the whole string, just follow its instructions at the target level. See for example [[#C by IFS Drawing|C by IFS Drawing]] code. The effect is the same as "recursive with parameter" above but can draw other curves defined by L-systems. <br><br>
 
=={{header|Action!}}==
Action! language does not support recursion. Therefore an iterative approach with a stack has been proposed.
<lang Action!>DEFINE MAXSIZE="20"
 
INT ARRAY
xStack(MAXSIZE),yStack(MAXSIZE),
dxStack(MAXSIZE),dyStack(MAXSIZE)
BYTE ARRAY
dirStack(MAXSIZE),
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 x,y,dx,dy BYTE dir,depth,stage)
IF IsFull() THEN Break() FI
xStack(stacksize)=x yStack(stacksize)=y
dxStack(stacksize)=dx dyStack(stacksize)=dy
dirStack(stacksize)=dir
depthStack(stacksize)=depth
stageStack(stackSize)=stage
stacksize==+1
RETURN
 
PROC Pop(INT POINTER x,y,dx,dy BYTE POINTER dir,depth,stage)
IF IsEmpty() THEN Break() FI
stacksize==-1
x^=xStack(stacksize) y^=yStack(stacksize)
dx^=dxStack(stacksize) dy^=dyStack(stacksize)
dir^=dirStack(stacksize)
depth^=depthStack(stacksize)
stage^=stageStack(stacksize)
RETURN
 
PROC DrawDragon(INT x,y,dx,dy BYTE depth)
BYTE dir,stage
INT nx,ny,dx2,dy2,tmp
Push(x,y,dx,dy,1,depth,0)
 
WHILE IsEmpty()=0
DO
Pop(@x,@y,@dx,@dy,@dir,@depth,@stage)
IF depth=0 THEN
Plot(x,y) DrawTo(x+dx,y+dy)
ELSE
IF stage<2 THEN
Push(x,y,dx,dy,dir,depth,stage+1)
FI
nx=dx/2 ny=dy/2
dx2=nx-ny dy2=nx+ny
IF stage=0 THEN
IF dir THEN
Push(x,y,dx2,dy2,1,depth-1,0)
ELSE
Push(x,y,dy2,-dx2,1,depth-1,0)
FI
ELSEIF stage=1 THEN
IF dir THEN
tmp=-dx2 ;to avoid the compiler error
Push(x+dx2,y+dy2,dy2,tmp,0,depth-1,0)
ELSE
Push(x+dy2,y-dx2,dx2,dy2,0,depth-1,0)
FI
FI
FI
OD
RETURN
 
PROC Main()
BYTE CH=$02FC,COLOR1=$02C5,COLOR2=$02C6
 
Graphics(8+16)
Color=1
COLOR1=$0C
COLOR2=$02
 
DrawDragon(104,72,128,0,12)
 
DO UNTIL CH#$FF OD
CH=$FF
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Dragon_curve.png Screenshot from Atari 8-bit computer]
 
=={{header|ALGOL 68}}==
Anonymous user