直線をクリッピング(両端を切り取る)時に、どこが両端になるかを判定するのは非常に難しい。これはシンデレラでユーリが力説していたところで、彼らは「自動定理証明機能」を搭載することにより解決した。
つまりこういうこと。2点を通る直線だからといって、その両端がその2点とは限らない。直線と直線の交点があったりして、それがもっと外側にあれば、そこが端になる。これはまだいい。ほかの作図によって得られた点が「数学の定理によって」その直線上にある場合も加味しなければならぬ。
こうなると「自動定理証明機能」がどうしても必要だ。シンデレラの本に理屈は書いてあるので、何とかなるように思うが、基本的な考え方は次のとおりである。
こうなると「自動定理証明機能」がどうしても必要だ。シンデレラの本に理屈は書いてあるので、何とかなるように思うが、基本的な考え方は次のとおりである。
(1)作図を丸々コピーして同じものを作る。
(2)自由に動ける点を上下左右(複素方向にも)パーターブする。
(3)調べたい直線について、すべてのパーターブでインシデントが確認できればそれは「その直線上の点」と認定する。(認定する、というところがポイントで、論理的に上にあるかどうかを問題にしているのではない。)
(2)自由に動ける点を上下左右(複素方向にも)パーターブする。
(3)調べたい直線について、すべてのパーターブでインシデントが確認できればそれは「その直線上の点」と認定する。(認定する、というところがポイントで、論理的に上にあるかどうかを問題にしているのではない。)
平面幾何の定理の証明をグレブナー基底から取り組む動きもあるようだが、シンデレラ方式のほうが軽くて済むという利点がある。上の手順は何回も行うのではなくて、点を追加したとき、直線を追加したときにおのおのチェックして、そのデータをためておけばよい。
incidentという配列変数を作ることを提案する。
CPointクラスの中では
CLine* incident[];
CLineクラスの中では
CPoint* incident[];
という配列型になると思われる。
ただ、配列の長さが予測不可能なのでその点をどうするかが問題だ。見つかり次第鎖のようにつないでいくほうが良いと思う。それならば、
CPointクラスの中では
CLine** last_incident;
CLine* incident;
などとするほうが良いだろう。うん、こっちでいこう。
CPointクラスの中では
CLine* incident[];
CLineクラスの中では
CPoint* incident[];
という配列型になると思われる。
ただ、配列の長さが予測不可能なのでその点をどうするかが問題だ。見つかり次第鎖のようにつないでいくほうが良いと思う。それならば、
CPointクラスの中では
CLine** last_incident;
CLine* incident;
などとするほうが良いだろう。うん、こっちでいこう。
あとは作ってみてから報告する。(8月1日、あはら)