三角形の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]
誤差はあるものの結果は一致します。本当に興味が尽きず、ますます沼にはまってしまいそうです。