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

点と線の距離を求める

点と線の距離を求める方法とプログラミング例を紹介

点と線の距離を求める(2次元 3次元)

点ABを通る線と点Pから、点と直線の距離Hを求めるには...

ベクトルABとベクトルAPを外積(cross product)して、Dの面積を求めます。

Dの面積 = ベクトルAB × ベクトルAP

Dは平行四辺形なので「 H * L = D 」であることがわかります。

点と直線の距離H = D / L

プログラミング例(2次元)


#include <math.h>

//頂点の定義
struct Vertex2D{
	double x;
	double y;
};
//ベクトルの定義(頂点と同じ)
#define Vector2D Vertex2D

//点間距離
double distance_vertex(Vertex2D p1, Vertex2D p2) {
	return pow( ( p2.x - p1.x ) * ( p2.x - p1.x ) + ( p2.y - p1.y ) * ( p2.y - p1.y ), 0.5 );
}

//ベクトル外積
double cross_vector(Vector2D vl, Vector2D vr) {
	return vl.x * vr.y - vl.y * vr.x;
}

//点Pと線(AB)の距離
double Distance_DotAndLine(Vertex2D P, Vertex2D A, Vertex2D B )
{
	Vector2D AB,AP;

	AB.x = B.x - A.x;
	AB.y = B.y - A.y;
	AP.x = P.x - A.x;
	AP.y = P.y - A.y;

	//ベクトルAB、APの外積の絶対値が平行四辺形Dの面積になる
	double D = abs( cross_vector( AB, AP ) );

	double L = distance_vertex( A, B );	//AB間の距離

	double H = D / L;
	return H;

}


プログラミング例(3次元)


#include <math.h>

//頂点の定義
struct Vertex3D{
	double x;
	double y;
	double z;
};
//ベクトルの定義(頂点と同じ)
#define Vector3D Vertex3D

//点間距離
double distance_vertex(Vertex3D p1, Vertex3D p2) {
	return pow( ( p2.x - p1.x ) * ( p2.x - p1.x ) + ( p2.y - p1.y ) * ( p2.y - p1.y ) + ( p2.z - p1.z ) * ( p2.z - p1.z ), 0.5 );
}

//ベクトル長さ
double length_vector(Vector3D v) {
	return pow( v.x * v.x + v.y * v.y + v.z * v.z , 0.5 );
}

//ベクトル外積
Vector3D cross_vector(Vector3D vl, Vector3D vr) {
	Vector3D ret;
	ret.x = (vl.y * vr.z) - (vl.z * vr.y);
	ret.y = (vl.z * vr.x) - (vl.x * vr.z);
	ret.z = (vl.x * vr.y) - (vl.y * vr.x);

	return ret;
}

//点Pと線(AB)の距離
double Distance_DotAndLine(Vertex3D P, Vertex3D A, Vertex3D B )
{
	Vector3D AB,AP;

	AB.x = B.x - A.x;
	AB.y = B.y - A.y;
	AB.z = B.z - A.z;
	AP.x = P.x - A.x;
	AP.y = P.y - A.y;
	AP.z = P.z - A.z;

	//AB、APを外積して求められたベクトルの長さが、平行四辺形Dの面積になる
	double D = length_vector( cross_vector( AB, AP ) );

	//AB間の距離
	double L = distance_vertex( A, B );	//ABの長さ

	double H = D / L;
	return H;

}

戻る     次へ