点と直線の距離
点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は負の値として求まります。)
考察
半空間テストに備えて、負の値が返ってくることもあるように設計してあります。