点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;
}