タートル・グラフィックス  on Basic



- Turtle Graphics -
タートル・グラフィックスはLOGO言語に
備えられた特殊な描画機能です。
人工知能や教育用途で使用されていました。

画面上の亀に見立てられたカーソルに前進や回転の
指示を与えて、その軌道が模様を描いていきます。

Basicのプログラムで実現された
タートル・グラフィックスではマルチタートルで
複数の亀を同時に動かすことができます。

使用例

forward 80
right 30

80 前進して 右に30度回転します。

コマンドとプログラムリストの両方から使用することができます。

File: "turtle.bas"
load "http://androidbasic.ninja-web.net/sp/turtle.bas"
2013/07/04 以降のバージョンが必要です。
当アプリ(MC-Basic)専用です。(転載不可)




コマンド一覧
2文字の省略形[ ]表記 も使えます。

 [fd]  forward n  前にn進みます。
 [bk]  back n  後ろにn進みます。
 [rt]  right n  右にn度向きを変えます。
 [lt]  left n  左にn度向きを変えます。
 [wt]  wait n  nの間停止します。
 [pd]  pendown ペンを下げます。軌道の跡が描画されます。
 [pu]  penup  ペンを上げます。軌道の跡は描画されません。
 [rp]  repeat n [ ]  括弧の中をn回繰り返して実行します。多重構造が可能です。
 [cs]  cls  画像を消去します。
 [tc]  color n  カラーnを選択します。Basicの16色カラーcol(n)と同じ配色です。
 [pn]  pen n  複数のカーソルをn番に切り替えます。(1~16) ループ中は切り替えできません。
 [ps]  pos x y  座標(x,y)に移動します。
 [mv]  move x y  現在の位置からx,yだけ移動します。
 [ag]  angle n  角度n度の向きに設定します。
 [sp]  speed n  速度nに設定します。(1~10)。大きいほど速くなります。(デフォルトは10)。

変数 @0から@255まで使用できます。
@v n  変数v番に式nの値を代入します。

ラベル&ジャンプ
*label  *の後にラベル名をアルファベットで示します。
 [go]  goto label  指定したラベルの位置に飛びます。

分岐
if n  式nが0以外なら直後の命令を実行します。0ならスキップします。

式の値について
パラメータはBasicと同じ計算式、関数を使うことができます。
剰余(余り)の mod は左右に空白が必要なので'%'で代用します。
式中に変数@vも混同して使うことができます。

他にTG専用の3つの関数が使えます。
posx(n)  ペンnのカーソルの座標X。
posy(n)  ペンnのカーソルの座標Y。
angle(n)  ペンnの角度。

ダイレクト専用コマンド
 [ld]  load file  ファイルをロードして実行します。ファイル名は""で囲う必要はありません。
 [md]  mode n   描画モード切り替え。
0 でカーソルが実際に動くアニメーション付きで描画します。
1 でアニメーション無しでストレートに描画します。


座標は画面中央が原点(0,0)で右と上方向がプラス、左と下方向がマイナスとなっています。
角度は上向きが0度で時計回りに大きくなります。(0~359度)



使用例

変数
@1 100 @2 posx(2) @1 sqr(@1+@2)
変数@1に100、@2にペン2のx座標を代入して@1に@1+@2の平方根を代入する。

ラベル
fd 20 *point1 rt 30 fd 40 go point1
前進20 右30度、前進40して右30度の手前に戻って繰り返す。

分岐
if angle(1)>180 lt 2 fd 10
もしペン1の角度が180より大きければ左に2度回って次の前進10へ、
そうでなければ左回転はスキップして次の前進10へ。

マルチタートル
初期のペンは1で座標は(0,0)で始まります。
tc 1 rt 90 fd 100 pn 2 tc 2 lt 90 sd 5 fd 100
右へ青の線、左へ赤の線が半分の速度で走ります。

ペンは最大16まで同時に使うことができます。
ペンとカラーの値は最大値以上にはみ出した時は自動で余剰の値に引き下げられます。




コマンドはテキストファイルに記述してloadコマンドから実行させることもできます。
パラメータとの間、コマンドとの間は空白文字で区切ります。

例  トップにある星と多角形のプログラム。
load tg0.lgo で実行。
ファイル"tg0.lgo"の内容。
pn 1 tc 10 mv 0 180 ag 162 rp 5[fd 352 rt 144]
pn 2 tc 9 mv -193 80 ag 45 rp 8[fd 160 rt 45]

Basic for Androidのエディタで編集して保存することもできます。
行番号が付いている場合は取り除かれてロードされます。

10 pn 1 tc 10 mv 0 180 ag 162 rp 5[fd 352 rt 144]
20 pn 2 tc 9 mv -193 80 ag 45 rp 8[fd 160 rt 45]


 

再帰処理をする場合は"turtle.bas"の100~999行の間に直接書き込みます。
ユーザー関数 func endfunc を使用します。
次のプログラムの100~250行の部分です。
40行はコマンド入力用のinput文があるので ' (rem文)で外します。
f=tgcom("left 60") の部分がタートルのコマンドを送る関数です。
これはコマンド内の描画が終わるまで次の命令には進みません。
Basicの変数を直接使う場合は f=tgcom("forward "+str$(ln)) のように
str$()関数を使ってコマンド文字列に連結します。
30行でモード設定ができます。(時間がかかるものは mode=1 にします)

File [ tg01.bas ]


10 'Turtle Graphics 1.00
20 gosub turtle: :f=tgini()
30d$="":mode=1
40 'if d$="" then input d$:f=tgcom(d$):goto 40
50 '
100 f=tgcom("angle 90 move -180 -40 tc 9")
110 f=koch(360)
120 '
130 func koch(ln)
140 if ln>4 then
150  f=koch(ln/3)
160  f=tgcom("left 60")
170  f=koch(ln/3)
180  f=tgcom("right 120")
190  f=koch(ln/3)
200  f=tgcom("left 60")
210  f=koch(ln/3)
220 else
230  f=tgcom("forward "+str$(ln))
240 endif
250 endfunc
1000 '
1010 end
1020 turtle:
1030cls3:d0=0:tpen=1:f2=0:tmax=0:iflg=0:cnt=0:mode=0
1040 dim tx(16),ty(16),ta(16),tp(16),loopc(16,16),loopp(16,16)
1050 dim tmx(16),tmy(16),tc(16),taa(16),tac(16),lplv(16)
1060 ………




サンプル
File [ tg04.bas ]
turtle.bas をロード・実行して load tg04.bas を入力して描画。

rp 4096[@2 @2+1 @1 @1+@2 @3 @1/1000 @1 (@3-int(@3))*1000 @4 @4+1 tc @4 fd int(@3) rt 1]





















File [ tg05.bas ]
turtle.bas をロード・実行して load tg05.bas を入力して描画。

tc 5 @2 1 mv -50 -50 rp 30[@2 @2+1 tc @2 rp 3[fd 100+@1*6 rt 91]@1 @1+1]





















File [ tg02.bas ]

30d$="":mode=1
40 'if d$="" then input d$:f=tgcom(d$):goto 40
50 '
100 r=0.6666666666666666
110 ang=20
120 ln2=2
130 f=tgcom("move 0 -160 tc 12")
140 '
150 f=branch(100)
160 '
170 func branch(ln)
180  if ln<=ln2 then endfunc
190  f=tgcom("forward "+str$(ln))
200  f=tgcom("left "+str$(ang))
210  f=branch(r*ln)
220  f=tgcom("right "+str$(2*ang))
230  f=branch(r*ln)
240  f=tgcom("left "+str$(ang))
250  f=tgcom("penup back "+str$(ln)+" pendown")
260 endfunc


File [ tg03.bas ]


30d$="":mode=1
40 'if d$="" then input d$:f=tgcom(d$):goto 40
50 '
100 f=tgcom("angle 90 move -180 -80 tc 14")
110 f=stitch(360)
120 '
130 func stitch(ln)
140 if ln>4 then
150  f=stitch(ln/3)
160  f=tgcom("left 90")
170  f=stitch(ln/3)
180  f=tgcom("right 90")
190  f=stitch(ln/3)
200  f=tgcom("right 90")
210  f=stitch(ln/3)
220  f=tgcom("left 90")
230  f=stitch(ln/3)
240 else
250  f=tgcom("forward "+str$(ln))
260 endif
270 endfunc



File [ tg06.bas ]
turtle.bas をロード・実行して load tg06.bas を入力して描画。

rp 36 [rp 34 [fd 12 rt 10] rt 90 @1 @1+1 @2 @1%14+1 tc @2]






[ 戻る ]