Kids Cindyとそのスキーム 阿原一志 (明治大学) Kids Cindy • Kids Cindy は シンデレラ(by J. Richter-Gebert , U. Kortenkamp)のサ ブセットです。 • フリーウエアとして配布予定. • Kids Cindyはインタラクティブな幾何学 ソフトで、小学生を対象に考えています。 シンデレラにある機能 • 現時点でのKids Cindyのモードを紹介 します。 • 点を加える – シングルクリックで点を追 加します。 • 直線を加える (2点つき) – 1回のマウス ドラッグにより2点つき直線を追加しま す。 • 円を加える (中心と円上の点つき)1回 のマウスドラッグにより、中心と円上の 点がついた円を追加します。 直線を引くだけでも・・ • 「1回のマウスドラッグにより」といっても、 さまざまな場合があります。「点のない ところから点のないところへ」「既存の点 から何もないところへ」「何もないところ から既存の点へ」「何もないところから 既存の直線上へ」「何もないところから2 直線の交点へ」「何もないところから既 存の円上へ(これからサポート予定)」 シンデレラにある機能 • 垂線を加える (平行線を加える) すでに ある直線に対して、1回のドラッグで、垂 線(または平行線)を追加します。 • 中点を加える –1回のドラッグで中点を 追加します。 頂点を動かす機能 • 作図をした後に、自由頂点を(マウスド ラッグにより)動かすことができます。実 際には、作図を直接画面に描画してい るのではなく、「作図手順」というクラス を作って、それに従って描画しています。 • 完全に作図が確定するオブジェクトは いいのですが、任意性が残るオブジェ クトの処理が問題になります。 任意性の残るオブジェクト • 「直線上の点」というオブジェクト:直線 が2点で決められているとすれば、直線 状に座標が決まるので、その座標を保 存するようにすればよい。しかし、「1点 および向き」で直線が決まっている場合 には、座標が定まらないので、を動かし ようがない。(本家シンデレラでもこの部 分はバグになっている。) 任意性の残るオブジェクト • 「円と直線の交点」「円と円の交点」(以 上未対応)は、基本的に2点あるので、 そのどちらがユーザの求めている点で あるかを連続的に与えなければいけな い。(→ユーリのアルゴリズム:自由点 を動かすときに、点が連続変形するよう に代数的に追跡する。自由点はまっす ぐ動かさず、虚軸方向にすこし寄り道し て動かす。(右回りアルゴリズム)) 点の表現 • シンデレラ同様、点は 複素射影平面 P2(C)の点として扱う。 • つまり、3つの複素数の比 [x:y:z](ただ し [x:y:z]≠[0:0:0]、[x:y:z]=[tx:ty:tz]) を 考える。 • x/z と y/z が両方実数のときに限り、 (x/z,y/z) を描画面に表示する。 なぜかというと、 • なぜ複素数かというと、 例外処理を避けるた め:つまり、円と直線の 交点というオブジェクト は「交点がなければ消 滅」するのではなく、「複 素空間にあるので表示 されない」と解釈する。 ほかの理由 • 「2直線の交点」というオブジェクトを考 えるときに、射影平面で考えておけば、 「平行な場合」という例外処理をしなくて すむ。(平行線の交点がない、と解釈す るのではなく、平行な場合は交点が無 限遠点であり表示されない、と解釈す る。) 直線の表現 • 直線は : {[x:y:z] | ax+by+cz=0} • 比a:b:c が実比の場合に限り、直線 ax+by+c=0 を描画する。(たとえば、2 円の2交点を結ぶ直線は、2円が交わら ない場合には複素係数の直線になって いる。) 2点を通る直線 • 2点 [x1:y1:z1], [x2:y2:z2], に対して、この 2点を通る直線は次で与えられる。 2直線の交点 • 2直線 a1x+b1y+c1z=0, a2x+b2y+c2z=0 は [b1c2-b2c1:c1a2-c2a1:a1b2-a2b1] で交 わる。 (ただし、 a1b2-a2b1=0 の場合には、交点 は無限遠点である。) 平行線の表現 • 直線 ax+by+cz=0 が、 直線a0x+b0y+c0z=0 と平行であり、かつ 点 [x0:y0:z0] を通るならば、 a:b:c=a0z0 : b0z0 : -(a0x0+b0y0) 垂線の表現 • 直線 ax+by+cz=0 が、 a0x+b0y+c0z=0 に垂直でかつ点 [x0:y0:z0] を通るならば a:b:c=-b0z0 : a0z0 : -(-b0x0+a0y0) 角の2等分線 • 2直線 a1x+b1y+c1z=0, a2x+b2y+c2z=0, の角の2等分線は次で与えられる。(2 本ある) 具体的なスキーム • • 点、直線、円などの基本的なオブジェ クトをサポートするクラス 「座標により決まる点(自由点に対応 する)」「2点から決まる直線」「2直線 の交点」などの作図手順をサポートす るクラス 例:「2点を結ぶ直線」の近辺 class GConst { public: GPoint *PInput1,*PInput2; GLine *LOutput; GConst *next; short Const_Type; bool Evaluate(void); …… }; 例:「2点を結ぶ直線」の近辺 bool GConst::Evaluate(void) { switch(Const_Type){ case CONST_JOIN: if(PInput1==NULL || PInput2==NULL || LOutput==NULL){ return false; } LOutput->aa = PInput1->yy * PInput2->zz - PInput1->zz * PInput2->yy; LOutput->bb = PInput1->zz * PInput2->xx - PInput1->xx * PInput2->zz; LOutput->cc = PInput1->xx * PInput2->yy - PInput1->yy * PInput2->xx; break; } ... } ふわふわの直線を引くためには • 二つ方法が考えられる。ひとつはベクト ルデータにより、描画する方法。もうひ とつはビットマップを貼り付ける方法。 • KidsCindyではベクトルデータを採用。 自動定理証明機能 • シンデレラには「自動定理証明機能」が ある。各自由点を複素方向にパーター ブしてみたときの各オブジェクトの一致 状況(特定の2点がいつも重なる、特定 の点がいつも特定の直線上にある、な ど)を調査し、それを報告する。(実は非 自明であるかどうかの判定をシンデレ ラでは行っていない。) Future plans 円弧を描けるようにしたい(シンデレラ2で は対応) 動きを軽やかにしたい アニメーションに対応したい(作図手順を アニメーション表示したい) フォントを変えられるようにしたい 音が出るようにしたい シンデレラとのデータ交換をしたい 共同研究者募集中です!
© Copyright 2024 ExpyDoc