読者です 読者をやめる 読者になる 読者になる

2点を通る直線から離れた位置にある点までの距離を求める

Python NumPy

タイトルの通り。2点を通る直線から離れた位置にある点までの距離を求めるのに、NumPyを使って計算します。
点a(x1, y1), 点b(x2, y2), 点c(x3, y3)があり、aとbを通る直線abから離れた位置に点cがあります。
点cから直線abへ引いた垂線の長さをLとします。このLを求めたい。
イメージとしてはこんな感じ。

Lを求めるには、ベクトルの外積を使って求めると簡単とか。
点aから点bと点cを結ぶの2つのベクトルuとvを考えます。

ここで、uとvの角をθとします。
uとvの外積は、次の式で表せます。

u×v = |u||v|sin θ

両辺を|u|で割って右辺と左辺を入れ替えると、次のようになります。

|v|sin θ = u×v / |u|

また、Lは、三角関数の公式より次の式で表せます。

L = |v|sin θ

前述の式から、

L = u×v / |u|

となります。
uとvのベクトルの位置関係が変わると負の値になるので絶対値をとる必要があるかな。
NumPyでこれを計算します。

main.py

import numpy


def main():
    # a(x1, y1) = (2, 2)
    x1 = 2
    y1 = 2
    # b(x2, y2) = (6, 4)
    x2 = 6
    y2 = 4
    # c(x3, y3) = (4, 5)
    x3 = 4
    y3 = 5
    u = numpy.array([x2 - x1, y2 - y1])
    v = numpy.array([x3 - x1, y3 - y1])
    L = abs(numpy.cross(u, v) / numpy.linalg.norm(u))
    print L

if __name__ == '__main__':
    main()

実行結果

$ python main.py 
1.788854382

12/29追記

途中の式が間違ってたので修正しました。 id:sumim さん指摘ありがとうございます。