タートルグラフィックス(再帰表現)

 投稿者:山中和義  投稿日:2011年 5月17日(火)20時43分23秒
 
!●タートルグラフィックス

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) !最初の位置、長さ、向き


 

戻る