|
PROGRAM LSYS_SIERPINSKI_PENTAGON !( © W.Van Duyn 24thApril 2004)
! Generalised for type 4 and up
SET WINDOW 0,1199,0,903
SET background color "white"
SET color 16
CALL init
END
SUB init
OPTION ANGLE degrees
PRINT"Input x try 400, y try 200"
INPUT x,y
PRINT"Input size try 400, level try 3, type try 5 etc"
INPUT size,level,ak
CLEAR
FLOOD 1,1
LET k=360/ak
LET r= 2*(1+cos(k))
LET d=size/r^level
LET a=0
LET lev=level
SET color 13
FOR i=1 TO ak
CALL lsys(lev,d,a,k,x,y,ak)
CALL turnLEFT(a,k)
next i
END SUB
SUB lsys(lev,d,a,k,x,y,ak)
IF lev=0 THEN
CALL moveON(d,x,y,a)
EXIT IF
ELSE
CALL lsys(lev-1,d,a,k,x,y,ak)
CALL turnLEFT(a,k)
CALL lsys(lev-1,d,a,k,x,y,ak)
CALL push(d,x,y,a)
FOR i = 1 TO ak-4
CALL turnLEFT(a,k)
CALL lsys(lev-1,d,a,k,x,y,ak)
NEXT i
CALL pop(d,x,y,a)
CALL turnRIGHT(a,k)
CALL turnRIGHT(a,k)
CALL lsys(lev-1,d,a,k,x,y,ak)
CALL turnLEFT(a,k)
CALL lsys(lev-1,d,a,k,x,y,ak)
END IF
END SUB
SUB moveON(d,x,y,a)
OPTION ANGLE degrees
LET dx=d*cos(a)
LET dy=d*sin(a)
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
SHARE state(20,4),stack
LET stack=1
SUB push(d,x,y,a) !save the graphics state
LET state(stack,1)=d
LET state(stack,2)=x
LET state(stack,3)=y
LET state(stack,4)=a
LET stack=stack+1
END SUB
SUB pop(d,x,y,a) !restore the graphics state
LET stack=stack-1
LET d=state(stack,1)
LET x=state(stack,2)
LET y=state(stack,3)
LET a=state(stack,4)
END SUB
END MODULE
|