sasaharayuugo.net

ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その28

グラフで表現したユークリッド幾何学の自動解答に挑戦している。ジュニア算数オリンピック 二次元上のユークリッド幾何の問題 その26 - ニート歴10年からの数学日記までを参考にしている。
 

 

09年度トライアル問題 問題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から始まる角を生成したりする。


やっぱり、ポジティブネガティブ無しの記述法に挑戦してみたい。同じ問題で最初からそれを試してみよう。
そして駄目だったら、またここに戻ってこよう。