点と線分間の距離

会社で点と線分の距離を計算する必要があって、困っていたら、

http://www.deqnotes.net/acmicpc/2d_geometry/lines

に書いてあったので、Python風に書き換え。

def dot(p1, p2):
    return p1.real*p2.real + p1.imag*p2.imag

def cross(p1, p2):
    return p1.real*p2.imag - p1.imag*p2.real

def dotLineDist(p, line):
    "line: (p1, p2)"
    a, b = line
    if dot(b-a, p-a) <= 0.0:
        return abs(p-a)
    if dot(a-b, p-b) <= 0.0:
        return abs(p-b)
    return abs(cross(b-a, p-a))/abs(b-a)

if __name__ == "__main__":
    print dotLineDist(1+2j, (1+1j, 2+2j))

引き算の再定義(というかクラス作るの)が面倒で複素数を使ってみたが、なかなか便利。

それにしても競技プログラミング馬鹿にしてたけど、こういうのがパッと書けるようになったら格好良いので、もうちょっと真面目にやってみようかなぁ。