最終更新日 2004年1月28日
空間LOGO : KITE.EXE Ver.1.5 の改良点
線画だけではやはり寂しいので、KITE をヴァージョンアップして、三角形を描けるようにしました。プログラムの修正を最小限度にして、三角形を描けるようにするため、SURFACE というコマンド(命令)を導入しました。SYNCHRO 命令が実行された状態で、更に SURFACE 命令が実行されていれば、二匹のタートルがペンを降ろしていれば、どちらかのタートルが移動すれば、移動したタートルの元の位置と移動先と他のタートルの位置の三点で定まる三角形を、現在の色で描きます。例えば、次のようなプログラムを実行すると
TO polygon :r :n
pu fd :r rt 90 pd rt 360/:n/2
synchro surface ・・・・・・・・・新しい命令:通常はペアで使う。
repeat :n [setcolor rand rand rand fd 2*:r*pi/:n rt 360/:n]
nonsynchro nonsurface ・・・・・・新しい命令:通常はペアで使う。
pu lt 360/:n/2 lt 90 bk :r pd
end
次のような図を描きます。polygon 120 12 を実行しました。

NONSURFACE が元に戻るコマンド(命令)です。このプログラムは表面には現れていませんがタートル2を使っています。従って、原点を中心にしてないときは、タートル2も中心に持っていく必要があります。これを巧くするためには、次のようなプログラムを作れば良いです。
TO polygon :r :n
push2 put 1 0 pu2 get 2 0 pd2
pu fd :r rt 90 pd rt 360/:n/2
synchro surface
repeat :n [setcolor rand rand rand fd 2*pi*:r/:n rt 360/:n]
nonsynchro nonsurface
pu lt 360/:n/2 lt 90 bk :r pd
pu2 pop2 pd2
end
このプログラムではタートル2をスタックに保存し、タートル1を配列に保存し、それをタートル2にコピーします。そして、最初に与えたプログラムを実行し、最後にスタックから、タートル2の情報を戻します。このように定義すれば、
polygon 100 20
rt 90 pu fd 150 pd polygon 40 6
pu bk 300
polygon 40 12
で次のような図を描きます。

また、TRIANGLE というコマンド(命令)で座標を使って、三角形を描くこともできます。引数は三点の座標です。例えば、TRIANGLE 0 0 0 100 0 0 100 100 0 とします。

正多角反柱を描くプログラムは少し長いですが、例えば次のようになります。
TO HANKAKUCHU :N :X
LOCAL :Y :Z :H
:Y = :X / 2 / SIN 180 / :N
:Z = 2 * :Y * SIN 90 / :N
:H = (SQRT :X*:X - :Z*:Z) / 2
PU2 PUSH2 PUT 1 0 GET 2 0 FD2 :H PD2
PU PUSH FD :H DOWN 90 FD :Y RT 90+180/:N PD
SYNCHRO SURFACE
SETCOLOR 1 1 0
REPEAT :N [FD :X RT 360 / :N]
PU2 FD2 -2*:H DOWN2 90 RT2 180/:N FD2 :Y RT2 90+180/:N PD2
PU PUSH GET 1 0 FD -:H PD
SETCOLOR 1 1 1
REPEAT :N [FD2 :X RT2 360 / :N]
POP
REPEAT :N [
SETCOLOR 1 0 0 FD :X RT 360 / :N
SETCOLOR 0 0 1 FD2 0 FD2 :X RT2 360 / :N]
NONSYNCHRO NONSURFACE
PU POP PU2 POP2
END
実行すると次のような図を描きます。マウスで回転しています。

立方体を描く汎用的なプログラムの一例は次の様になります。
TO cube :size
pu push pu2 push2 put 1 0 get 2 0
pu fd :size down 90 fd :size rt 90 fd :size rt 90 pd
pu2 fd2 :size down2 90 fd2 :size lt2 90 fd2 :size pd2 st2
synchro surface
setcolor 1 0 0 fd 2*:size rt 90 fd 2*:size
setcolor 0 1 0 down 90 fd 2*:size rt 90 fd 2*:size
setcolor 0 0 1 down 90 fd 2*:size rt 90 fd 2*:size
pu pop push pu2 put 1 0 get 2 0
pu bk :size up 90 fd :size lt 90 fd :size down 90 yaw 90 pd
pu2 bk2 :size up2 90 fd2 :size rt2 90 fd2 :size pd2
setcolor 1 1 0 fd 2*:size rt 90 fd 2*:size
setcolor 1 0 1 down 90 fd 2*:size rt 90 fd 2*:size
setcolor 0 1 1 down 90 fd 2*:size rt 90 fd 2*:size
nonsynchro nonsurface
pu2 pop2 pu pop pd pd2
end
タートル1の位置を中心にして、タートル1の向きに与えられた値の二倍の辺の立方体を描きます。タートルの状態は保たれます。

更に、大域的な配列を使うために、PUTARRAY 又は PA という命令で値を保存できます。引数はインデックスと実数値です。保存した値を呼び出すのに GETARRAY 又は GA という関数を使います。引数はインデックスです。従って、PA 4 6.9 PRINT GA 4 と実行すれば 6.9 と表示します。インデックスの範囲は0から2000未満です。また、スタックの機能でスタックのトップの二つを入れ替える EXCHANGE(EX) 及びEXCHANGE2(EX2) とスタックのトップを重複する DUPLICATE(DUPL) 及び DUPLICATE2(DUPL2) と言う命令を追加しました。
あまり良い改良とは言えないかも分かりませんが、なんとか多面体が描けるようになりました。座標を使えば簡単なのに、苦労してこのようなプログラムを作ることに教育的効果があるかかなり疑問ですが、パズルの一種だと思ってプログラムを考えてみて下さい。上の立方体のような形でプログラムを作ると平行移動や回転の行列で悩まなくても良いでし、誰かが作れば、後は汎用的に誰でも使えますから。
例えば、立方体の立体角万華鏡 CUBE は、補助手続き SUBCUBE を使って、次のようにプログラム出来ます。
TO SUBCUBE :S
PUSH
PU FD :S DOWN 90 PD2
SYNCHRO SURFACE
REPEAT 4 [
PUSH
PD SETCOLOR 1 0 0 FD :S
RT 90
SETCOLOR 0 1 0 FD :S
DUPL PUSH EX ・・・・・・・・・・新しく導入した命令 DUPL と EX
SETCOLOR 0 0 1 POP PU POP PD
RT 90
SETCOLOR 0 1 0 FD :S
PU POP
RT 90 ]
NONSYNCHRO NONSURFACE
PU POP PD PD2
END
TO CUBE :S
PUSH2 PU2 PUT 1 0 GET 2 0
REPEAT 4 [SUBCUBE :S RT 90]
UP 90 SUBCUBE :S
UP 180 SUBCUBE :S
UP 90 PU2 POP2 PD2
END
これを使って、
CS RT 30 UP 15 YAW 20 REPEAT 5 [SETCOLOR 1 1 0 FD 100 CUBE 20 RT 72]
とすれば、次のような図を描くことが出来ます。

最後に、POLYMODE と NONPOLYMODE という命令を追加しました。POLYMODE を実行すると多角形描画モードになり、閉じた凸な図形(凸多角形)を描いて、NONPOLYMODE 命令を実行すると最初に移動したときの色で閉じた凸な図形を描きます。中間では図は描かれません。更に、タートルを区別しませんので、この命令を使うときは注意して下さい。NONPOLYMODE を実行した時点で、初めて閉じた凸な図形が描かれます。多角形は凸多角形を描いて下さい。凸多角形を描くたびに、POLYMODE と NONPOLYMODE をペアで使って下さい。この命令は、SYNCHRO や SURFACE に優先します。
例えば、
polymode
repeat 5 [fd 100 rt 72]
nonpolymode
polymode
setcolor 1 0 0
repeat 4 [fd 60 lt 90]
nonpolymode
を実行すれば、次のような図を描きます。

polymode
repeat 5 [fd 100 rt 72]
setcolor 1 0 0
repeat 4 [fd 60 lt 90]
nonpolymode
ではだめです。

どこで閉じた凸多角形が出来上がったか判断できるほど、この KITE は利口ではありません。面倒でも、一つ凸多角形を描くたびに、POLYMODE と NONPOLYMODE で囲って下さい。そうでないと、どんな図を描くか保証の限りではありません。
KITE Version 1.5 は KITE のページからダウンロードできます。