| 点を順にA,B,C,…とします。 Aは原点にします。 Bはx軸上の正の(AB,0)にとります。 Cが直線AB上にないとき、Cをy>0の範囲にとることにすれば ただ一つに決まります。 このCの位置の計算方法はいろいろありますが、 三角関数を使ってよければ cos∠CAB=(AB^2+AC^2-BC^2)/(2AB・AC) によりcos∠CABを求め、sin∠CAB=√{1-(cos∠CAB)^2}により sin∠CABを求めてから (x,y)=(AC/AB)(B-A) C=A+(xcos∠CAB-ysin∠CAB,xsin∠CAB+ycos∠CAB) のように計算するのが簡単かと思います。 次のDの位置はほぼ同様ですが、 例えば△BCDを考えるときに直線CDのどちら側にあるかを 判定する必要があります。 まず上と同様に cos∠DBC=(BC^2+BD^2-CD^2)/(2BC・BD) sin∠DBC=√{1-(cos∠DBC)^2} (x,y)=(BD/BC)(C-B) D=B+(xcos∠DBC-ysin∠DBC,xsin∠DBC+ycos∠DBC) または D=B+(xcos∠DBC+ysin∠DBC,xsin∠DBC-ycos∠DBC) のように二つの候補を求めますが、 どちらが適解かはADの距離で判定します。 どちらで計算してもADと一致する場合は、どちらをとっても構いません。 残りの点も同様ですが、 最後の適解判定で既に決まっている点を判定できるまで順に使います。 つまり上と同様にして△GHIからIの候補を二つ求まったとき、 AIで判定できればそちら、判定できない場合はBIで判定、 それでも判定できなければCIで判定、…、最後にFIで判定しても 決まらないときはどちらでもOKです。 (判定できないのはA〜Hが一直線に並んでいる場合だけです。) これを繰り返せばすべての点の位置が決まりますね。
# 「AB」は線分ABの長さ、「BD」は線分BDの長さ、他も同様です。 # B-Aのように単独で使った場合はその位置(ベクトル)です。 # もし三角関数がわからない場合でも、cos∠CABをc、sin∠CABをs # のように単純な変数と考えて計算すればOKです。 # cos∠CABが1または-1の場合はA,B,Cが一直線に並んでいますので # 計算を分ける必要があるかも知れません。 # cos∠CABが1より大きいか-1より小さい場合は、点間の距離が正しくなく # AB,BC,CAが三角形の成立条件を満たしていません。 # また、cos∠CABが1または-1に非常に近い値の場合、計算誤差により # 正しく求まらない可能性があります。 # 複数の点が同じ位置だといろいろ不都合が起こりますので # それはないようにして下さい。
|