|
!●タートルグラフィックス
OPTION ARITHMETIC COMPLEX !複素平面
DECLARE EXTERNAL SUB tg.move, tg.moveTo, tg.turn, tg.direction
DECLARE EXTERNAL NUMERIC tg.COLOR, tg.STYLE
!------------------------------
SUB home !現在位置を原点、現在の向きを0°とする
CALL tg.moveTo(0,0)
CALL tg.direction(0)
END SUB
!例1
SET WINDOW -50,50,-50,50 !表示領域
DRAW grid(5,5) !座標
CALL home
SUB KOCH(N,L) !雲形のコッホ曲線を描く
if N>0then
CALL KOCH(N-1,L)
CALL tg.turn(60)
CALL KOCH(N-1,L)
CALL tg.turn(-120)
CALL KOCH(N-1,L)
CALL tg.turn(60)
CALL KOCH(N-1,L)
ELSE
CALL tg.move(L)
END IF
END SUB
LET tg.COLOR=4
CALL KOCH(2,5)
!例2
CALL home !コッホ島を描く
LET tg.COLOR=2
CALL tg.moveTo(-40,25)
FOR i=1 TO 3 !正三角形に配置する
CALL KOCH(4,1) !次数、0次の長さ
CALL tg.turn(-120)
NEXT i
END
!タートルグラフィックス
MODULE tg
OPTION ARITHMETIC COMPLEX !複素平面
PUBLIC NUMERIC COLOR,STYLE !線色、線種
LET COLOR=1 !黒色
LET STYLE=1 !実線
PUBLIC NUMERIC CP,CA !現在位置と向き ※参照のみ
LET CP=COMPLEX(0,0) !現在位置を原点、現在の向きを0°とする
LET CA=0
PUBLIC SUB move
EXTERNAL SUB move(L) !前に進む (x+L*cosθ,y+L*sinθ)
OPTION ARITHMETIC COMPLEX !複素平面
LET t=CP
LET CP=L*EXP(COMPLEX(0,RAD(CA))) + CP !移動先を算出する
IF COLOR>=0 THEN !色番号が負なら、線は書かない(ペンを上げる)
SET LINE COLOR COLOR
SET LINE STYLE STYLE
PLOT LINES: Re(t),Im(t); Re(CP),Im(CP) !線を描く
END IF
END SUB
PUBLIC SUB moveTo
EXTERNAL SUB moveTo(x,y) !現在位置を(x,y)とする
OPTION ARITHMETIC COMPLEX !複素平面
LET CP=COMPLEX(x,y)
END SUB
PUBLIC SUB turn
EXTERNAL SUB turn(a) !角度aだけ回転する
OPTION ARITHMETIC COMPLEX !複素平面
LET CA=MOD(CA+a,360) ![0,360)
END SUB
PUBLIC SUB direction
EXTERNAL SUB direction(a) !向きをaとする
OPTION ARITHMETIC COMPLEX !複素平面
LET CA=MOD(a,360)
END SUB
END MODULE
以下、先頭部分やサブルーチン部分は省略します。
!例3
SUB dragon(N,A) !ドラゴン曲線を描く
IF N>0 THEN
CALL dragon(N-1,90)
CALL tg.turn(A)
CALL dragon(N-1,-90)
ELSE
CALL tg.move(2)
END IF
END SUB
CALL home
LET tg.COLOR=1
CALL tg.moveTo(0,-27)
CALL dragon(10,90)
!例4
SUB ccurve(N) !C曲線を描く
IF N>0 THEN
CALL ccurve(N-1)
CALL tg.turn(90)
CALL ccurve(N-1)
CALL tg.turn(-90)
ELSE
CALL tg.move(1.5)
END IF
END SUB
CALL home
LET tg.COLOR=4
CALL tg.moveTo(-20,-25)
CALL ccurve(10)
!例5
SUB tree(N,x0,y0,L,A) !樹木曲線を描く
local x,y
IF N>0 THEN
CALL tg.moveTo(x0,y0)
CALL tg.direction(A)
CALL tg.move(L)
LET x=Re(tg.CP)
LET y=Im(tg.CP)
CALL tree(N-1,x,y,L/fct,A-br)
CALL tree(N-1,x,y,L/fct,A+br) !!CALL tree(N-1,x,y,L/fct*0.8,A+br)
END IF
END SUB
CALL home
LET tg.COLOR=1
LET fct=1.4
LET br=20
CALL tree(10,0,-40,20,90) !最初の位置、長さ、向き
|
|