ベクトルAとベクトルBがなす角度θを求めるには...
内積の定義 を使って解くことができます。
cosθ = ( AとBの内積 ) / (Aの長さ * Bの長さ)
このあとcosθからθを計算しますが、
プログラミングではacos()という逆余弦を求める関数を使います。
acos()で求められる値は、ラジアン単位で0~πの範囲です。
0~180度の馴染みの角度(degree)で求めたい場合は下の式を用います。
degree = ラジアン角度 * 180 / π
2つのベクトルのなす角度 プログラミング例 (2次元)
3次元のプログラミング例へ
#include <math.h>
//ベクトルの定義
struct Vector2D{
double x;
double y;
};
//ベクトルの長さを計算する
double get_vector_length( Vector2D v ) {
return pow( ( v.x * v.x ) + ( v.y * v.y ), 0.5 );
}
//ベクトル内積
double dot_product(Vector2D vl, Vector2D vr) {
return vl.x * vr.x + vl.y * vr.y;
}
//2つのベクトルABのなす角度θを求める
double AngleOf2Vector(Vector2D A, Vector2D B )
{
// ※ベクトルの長さが0だと答えが出ませんので注意してください。
//ベクトルAとBの長さを計算する
double length_A = get_vector_length(A);
double length_B = get_vector_length(B);
//内積とベクトル長さを使ってcosθを求める
double cos_sita = dot_product(A,B) / ( length_A * length_B );
//cosθからθを求める
double sita = acos( cos_sita );
//ラジアンでなく0~180の角度でほしい場合はコメント外す
//sita = sita * 180.0 / PI;
return sita;
}
2つのベクトルのなす角度 プログラミング例 (3次元)
2次元のプログラミング例へ
#include <math.h>
//ベクトルの定義
struct Vector3D{
double x;
double y;
double z;
};
//ベクトルの長さを計算する
double get_vector_length( Vector3D v ) {
return pow( ( v.x * v.x ) + ( v.y * v.y ) + ( v.z * v.z ), 0.5 );
}
//ベクトル内積
double dot_product(Vector3D vl, Vector3D vr) {
return vl.x * vr.x + vl.y * vr.y + vl.z * vr.z;
}
//2つのベクトルABのなす角度θを求める
double AngleOf2Vector(Vector3D A, Vector3D B )
{
// ※ベクトルの長さが0だと答えが出ませんので注意してください。
//ベクトルAとBの長さを計算する
double length_A = get_vector_length(A);
double length_B = get_vector_length(B);
//内積とベクトル長さを使ってcosθを求める
double cos_sita = dot_product(A,B) / ( length_A * length_B );
//cosθからθを求める
double sita = acos( cos_sita );
//ラジアンでなく0~180の角度でほしい場合はコメント外す
//sita = sita * 180.0 / PI;
return sita;
}