Schemes in Kids Cindy -interactive geometry

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で
は対応)
動きを軽やかにしたい
アニメーションに対応したい(作図手順を
アニメーション表示したい)
フォントを変えられるようにしたい
音が出るようにしたい
シンデレラとのデータ交換をしたい
共同研究者募集中です!