[Squeak-ja: 3465] Re: 正7角形の処理についてお教えください

Kazuhiro ABE abee @ squeakland.jp
2007年 3月 21日 (水) 17:18:58 JST


阿部@新百合です。

On Wed, 21 Mar 2007 07:56:36 +0900
田中 昭二 <interact @ s-paru.com> wrote:
>「スクイークに『回すと進める』のタイルスクリプトを使って『正多角形』を
>書かせるときに、360度を割り切れない数=辺の正多角形処理は、どう処理
>しているのでしょうか?」と言った2人のお母さんからの質問内容でした。
>
> その時は、講師の阿部和広先生からお聞きしていたので、
>
>「スクイークは、小数点以下の端数を出さず『分数式のまま』計算するので、
>原点(最初の座標)に戻ってきます」と説明させていただきました。

これは誤りでした。EToysの「回す」は、SmalltalkのPlayerというクラスの
turn:というインスタンスメソッドで処理されるのですが、その中で引数は浮動小
数点数 (Float)に変換されていました。したがって、回転させた後の「向き
(heading)」の値も分数でなく浮動小数点数で保持しています。
同様に「進める」はforward:で処理されますが、これもFloatに変換されていまし
た。したがって、x座標、y座標などの値もFloatです。お詫びして訂正します。

「進める」「回す」を実現するためには割り算だけでなく、進める距離と回す角
度を、画面上の直交座標における差分に変換するために三角関数なども用いられ
ています。
したがって、「回す」の引数が割り切れることだけではなく、これらに関わる計
算全体の精度も影響します。これらが十分なため、結果として始点にもどってく
るという理解でいかがでしょうか。
このとき、ビューワのそれぞれのフレーズタイルの左にあるメニューから「小数
の桁数…」を選び、桁数を増やしてみると実は誤差が出ている(こともある)こと
が分かります。

> つぎに、「座標軸」と「向き」「シータ値」を見ながら実行する様子をAVI
>ファイルにまとめました。
>
> 「くるまのx座標、y座標、向き」が原点に戻ってくると、「シータ値」以外
>は少しずつ違ってきました。

違っている数は10^-13〜14というオーダですからほとんど0ですね。これが誤差で
すが、前述の「小数の桁数」が0なのに小数点以下が表示されてしまうのはバグだ
と思います。

> また中心から円に内接する正7角形をスクイークに書かせると、外延の出発
>点に正確に戻ってきました。

この方法だと、都度原点からの距離と角度を与えて極座標から直交座標に変換し
ているので、回って「戻ってきている」わけではないと思います。

> 子どもたちにもお母さんたちにも「文字を少なく、オブジェクト指向で説明
>する」というコンセプトですので、端的に表記したいのですが、スクイークに
>『回すと進める』のタイルスクリプトを実行する場合の説明方法をお教えくだ
>さい。

このケースでは、オブジェクト指向とはあまり関係ないように思います。
計算機における数の表現方法と誤差、それを表示する際の問題ではないでしょう
か。
本来、EToysはこれらを隠して、数学のモデルをそのまま扱えるようになっている
べきですが、残念ながらまだ不完全だと言うことだと思います。

 //abee
--
阿部 和広  EMAIL abee @ squeakland.jp



Squeak-ja メーリングリストの案内