点と直線の距離

点P、線分AB、があったときに、PからABへの垂線の足の長さを求めるには?
要素は2次元空間内に存在するものとします。

解法1

解説

垂線の足点 I を求めて、ベクトル PI の長さとして、距離dを求めます。

図よりAIの大きさは、
|AI| = |AP|cosαである。・・・①

内積の公式より
AP・AB = |AP||AB|cosα ・・・②

式①②より、
|AI| = (AP・AB) / |AB|

|AI| がもとまれば、点Iの位置は、
A + ( |AI|/|AB| ) AB
= A + ( (AP・AB) / |AB||AB| ) AB
として求まります。
ベクトル IP は、Iの位置が求まったので、求まります。

考察

計算に一時変数(垂線の足点 I )が必要なのが速度、精度の面で気になる。
が、垂線の足点 I が線分AB上にあるかどうかを、( (AP・AB) / |AB||AB| ) の値が、0~1かどうかで判定することができます。

解法2

解説

距離 d は、
d = |AP| sinα ・・・①

外積の公式
PA × AB = |PA| |AB| sinα ・・・②
より、sinαは、外積が求まれば求まることがわかる。

式①、②より
d = |AP| sinα
 = ( PA × AB ) / |AB|
となる。
(半空間テストのために、ベクトルAPではなくPAにしている。PがABの右側なら、dは負の値として求まります。)

考察

半空間テストに備えて、負の値が返ってくることもあるように設計してあります。

ダウンロード

サンプルプロジェクト