ゲームプログラミング技術集 
ひっと

2つのベクトルのなす角度を求める

2つのベクトルのなす角度を求める方法とプログラミング例を紹介

2つのベクトルのなす角度を求める(2次元 3次元)

ベクトル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;
}

戻る     次へ