グラフで表現したユークリッド幾何学の自動解答に挑戦している。ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その26 - ニート歴10年からの数学日記までを参考にしている。
『図で、AB = AE、DC = DEで、ABとDEは平行です。
また、角DAE = 53°、角AED = 106°、角CDE = 42°になっています。
このとき、角EBCの大きさを求めなさい。
(※図は正確ではありません。)
』
では初期条件。
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], []], [[D], [], []] ] ]; parallel_lines_lst := [ [[A, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B]], [D, [A], [], [C, B]], [C, [A, D], [], [B]], [B, [A, D, C], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [B]], [B, [C], [], []] ] , [ [B, [], [], [A, D]], [A, [B], [], [D]], [D, [B, A], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E] ]; triangle_lst := [ ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; }
graphから辺の和や180°の角の和は無し。
parallel_lines_lst(とgraph)から、BAE_p == AED_p;
angle_lstから、DAE_p + BAE_p == BAD_p;
ABE_p + CBE_p == ABC_p;
BCE_p + DCE_p == BCD_p;
CDE_p + ADE_p == ADC_p;
AED_p + CED_p == AEC_p;
AEB_p + AED_p == BED_p;
graphから、△ADE
△ABE
△BCE
△CDE
更にそれで登録した三角形から、ほぼそのままcluster_lstに登録
[[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]]
[[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]]
[[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]]
[[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]]
それらが全部終わってから、三角形定理ループを回す。しかし、どう明らかになるかはこの環境では分からない。
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], []], [[D], [], []] ] ]; parallel_lines_lst := [ [[A, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B]], [D, [A], [], [C, B]], [C, [A, D], [], [B]], [B, [A, D, C], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [B]], [B, [C], [], []] ] , [ [B, [], [], [A, D]], [A, [B], [], [D]], [D, [B, A], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE] ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; }
このままでは解答に至らないらしいので、作図に移る。
ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その26 - ニート歴10年からの数学日記、
ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その25 - ニート歴10年からの数学日記、
セットアップ時の角の和の取得法について - ニート歴10年からの数学日記、
ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その21 - ニート歴10年からの数学日記の後半、
ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その18 - ニート歴10年からの数学日記、
ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その17 - ニート歴10年からの数学日記、
ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その16 - ニート歴10年からの数学日記、
辺りを参考にする、後ろに行くほどもう参考にならないと思うけど。
では、点と点を結ぶ。今回はAとCを結ぶことにする。
graphのAとCにそれぞれ追加する。
次に、angle_lstの例えばAにおいて、CはDやEやBとどのような位置関係にあるか。
幸いそれぞれにおいて、AとCはそれぞれ繋がっている。だから位置関係も分かる。
(これは手元に図を描いて書いているのだが、)例えばDだと、時計回りでCからAからの順番なので、AにおいてCは、Dから時計回りで進んだ側にある。
Eだと、時計回りでAからCの順番なので、AにおいてCは、Eから時計回りで戻った側にある。
Bだと、時計回りでAからCの順番なので、AにおいてCは、Bから時計回りで戻った側にある。
つまり、
A : [ [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] ]
という風になるはずだ。
Cにおいてはそれぞれ逆なので、
C : [ [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] ]
という風になるはずだ。
clockwise_lstでも同じように登録する。
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []], [[C], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E], [], []], [[A], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], []], [[D], [], []] ] ]; parallel_lines_lst := [ [[A, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B]], [D, [A], [], [C, B]], [C, [A, D], [], [B]], [B, [A, D, C], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [B]], [B, [C], [], []] ] , [ [B, [], [], [A, D]], [A, [B], [], [D]], [D, [B, A], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE] ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; }
新しい辺の和や180°の角の和は無し。
angle_lstから、CAD_p + CAE_p == DAE_p;
CAD_p + BAC_p == BAD_p;
ACB_p + ACD_p == BCD_p;
ACE_p + ACD_p == DCE_p;
次にgraphから三角形を探す。
結果、△ABC、△ACD、△ACEが見つかるはずだ。
そのままクラスタに登録する。
更に、クラスタの分割をチェックするが、分割されても三角形になるだけなので無視する。
三角形定理ループを回す。この環境では分からない。
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []], [[C], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E], [], []], [[A], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], []], [[D], [], []] ] ]; parallel_lines_lst := [ [[A, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B]], [D, [A], [], [C, B]], [C, [A, D], [], [B]], [B, [A, D, C], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [B]], [B, [C], [], []] ] , [ [B, [], [], [A, D]], [A, [B], [], [D]], [D, [B, A], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE], △ABC : [BAC_p, AB, ABC_p, BC, ACB_p, AC], △ACD : [CAD_p, AC, ACD_p, CD, ADC_p, AD], △ACE : [CAE_p, AC, ACE_p, CE, AEC_p, AE] ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]] [[A, B, C], [BAC_p, AB, ABC_p, BC, ACB_p, AC]], [[A, C, D], [CAD_p, AC, ACD_p, CD, ADC_p, AD]], [[A, C, E], [CAE_p, AC, ACE_p, CE, AEC_p, AE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; CAD_p + CAE_p == DAE_p; CAD_p + BAC_p == BAD_p; ACB_p + ACD_p == BCD_p; ACE_p + ACD_p == DCE_p; }
で、三角関数での交点のチェック。
angle_lstのACで調べるのはもちろん、Aにおける他のD、E、Bにおいても、調べていく。Cにおける他でも調べていく。
そうするとDEとの間に交点ができるのが分かるはず。それをFと名付ける。
交点なので、graphは簡単に更新できる。
平行線リストも更新する。
更にそれでBAF_p == CFE_p; #これは次のステップでやるべきだったかもしれない
BAF_p == AFD_p;
angle_lstにFの角を作る。
clockwise_lstにもFを作る。
平面上リストにも点Fを追加する。
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []], [[C, F], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E], [], []], [[A, F], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E, F], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], []], [[D, F], [], []] ] , F : [ [[A], [], [C]], [[D], [], [E]] ] ]; parallel_lines_lst := [ [[A, B], [D, F, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B]], [D, [A], [], [C, B]], [C, [A, D], [], [B]], [B, [A, D, C], [], []] ] , F : [ [A, [], [], [D, C, E]], [D, [A], [], [C, E]], [C, [A, D], [], [E]], [E, [A, D, C], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [B]], [B, [C], [], []] ] , [ [B, [], [], [A, D]], [A, [B], [], [D]], [D, [B, A], [], []] ] ], F : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , [ [D, [], [], [C, E]], [C, [D], [], [E]], [E, [D, C], [], []] ] , [ [E, [], [], [A, D]], [A, [E], [], [D]], [D, [E, A], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E, F] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE], △ABC : [BAC_p, AB, ABC_p, BC, ACB_p, AC], △ACD : [CAD_p, AC, ACD_p, CD, ADC_p, AD], △ACE : [CAE_p, AC, ACE_p, CE, AEC_p, AE] ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]] [[A, B, C], [BAC_p, AB, ABC_p, BC, ACB_p, AC]], [[A, C, D], [CAD_p, AC, ACD_p, CD, ADC_p, AD]], [[A, C, E], [CAE_p, AC, ACE_p, CE, AEC_p, AE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; CAD_p + CAE_p == DAE_p; CAD_p + BAC_p == BAD_p; ACB_p + ACD_p == BCD_p; ACE_p + ACD_p == DCE_p; BAF_p == CFE_p; BAF_p == AFD_p; }
辺の和
AF + CF == AC; DF + EF == DE;
180°の角の和
AFD_p + CFD_p == AFC_h; AFE_p + CFE_p == AFC_h;
AFD_p + AFE_p == DFE_h; CFD_p + CFE_p == DFE_h;
angle_lstから角の和
しかしFを追加しただけなので、全部ハーフ。
三角形
△AFD
△AFE
△CFD
△CFE
そのままクラスタに
[[A, F, D], [CAD_p, AF, AFD_p, DF, ADE_p, AD]]
[[A, F, E], [CAE_p, AF, AFE_p, EF, AED_p, AE]]
[[C, F, D], [ACD_p, CF, CFD_p, DF, CDE_p, CD]]
[[C, F, E], [ACE_p, CF, CFE_p, EF, CED_p, CE]]
クラスタ割れているか 辺にFを加えて
[[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]],
[[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]],
[[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]]
[[A, B, C], [BAC_p, AB, ABC_p, BC, ACB_p, AC]],
[[A, C, D], [CAD_p, AC, ACD_p, CD, ADC_p, AD]],
[[A, C, E], [CAE_p, AC, ACE_p, CE, AEC_p, AE]]
から
DF, DFE_h, EF
AF, AFC_h, CF
なので
[[A, B, E, F, D], [BAD_p, AB, ABE_p, BE, BED_p, EF, DFE_h, DF, ADE_p, AD]],
[[A, D, F, E], [DAE_p, AD, ADE_p, DF, DFE_h, EF, AED_p, AE]],
[[C, D, F, E], [DCE_p, CD, CDE_p, DF, DFE_h, EF, CED_p, CE]]
[[A, B, C, F], [BAC_p, AB, ABC_p, BC, ACB_p, CF, AFC_h, AF]],
[[A, F, C, D], [CAD_p, AF, AFC_h, CF, ACD_p, CD, ADC_p, AD]],
[[A, F, C, E], [CAE_p, AF, AFC_h, CF, ACE_p, CE, AEC_p, AE]]
三角形定理ループを回す。けどこの環境では無理。
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []], [[C, F], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E], [], []], [[A, F], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E, F], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], []], [[D, F], [], []] ] , F : [ [[A], [], [C]], [[D], [], [E]] ] ]; parallel_lines_lst := [ [[A, B], [D, F, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B]], [D, [A], [], [C, B]], [C, [A, D], [], [B]], [B, [A, D, C], [], []] ] , F : [ [A, [], [], [D, C, E]], [D, [A], [], [C, E]], [C, [A, D], [], [E]], [E, [A, D, C], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B, C]], [C, [D], [], [E, B]], [E, [D, C], [], [B]], [B, [D, E, C], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D, A]], [E, [B], [], [D, A]], [A, [B, E], [], [D]], [D, [B, E, A], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [B]], [B, [C], [], []] ] , [ [B, [], [], [A, D]], [A, [B], [], [D]], [D, [B, A], [], []] ] ], F : [ [ [A, [], [], [D, C]], [D, [A], [], [C]], [C, [A, D], [], []] ] , [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , [ [D, [], [], [C, E]], [C, [D], [], [E]], [E, [D, C], [], []] ] , [ [E, [], [], [A, D]], [A, [E], [], [D]], [D, [E, A], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E, F] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE], △ABC : [BAC_p, AB, ABC_p, BC, ACB_p, AC], △ACD : [CAD_p, AC, ACD_p, CD, ADC_p, AD], △ACE : [CAE_p, AC, ACE_p, CE, AEC_p, AE], △AFD : [CAD_p, AF, AFD_p, DF, ADE_p, AD], △AFE : [CAE_p, AF, AFE_p, EF, AED_p, AE], △CFD : [ACD_p, CF, CFD_p, DF, CDE_p, CD], △CFE : [ACE_p, CF, CFE_p, EF, CED_p, CE] ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[A, B, E, F, D], [BAD_p, AB, ABE_p, BE, BED_p, EF, DFE_h, DF, ADE_p, AD]], [[A, D, F, E], [DAE_p, AD, ADE_p, DF, DFE_h, EF, AED_p, AE]], [[C, D, F, E], [DCE_p, CD, CDE_p, DF, DFE_h, EF, CED_p, CE]], [[A, B, C, F], [BAC_p, AB, ABC_p, BC, ACB_p, CF, AFC_h, AF]], [[A, F, C, D], [CAD_p, AF, AFC_h, CF, ACD_p, CD, ADC_p, AD]], [[A, F, C, E], [CAE_p, AF, AFC_h, CF, ACE_p, CE, AEC_p, AE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; CAD_p + CAE_p == DAE_p; CAD_p + BAC_p == BAD_p; ACB_p + ACD_p == BCD_p; ACE_p + ACD_p == DCE_p; BAF_p == CFE_p; BAF_p == AFD_p; AF + CF == AC; DF + EF == DE; AFD_p + CFD_p == AFC_h; AFE_p + CFE_p == AFC_h; AFD_p + AFE_p == DFE_h; CFD_p + CFE_p == DFE_h; }
前の作図はこれで終わりなはずなので、次の作図に行く。次は線のその分だけの延長。盤面をリセットする。
これはこの方法で良いか試すためにやっているので、なるべく問題ごとが起こりそうな作図が良い。辺CEをEの方向に同じだけ伸ばしてみよう。先端にできる新しい点をFと名付ける。
まずgraphを更新する。CとEを更新して、また点Fを作る。
次にangle_lstを更新する。Eを更新して、また点Fを作る。
Eにおいては、Cが端っこにある角があれば、そのままその反対側にFを入れれば良い。
今回はそういう角を2つ作ることができたので、これは不確定要素無く記載することができたはずだ。
E : [ [ [F, [], [], [A, D, C]] [A, [F], [], [D, C]], [D, [A, F], [], [C]], [C, [A, D, F], [], []] ] , [ [C, [], [], [B, F]], [B, [C], [], [F]], [F, [C, B], [], []] ] , [ [B, [], [], [A, D]], [A, [B], [], [D]], [D, [B, A], [], []] ] ]
Fはどうしようかな、一つだけのEの角を作るのか、そもそも作らないのか。作ってみて、いらないと分かったら作らないことにしよう。いや作らないことにした、正の角じゃないし。
clockwise_lstに反映させる。いや、点Eにおける2つの角においてはFはその位置で良いのだけど、角BADにおいてもBとAの間にFが入るはずなんだな。
Cが途中にある角だと、Fが入らないことは確実なんだが、そもそもCが入っていない角だと、こういう場合があり得るのだな。
今回だけであれば、angle_lst→clockwise_lst→angle_lstで何とかなるんだが。まあ、今回はそういうことにしようか。
angle_lstに点Fが角が無い状態で作成されることを考えると、作業手順的には同時ということになるんだろうけど。
プログラムの上から見ていって、平行線リストへの追加は無いとして、後は平面上リストに追加する。
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E, F], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], [F]], [[D], [], []] ] , F : [ [[C, E], [], []] ] ]; parallel_lines_lst := [ [[A, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B, F]], [D, [A], [], [C, B, F]], [C, [A, D], [], [B, F]], [B, [A, D, C], [], [F]], [F, [A, D, C, B], [], []] ] , F : [ [E, [], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [F, [], [], [A, D, C]] [A, [F], [], [D, C]], [D, [A, F], [], [C]], [C, [A, D, F], [], []] ] , [ [C, [], [], [B, F]], [B, [C], [], [F]], [F, [C, B], [], []] ] , [ [B, [], [], [A, D, F]], [F, [B], [], [A, D]], [A, [B, F], [], [D]], [D, [B, A, F], [], []] ] ] , F : [ ] ]; coplanar_lst := [ [A, B, C, D, E, F] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE] ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; }
プログラム(というよりデータ構造)を上から見ていって
辺の和、直線の分割による角の和
平行線リストによる角のイコール
angle_lstによる角の和の発見(本当はclockwise_lstも入れて全ての角の和を出すべき、でも今回は最初がそうじゃないから)
graphによる三角形の発見
発見した三角形をそのままクラスタに
クラスタが割れているか
三角形定理ループ
という順番で行く。
辺の和
CE + EF == CF;
角の和
AEC_p + AEF_p == CEF_h;
BEC_p + BEF_p == CEF_h;
CED_p + DEF_p == CEF_h;
平行線リストによる角のイコールは、交点がまだ発生してないので無し
三角形は、探してないが、Eから伸ばしただけなのでどうせ無い。
だから新しくクラスタとして登録する三角形は無し
またクラスタの分割も、クラスタ内で新しく点と点が繋がるということは無いはずなので、無し
三角形定理ループを回す。しかしこの環境では結果は分からない
graph := [ A : [ [[B], [], []], [[D], [], []], [[E], [], []] ] , B : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E, F], [], []] ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], [F]], [[D], [], []] ] , F : [ [[C, E], [], []] ] ]; parallel_lines_lst := [ [[A, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B, F]], [D, [A], [], [C, B, F]], [C, [A, D], [], [B, F]], [B, [A, D, C], [], [F]], [F, [A, D, C, B], [], []] ] , F : [ [E, [], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [F, [], [], [A, D, C]] [A, [F], [], [D, C]], [D, [A, F], [], [C]], [C, [A, D, F], [], []] ] , [ [C, [], [], [B, F]], [B, [C], [], [F]], [F, [C, B], [], []] ] , [ [B, [], [], [A, D, F]], [F, [B], [], [A, D]], [A, [B, F], [], [D]], [D, [B, A, F], [], []] ] ] , F : [ ] ]; coplanar_lst := [ [A, B, C, D, E, F] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE] ]; cluster_lst := [ [[A, B, C, D], [BAD_p, AB, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, B, E, D], [BAD_p, AB, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, B, E], [BAE_p, AB, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; CE + EF == CF; AEC_p + AEF_p == CEF_h; BEC_p + BEF_p == CEF_h; CED_p + DEF_p == CEF_h; }
作図、分析(セットアップとほぼ同じ)と来て、ここで交点の発見をする。
本当は、分析で新しく角が明らかになったりしているのだから、今回だとEFに関して以外でも三角関数で発見する必要がある。
全ての辺を基準にして、それをすれば良い。つまり、Aに属する辺、Bに属する(A以外の)辺、Cに属する(AとB以外の)辺、という風な順番で調べていけば良い。
今回の問題では、上の3つの三角形は全て角度が分かっているし、辺を共有しているので比率でこの形は明らかになっている。更に下の三角形も、三角関数で比率で明らかになっている。
交点がAB上にできることは明らかになるだろう。
ここで一旦、流れをまとめてみた。
「作図」
データ構造を上から見ていって
graphを更新する
平行線リストを更新する
angle_lstとclockwise_lstを更新する
平面上リストを更新する
「分析」
辺の和、直線の分割による角の和
平行線リストによって角のイコール
angle_lstとclockwise_lstによる角の和
三角形の発見
発見した三角形をそのままクラスタに
クラスタが割れているか
三角形定理ループ
「交点の発見」
Aから全ての辺で調べていく (一つの点における平均的な辺の数 ^3 * 点の数)
graphは簡単に更新できる
平行線リストを更新する
angle_lstとclockwise_lstに交点を追加する(交点の場合は他はいじる必要はない)
平面上リストにも交点を追加する
(交点が発生する辺を持つクラスタをどうするかは迷うな、次の分析のステップでやるかどうかが)
(以下、分析、交点の発見、分析、交点の発見、という風に続いていく)
ではABとEFの交点Gを作図していく。
交点が発生する辺を持つクラスタをどうするかで迷うんだよな。今回は辺ABを持つクラスタだけど。やってしまおうか。
A, B → A, G, B
AB → AG, AGB_h, BG
という風に差し替える。
graph := [ A : [ [[B, G], [], []], [[D], [], []], [[E], [], []] ] , B : [ [[A, G], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E, F], [], []] #後から発見したが、Gを入れてないというミス ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], [F, G]], [[D], [], []] ] , F : [ [[C, E, G], [], []] ] , G : [ [[A], [], [B]], [[F], [], [E, C]] ] ]; parallel_lines_lst := [ [[A, G, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B, F]], [D, [A], [], [C, B, F]], [C, [A, D], [], [B, F]], [B, [A, D, C], [], [F]], [F, [A, D, C, B], [], []] ] , F : [ [E, [], [], []] ] , G : [ [F, [], [], [A, E, B]], [A, [F], [], [E, B]], [E, [F, A], [], [B]], [B, [F, A, E], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [F, [], [], [A, D, C]] [A, [F], [], [D, C]], [D, [A, F], [], [C]], [C, [A, D, F], [], []] ] , [ [C, [], [], [B, F]], [B, [C], [], [F]], [F, [C, B], [], []] ] , [ [B, [], [], [A, D, F]], [F, [B], [], [A, D]], [A, [B, F], [], [D]], [D, [B, A, F], [], []] ] ] , F : [ ] , G : [ [ [F, [], [], [A, E]], [A, [F], [], [E]], [E, [F, A], [], []] ] , [ [A, [], [], [E, B]], [E, [A], [], [B]], [B, [A, E], [], []] ] , [ [E, [], [], [B, F]], [B, [E], [], [F]], [F, [E, B], [], []] ] , [ [B, [], [], [F, A]], [F, [B], [], [A]], [A, [B, F], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E, F, G] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE] ]; cluster_lst := [ [[A, G, B, C, D], [BAD_p, AG, AGB_h, BG, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, G, B, E, D], [BAD_p, AG, AGB_h, BG, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, G, B, E], [BAE_p, AG, AGB_h, BG, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; CE + EF == CF; AEC_p + AEF_p == CEF_h; BEC_p + BEF_p == CEF_h; CED_p + DEF_p == CEF_h; }
分析する。
辺の和、直線の分割による角の和
CE + EG == CG;
AEC_p + AEG_p == CEG_h;
BEC_p + BEG_p == CEG_h;
CED_p + DEG_p == CEG_h;
AG + BG == AB;
FG + EG == EF;
FG + CG == CF;
AGF_p + BGF_p == AGB_h;
AGE_p + BGE_p == AGB_h;
AGF_p + AGE_p == EGF_h;
BGF_p + BGE_p == EGF_h;
平行線リストによって角のイコール。ぶっちゃけ手順は忘れた
DEG_p == BGE_p;
DEG_p == AGF_p;
CED_p == AGE_p;
CED_p == BGF_p;
angle_lstとclockwise_lstによる角の和。今回はGを中心にした角だけで良い
いや、交点の場合はハーフだから、そもそも登録する必要すら無いのか。
三角形の発見
△AEG
△BCG
△BEG
発見した三角形をそのままクラスタに
[[A, E, G], [BAE_p, AE, AEF_p, EG, AGE_p, AG]]
[[B, C, G], [ABC_p, BC, BCE_p, CG, BGE_p, BG]]
[[B, E, G], [ABE_p, BE, BEF_p, EG, BGE_p, BG]]
クラスタが割れているか 今回はGだけを確認すれば良いみたいだ
[A, G, B, C, D]
CG
[A, G, C, D]
[G, B, C]
[[A, G, C, D], [BAD_p, AG, AGE_p, CG, DCE_p, CD, ADC_p, AD]]
[A, G, B, E, D]
EG
[A, G, E, D]
[G, B, E]
[[A, G, E, D], [BAD_p, AG, AGE_p, EG, DEF_p, DE, ADE_p, AD]]
三角形定理ループを回す。この環境だと無理だが
graph := [ A : [ [[B, G], [], []], [[D], [], []], [[E], [], []] ] , B : [ [[A, G], [], []], [[C], [], []], [[E], [], []] ] , C : [ [[B], [], []], [[D], [], []], [[E, F, G], [], []] #Gを入れるのを忘れていた ] , D : [ [[A], [], []], [[C], [], []], [[E], [], []] ] , E : [ [[A], [], []], [[B], [], []], [[C], [], [F, G]], [[D], [], []] ] , F : [ [[C, E, G], [], []] ] , G : [ [[A], [], [B]], [[F], [], [E, C]] ] ]; parallel_lines_lst := [ [[A, G, B], [D, E]] ]; clockwise_lst := [ A : [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] , B : [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] , C : [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] , D : [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] , E : [ [A, [], [], [D, C, B, F]], [D, [A], [], [C, B, F]], [C, [A, D], [], [B, F]], [B, [A, D, C], [], [F]], [F, [A, D, C, B], [], []] ] , F : [ [E, [], [], []] ] , G : [ [F, [], [], [A, E, B]], [A, [F], [], [E, B]], [E, [F, A], [], [B]], [B, [F, A, E], [], []] ] ]; angle_lst := [ A : [ [ [D, [], [], [E, B]], [E, [D], [], [B]], [B, [D, E], [], []] ] ] , B : [ [ [A, [], [], [E, C]], [E, [A], [], [C]], [C, [A, E], [], []] ] ] , C : [ [ [B, [], [], [E, D]], [E, [B], [], [D]], [D, [B, E], [], []] ] ] , D : [ [ [C, [], [], [E, A]], [E, [C], [], [A]], [A, [C, E], [], []] ] ] , E : [ [ [F, [], [], [A, D, C]] [A, [F], [], [D, C]], [D, [A, F], [], [C]], [C, [A, D, F], [], []] ] , [ [C, [], [], [B, F]], [B, [C], [], [F]], [F, [C, B], [], []] ] , [ [B, [], [], [A, D, F]], [F, [B], [], [A, D]], [A, [B, F], [], [D]], [D, [B, A, F], [], []] ] ] , F : [ ] , G : [ [ [F, [], [], [A, E]], [A, [F], [], [E]], [E, [F, A], [], []] ] , [ [A, [], [], [E, B]], [E, [A], [], [B]], [B, [A, E], [], []] ] , [ [E, [], [], [B, F]], [B, [E], [], [F]], [F, [E, B], [], []] ] , [ [B, [], [], [F, A]], [F, [B], [], [A]], [A, [B, F], [], []] ] ] ]; coplanar_lst := [ [A, B, C, D, E, F, G] ]; triangle_lst := [ △ADE : [DAE_p, AD, ADE_p, DE, AED_p, AE], △ABE : [BAE_p, AB, ABE_p, BE, AEB_p, AE], △BCE : [CBE_p, BC, BCE_p, CE, BEC_p, BE], △CDE : [DCE_p, CD, CDE_p, DE, CED_p, CE], △AEG : [BAE_p, AE, AEF_p, EG, AGE_p, AG], △BCG : [ABC_p, BC, BCE_p, CG, BGE_p, BG], △BEG : [ABE_p, BE, BEF_p, EG, BGE_p, BG] ]; cluster_lst := [ [[A, G, B, C, D], [BAD_p, AG, AGB_h, BG, ABC_p, BC, BCD_p, CD, ADC_p, AD]], [[A, G, B, E, D], [BAD_p, AG, AGB_h, BG, ABE_p, BE, BED_p, DE, ADE_p, AD]], [[A, E, C, D], [DAE_p, AE, AEC_p, CE, DCE_p, CD, ADC_p, AD]], [[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]], [[A, G, B, E], [BAE_p, AG, AGB_h, BG, ABE_p, BE, AEB_p, AE]], [[B, C, E], [CBE_p, BC, BCE_p, CE, BEC_p, BE]], [[C, D, E], [DCE_p, CD, CDE_p, DE, CED_p, CE]], [[A, E, G], [BAE_p, AE, AEF_p, EG, AGE_p, AG]], [[B, C, G], [ABC_p, BC, BCE_p, CG, BGE_p, BG]], [[B, E, G], [ABE_p, BE, BEF_p, EG, BGE_p, BG]], [[A, G, C, D], [BAD_p, AG, AGE_p, CG, DCE_p, CD, ADC_p, AD]], [[A, G, E, D], [BAD_p, AG, AGE_p, EG, DEF_p, DE, ADE_p, AD]] ]; always { AB == AE; CD == DE; DAE == 53; AED == 106; CDE == 42; BAE_p == AED_p; DAE_p + BAE_p == BAD_p; ABE_p + CBE_p == ABC_p; BCE_p + DCE_p == BCD_p; CDE_p + ADE_p == ADC_p; AED_p + CED_p == AEC_p; AEB_p + AED_p == BED_p; CE + EF == CF; AEC_p + AEF_p == CEF_h; BEC_p + BEF_p == CEF_h; CED_p + DEF_p == CEF_h; CE + EG == CG; AEC_p + AEG_p == CEG_h; BEC_p + BEG_p == CEG_h; CED_p + DEG_p == CEG_h; AG + BG == AB; FG + EG == EF; FG + CG == CF; AGF_p + BGF_p == AGB_h; AGE_p + BGE_p == AGB_h; AGF_p + AGE_p == EGF_h; BGF_p + BGE_p == EGF_h; DEG_p == BGE_p; DEG_p == AGF_p; CED_p == AGE_p; CED_p == BGF_p; }
じゃあリセットして、次の作図に行こうかな。
現在の二等辺三角形の作図は、底辺を基準に、角度が小さい方の辺にもう一方から新しい辺を伸ばすタイプと、角度が大きい方の辺の頂点から底辺に新しい辺を伸ばすタイプの、2種類がある。
ただ、この問題では、どちらにしてもそんなに問題は起こらないんじゃないかな、多分。
次の作図に行くことにする。クラスタを貼り合わせる。
なるべく問題が起こりやすそうな作図が良いので、△ADEのクラスタを、DEで回転させるように貼り付けよう。
新しい点をFとする。
[[A, D, E], [DAE_p, AD, ADE_p, DE, AED_p, AE]],
から
[[F, D, E], [DFE_p, DF, EDF_p, DE, DEF_p, EF]],
みたいなのを複製したい。
他は良いんだけど、angle_lstが難しい。
新しく作るFはAにおけるDとEの順番を反転させるだけで良い。しかしDとEは、例えばDの角において、Eを基準にAが時計回りで先側にあるなら、反転させたら戻った側にあるとは言えるが、それ以上言えるだろうか。
人間は、見た目や実際の角度を参考にして判断するわけだが。
こんな感じだろうか。
F : [ [ [E, [], [], [D]], [D, [E], [], []] ] ] D : [ [ [F, [], [C], [E, A], [C, [], [F], [E, A]], [E, [C, F], [], [A]], [A, [C, E, F], [], []] ] ] , E : [ [ [A, [], [], [D, C, F]], [D, [A], [], [C, F]], [F, [A, D], [C], []], [C, [A, D], [F], []] ] , [ [F, [], [C, B], []], [C, [], [F], [B]], [B, [C], [F], []] ] , [ [B, [], [], [A, D, F]], [A, [B], [], [D, F]], [D, [B, A], [], [F]], [F, [B, A, F], [], []] ] ]
FとDはこれで良いのだが、Eにおいては大いに問題がある。
まず、元々A・D・Cだった角には、本当はFは含まれない。それなのに、これではAとDにおいて後に存在すると確定しているようになってしまう。
最後のB・A・Dの角なんて最悪で、本当はこの角にFなんて含まれないのに、完全に確定しているかのようになってしまっている。
更に加えて、D・C・Fの角や、F・B・Aの角も、本当は新しく生まれてほしい。
clockwise_lstだったらこうなる。つまり、時計回りでEからAへは存在しない、反時計回りでDからAへは存在しない、ということになる。
D : [ [F, [], [C], [E, A]], [C, [], [F], [E, A]], [E, [C, F], [], [A]], [A, [C, E, F], [], []] ] , E : [ [A, [], [], [D, C, B, F]], [D, [A], [], [C, B, F]], [F, [A, D], [C, B], []], [C, [A, D], [F], [B]], [B, [A, D, C], [F], []] ]
いややはり、angle_lstで無くこのようにclockwise_lstで考えるべきなのだろうな。そして点EにおいてFから始まる角を生成したりする。
やっぱり、ポジティブネガティブ無しの記述法に挑戦してみたい。同じ問題で最初からそれを試してみよう。
そして駄目だったら、またここに戻ってこよう。