|
PROGRAM LSYS_DRAGON_GRAYCODE_2 !© W.van Duyn 13th May 2004
SET MODE "color"
SET WINDOW 0,1199,0,903
SET BACKGROUND COLOR "white"
CLEAR
CALL init
END
SUB init
PRINT "input: x try 200, y try 100"
INPUT x,y
PRINT "input: Size try 512,level try 9, dim 4"
INPUT size,level,ak
CLEAR
SET COLOR "black"
BOX AREA 0,1199,0,903
FLOOD 1,1
SET COLOR "White"
SET background Color "black"
PRINT "Gray Code 'Corner Dragon' L-System "
PRINT "© W.van Duyn May 13th 2004"
LET lev=level
LET dx=x
LET dy=y
LET k=360/ak
LET a=0
LET r=2
LET d=size/r^level
CALL moveY(d,lev,a,x,y,k,size,dx,dy)
CALL turnLEFT(a,k)
CALL moveX(d,lev,a,x,y,k)
CALL turnLEFT(a,k)
CALL moveY(d,lev,a,x,y,k,size,dx,dy)
END SUB
SUB moveY(d,lev,a,x,y,k,size,dx,dy)
IF lev=0 THEN
CALL travelON(d,a,x,y,size,dx,dy)
EXIT IF
ELSE
CALL turnLEFT(a,k)
CALL moveX(d,lev-1,a,x,y,k)
CALL turnRIGHT(a,k)
CALL turnRIGHT(a,k)
CALL moveY(d,lev-1,a,x,y,k,size,dx,dy)
CALL turnLEFT(a,k)
CALL moveY(d,lev-1,a,x,y,k,size,dx,dy)
CALL moveY(d,lev-1,a,x,y,k,size,dx,dy)
CALL turnLEFT(a,k)
CALL moveY(d,lev-1,a,x,y,k,size,dx,dy)
CALL turnRIGHT(a,k)
CALL turnRIGHT(a,k)
CALL moveX(d,lev-1,a,x,y,k)
CALL turnLEFT(a,k)
END IF
END SUB
SUB moveX(d,lev,a,x,y,k)
IF lev=0 THEN
CALL jump(d,a,x,y)
EXIT IF
ELSE
CALL moveX(d,lev-1,a,x,y,k)
CALL moveX(d,lev-1,a,x,y,k)
END IF
END SUB
SUB travelON(d,a,x,y,size,dx,dy)
OPTION ANGLE degrees
LET x2=x+d*cos(a)
LET y2=y+d*sin(a)
IF x-dx
IF x-dx >size/2 and y-dy>size/2 Then set color 15
IF x-dxsize/2 Then set color 10
IF x-dx >size/2 and y-dy<=size/2 Then set color 11
PLOT x,y;x2,y2
LET x=x2
LET y=y2
END SUB
SUB jump(d,a,x,y)
OPTION ANGLE degrees
LET x2=x+d*cos(a)
LET y2=y+d*sin(a)
LET x=x2
LET y=y2
END SUB
SUB turnLEFT(a,k)
LET a=a+k
END SUB
SUB turnRIGHT(a,k)
LET a=a-k
END SUB
|