PROGRAM LSYS_SPIROGRAPH_CIRCLE ! (© W.van Duyn 20thApril 2004)
OPTION ANGLE degrees
SET WINDOW 0,1199,0,903
SET background color "white"
SET color 16
PRINT"Number of iterations try 18,(360 max)"
INPUT it
CLEAR
SET COLOR 16
FLOOD 1,1
LET depth=it
LET x=600
LET y=450
LET k=360/depth
LET size=64*sin(k)
LET a=0
FOR i1=1 TO it STEP 3
LET j1 = i1/it
SET COLOR MIX(i1) 0+j1,1,1-j1
NEXT i1
FOR i2=2 TO it STEP 3
LET j2 = i2/it
SET COLOR MIX(i2) 1,1-j,0+j2
NEXT i2
FOR i3=3 TO it STEP 3
LET j3 = i3/it
SET COLOR MIX(i3) 1-j3,j3,1
NEXT i3
CALL turnLEFT(a,k)
CALL lsys(depth,size,a,k,x,y,it)
END
SUB lsys(depth,size,a,k,x,y,it)
IF depth=0 THEN
EXIT IF
ELSE
CALL push(size,x,y,a)
CALL turnRIGHT(a,k)
CALL lsys(depth-1,size,a,k,x,y,it)
CALL pop(size,x,y,a)
FOR ii=1 to it
CALL moveON(size,x,y,a,depth)
CALL turnLEFT(a,k)
NEXT ii
END IF
END SUB
SUB moveON(size,x,y,a,depth)
OPTION ANGLE degrees
LET dx=size*cos(a)
LET dy=size*sin(a)
SET COLOR depth
PLOT x,y;x+dx,y+dy
LET x=x+dx
LET y=y+dy
END SUB
SUB turnRIGHT(a,k)
LET a=a-k
END SUB
SUB turnLEFT(a,k)
LET a=a+k
END SUB
MODULE stack !saves and restores a graphics state
SHARE state(360,4),level
LET level=1
SUB push(size,x,y,a)
LET state(level,1)=size
LET state(level,2)=x
LET state(level,3)=y
LET state(level,4)=a
LET level=level+1
END SUB
SUB pop(size,x,y,a)
LET level=level-1
LET size=state(level,1)
LET x=state(level,2)
LET y=state(level,3)
LET a=state(level,4)
END SUB
END MODULE
|