86 lines
1.8 KiB
Text
86 lines
1.8 KiB
Text
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
|