プロが教える店舗&オフィスのセキュリティ対策術

三次元空間の3点のなす角度を知る公式が知り無たいのです。直交座標で、3点の x, y, z 座標値はわかっているものとします。

自分でいろいろ考えたのですが、かなりややこしくなってしまいこれは公式を見つけないとだめだなと思いました。よろしくお願いします。

A 回答 (2件)

3点をA(a1,a2,a3),B(b1,b2,b3),C(c1,c2,c3)とします.


ベクトルAB,ベクトルAC,ベクトルBCを算出します.
そうすると三角形ができます.
あとは知りたい角をθと置いて,余弦定理を使ってcosθを求めます.
求まったcosθの値からθを求めましょう.
    • good
    • 2
この回答へのお礼

ふむふむ、余弦定理を用いるのがキモなのですね。
(ベクトルABというのは、AB間の距離、と解釈しています)

なんとかそれなりの値(?)を出すことができました。ありがとうございました。

後から参照する方のために、Perl のサブルーチンの形で載せておきます。合ってるかどうかわかりませんが、参考までに。




sub get_angle {

#
my $len_a = (
($point_a->{x} - $point_b->{x}) ** 2
+ ($point_a->{y} - $point_b->{y}) ** 2
+ ($point_a->{z} - $point_b->{z}) ** 2
) ** (1/2);

my $len_c = (
($point_c->{x} - $point_b->{x}) ** 2
+ ($point_c->{y} - $point_b->{y}) ** 2
+ ($point_c->{z} - $point_b->{z}) ** 2
) ** (1/2);

my $len_b = (
($point_a->{x} - $point_c->{x}) ** 2
+ ($point_a->{y} - $point_c->{y}) ** 2
+ ($point_a->{z} - $point_c->{z}) ** 2
) ** (1/2);

my $cos_b = eval { ( $len_a ** 2 + $len_c ** 2 - $len_b **2 ) / ( 2 * $len_a * $len_c ) };

use Math::Trig;

my $rad = acos $cos_b;
my $deg = rad2deg $rad;

return $deg;
}

お礼日時:2004/11/10 19:34

ちょっと、質問が漠然としていて分かりにくいのですが……。

No.1のgraduated Studentさんのやり方でも良いのですが、もっといい方法があります。

A点、B点、C点を結ぶと三角形が出来ますね。それで、
たとえば角Aが知りたいとき、ベクトルAB(これをA→Bと表す)とベクトルAC(これをA→Cと表す)を求める。
(このやり方は、わかりますよね?)で、それぞれの大きさを求める。(このやり方もわかりますよね?それぞれXYZ座標を二乗し、たして、ルートを取ればいいのですよ。)それを掛け合わせたものを(分母)とします。それで、つぎは、A→BとA→Cの内積を取ればよい。(このやり方もわかりますよね?それぞれXYZ 座標を掛け合わせて足せばいいのですよ。)その値を(分子)とします。そうすると、(分子)/(分母)が
その角度のCOSθとなるのです。そこから求めましょう。あとの角度は、やり方はまったく同じ。
二次方程式の解の公式のような、値を入れれば一発で……、というものは存在しません。気合を込めて求めましょう。
    • good
    • 0
この回答へのお礼

ベクトルAB、というのは二点間の距離、と解釈してよろしいでしょうか? 内積・・遠い昔に習ったような、習わなかったような気がします(笑 最終的にはプログラムの形にしたかったので、単純なスカラー値?だけで求まる(であろう)余弦定理を使わせて頂きました。こういった解法もあるということで、参考にさせて頂きます。ご回答ありがとうございました。

お礼日時:2004/11/10 19:37

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