システムメンテナンスのお知らせ

空間座標内の3点A(a1,a2,a3),B(b1,b2,b3),C(c1,c2,c3)で定義される三角形の∠BACを求めたいのですが、どのような方法があるでしょうか。できれば、AからBへ向かう辺を角度ゼロとして、三点の座標を入力するだけで(ベクトルの正規化等を用いず)∠BACを0度~360度の値(ラジアンでもいいです)で返すような式が欲しいです。
よろしくお願いします。

gooドクター

A 回答 (2件)

空間座標でも、角度を求めるときは平面座標と同じ次の公式を使えます。



※AB, ACはベクトル
cosθ = (AB・AC) / (|AB|*|AC|)

次のように計算すればいいでしょう。ただし、cosθからθを求める関数(アークコサイン関数)が必要です。

∠BAC を θ とおきます。

AB = (b1-a1, b2-a2, b3-a3)
AC = (c1-a1, c2-a2, c3-a3)
|AB| = √((b1-a1)^2 + (b2-a2)^2 + (b3-a3)^2)
|AC| = √((c1-a1)^2 + (c2-a2)^2 + (c3-a3)^2)
AB・AC = (b1-a1)*(c1-a1) + (b2-a2)*(c2-a2) + (b3-a3)*(c3-a3)
cosθ = (AB・AC) / (|AB| * |AC|)
θ = cos^(-1)θ ←アークコサイン関数

これを一つの式にまとめれば一発で計算できます。

この回答への補足

さっそくの回答、ありがとうございます。
上記の式が返すθは、0≦θ≦πだと思うのですが、
0≦θ≦πと、π≦θ≦2πの区別は、A,B,Cの座標で判別可能なのでしょうか?

補足日時:2006/07/24 21:14
    • good
    • 0

#1さんのような内積を使って「角度」を定義するのが一般的です。

ですので、普通は、角度は0°から180°の範囲になります。

2次元平面で360°までの角度が自然に定義できるのは、むしろ、例外です。
3次元空間も含めて、普通は、0°から360°の角度を定義しようとすると、どう頑張っても「不自然」な定義になってしまいます。(それでも、というのであれば、角度の定義を補足してください)

------------------------------------------------
参考程度。

A(0,0,0),B(1,0,0)とします。
C(0,1,0)の時の∠BACの値
C(0,-1,0)の時の∠BACの値
それぞれいくつになると考えますか?

おそらく、答えは「両方とも90°(あるいは270°)」か「一方が90°で他方が270°」のどちらかだと思います。

・「両方とも90°(あるいは270°)」と考える場合:
∠BAC=270°(あるいは90°)となるような具体例を考えてみてください。

・「一方が90°で他方が270°」と考える場合:
Cがyz平面の単位円をぐるっと一周する(途中で点(0,1,0)と点(0,-1,0)を通ります)時、∠BACがどのように変化するのかを考えてみてください。

角度の範囲を0°から360°で定義しようとすると、こういう変なことになるので、「不自然」と書きました。
    • good
    • 1
この回答へのお礼

ありがとうございました、解決です!

お礼日時:2006/07/24 22:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング