オイラー線をPythonで求める

三角形の5心の計算をしていると、オイラー線という興味深いものに出会います。まずは、前提として、線分paとpbをm:nに内分する点を求める関数を作成します。

#internal division
def i_division(pa,pb,m,n):
    i_div=[]
    for i,j in zip(pa,pb):
        i_div.append((n*i+m*j)/(n+m))
    return i_div

#external division
def e_division(pa,pb,m,n):
    e_div=[]
    for i,j in zip(pa,pb):
        e_div.append((-n*i+m*j)/(-n+m))
    return e_div

次に、点A(12,18),B(390,18),C(102,138)に対して、前提として、垂心、外心を求めます。

pa=(12,18)
pb=(390,18)
pc=(102,138)

print(orthocenter(pa,pb,pc),circumcenter(pa,pb,pc))
[102.0, 234.0] [201.00000000000003, -30.0]

この、垂心と外心を結ぶ線分のことをオイラー線といいます。オーラ―線は大数学者の名前がついているだけあってかなり有名で、sympyでも計算することができます。

import sympy.geometry 
A, B, C = sympy.geometry.Point(pa), sympy.geometry.Point(pb), sympy.geometry.Point(pc)
tri_s = sympy.geometry.Triangle(A, B, C)

print(tri_s.eulerline)
Line2D(Point2D(102, 234), Point2D(201, -30))

このように、少し誤差は出てしまいますが、結果は同じになります。それでは、なぜオイラー線がすごいかというと、オイラー線を2:1に内分する点が重心になるということです。

print(i_division(orthocenter(pa,pb,pc),circumcenter(pa,pb,pc),2,1))
print(centergravity(pa,pb,pc))
[168.00000000000003, 58.0]
[168.0, 58.0]

誤差はあるものの結果は一致します。本当に興味が尽きず、ますます沼にはまってしまいそうです。

この記事を書いた人

目次
閉じる