新しく発言する EXIT インデックスへ
Drawの再帰呼び出しの意味を教えてください...

  Draw の再帰呼び出しの意味を教えてください。 遠山の金 2003/05/16 20:51:48 
  点を打っているのはgasket(10)が実行される... 白石和夫 2003/05/16 22:24:15 
   ├早速のご回答ありがとうございます。 遠山の金 2003/05/16 23:11:11 
   └試行錯誤しながら、動きを確認してみました... 遠山の金 2003/05/17 17:50:38 
    ├TRANSFORMの各要素を用いてどう変換されるか... 白石和夫 2003/05/17 18:48:53 
    └変換に対して行列の各要素がどう用いられる... 白石和夫 2003/05/19 10:44:57 
     └ありがとうございます。これで完璧(??)... 遠山の金 2003/05/20 11:49:01 

  Draw の再帰呼び出しの意味を教えてください。 遠山の金 2003/05/16 20:51:48  ツリーへ

Draw の再帰呼び出しの意味を教えてください。 返事を書く
遠山の金 2003/05/16 20:51:48
十進BASICの初心者です。Picture定義のサンプルに下記のような
サブルーチンがあり、gasket(1)で呼び出されるとき、なにが起こるのかどうもよくわかりません。
gasket(1)⇒gasket(2)....⇒gaket(10)になって
座標(0,0)に点が打たれる、とそのあとgasket(10)を呼んだgasket(9)にはいったいどんなことがおこるのでしょうか?
初心者のぼやきですが、どなたかおしえていただけませんか?
200 PICTURE gasket(n)
210 IF n=10 THEN
220 PLOT POINTS: 0,0
230 ELSE
240 DRAW gasket(n+1) WITH SCALE(1/2)
250 DRAW gasket(n+1) WITH SHIFT(-2,0)*SCALE(1/2)*SHIFT(2,0)
260 DRAW gasket(n+1) WITH SHIFT(-1,-SQR(3))*SCALE(1/2)*SHIFT(1,SQR(3))
270 END IF
280 END PICTURE

  点を打っているのはgasket(10)が実行される... 白石和夫 2003/05/16 22:24:15  ツリーへ

Re: Draw の再帰呼び出しの意味を教えてください。 返事を書く
白石和夫 2003/05/16 22:24:15
点を打っているのはgasket(10)が実行されるときだけです。
gasket(9)では,座標を変換してgasket(10)を呼び出しています。
同様に,gasket(8)は,座標を変換してgasket(9)を呼び出しています。
つまり,打っている点は,gasket(10)から見ればいつも(0,0)ですが,最初にSET WINDOWで設定した座標系でみれば(0,0)ではありません。

参考

pictureの実行中は,現在変形という名の変換行列が関連付けられています。DRAW文でpictureを呼び出すと,現在変形と,draw文で指定した変形との積を現在変形としてpicutreを実行します。plot文は,指定された座標に現在変形を行って描画します。呼び出しが終われば,現在変形は元に戻ります。
現在変形は予約語TRANSFORMで取得できます。
DIM a(4,4)
MAT A=TRANSFORM
MAT PRINT A
を200行の次に追加して順にトレースしてみれば,各回のgasket実行時に現在変形がどうなっているか分かります。

参考文献
自己相似図形を利用する幾何教育の可能性
http://www.bunkyo.ac.jp/faculty/kyouken/shiraishi/shiraishi.html

   ├早速のご回答ありがとうございます。 遠山の金 2003/05/16 23:11:11  ツリーへ

Re: 点を打っているのはgasket(10)が実行される... 返事を書く
遠山の金 2003/05/16 23:11:11
早速のご回答ありがとうございます。
なるほど、座標が変換されているのですね。
まだ動きをスムーズに頭でトレースできていませんが、
わかったような気がします。

   └試行錯誤しながら、動きを確認してみました... 遠山の金 2003/05/17 17:50:38  ツリーへ

Re: 点を打っているのはgasket(10)が実行される... 返事を書く
遠山の金 2003/05/17 17:50:38
試行錯誤しながら、動きを確認してみました。
nを変えたり、!をつけて辺だけを描かせてみたり。こういうことが簡単にできるのが、十進BASICの便利さですね。改めて感心しました。
Pictureの中の2番目のDrawは with SC(1/2)*SH(1,0) と同じ効果と思いますが、SH(-2,0)*SC(1/2)*SH(2,0) とするのは意味があるのでしょうか? (数学的に or 処理系の速さ?)
もうひとつ、TRANSFORMの各要素と座標系との関連がうまく結びつきません。なんで(4,4)なのかもわからない始末です。

    ├TRANSFORMの各要素を用いてどう変換されるか... 白石和夫 2003/05/17 18:48:53  ツリーへ

Re: 試行錯誤しながら、動きを確認してみました... 返事を書く
白石和夫 2003/05/17 18:48:53
TRANSFORMの各要素を用いてどう変換されるかについては,ヘルプにも最小限のことが書いてあります。多少,数学的な解説は,「数学とコンピュータ2」(森北)に記述したつもりです。4行4列の行列を用いる理由はJISの規格書を見ると分かります。
with SC(1/2)*SH(1,0) とせずに SH(-2,0)*SC(1/2)*SH(2,0) とするのは,分かりやすさを優先したからです。十進BASICは翻訳時に計算できる組込み関数は翻訳時に計算してしまうので,速さはほとんど変わらないと思います。

    └変換に対して行列の各要素がどう用いられる... 白石和夫 2003/05/19 10:44:57  ツリーへ

Re: 試行錯誤しながら、動きを確認してみました... 返事を書く
白石和夫 2003/05/19 10:44:57
変換に対して行列の各要素がどう用いられるかは,ヘルプの
手続き定義−行列による変形
を見てください。

     └ありがとうございます。これで完璧(??)... 遠山の金 2003/05/20 11:49:01  ツリーへ

Re: 変換に対して行列の各要素がどう用いられる... 返事を書く
遠山の金 2003/05/20 11:49:01
ありがとうございます。これで完璧(??)にわかりました。
ヘルプを通読もせずにすみません。ご親切に感謝します。


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。