以前のブログで傍心の計算をしました。傍心については、面白い性質があります。
トリリウムの定理
傍心と内心の中点3つを取ります。この3点は元の三角形の外接円上にあるというものです。まず準備として次のような関数を作っておきます。
def center(pa,pb,pc,ga,gb,gc):
ct=[]
for n in pa:
ct.append(n*ga)
for i,n in enumerate(pb):
ct[i]+=n*gb
for i,n in enumerate(pc):
ct[i]+=n*gc
c=[]
for k in ct:
c.append(k/(ga+gb+gc))
return c
def incenter(pa,pb,pc):
a,b,c=tri(pa,pb,pc)
return center(pa,pb,pc,a,b,c)
def circumcenter(pa,pb,pc):
a,b,c=tri(pa,pb,pc)
return center(pa,pb,pc,
sin_l(a,b,c)*cos_l(a,b,c),
sin_l(b,c,a)*cos_l(b,c,a),
sin_l(c,a,b)*cos_l(c,a,b))
def excenter(pa,pb,pc):
a,b,c=tri(pa,pb,pc)
return (center(pa,pb,pc,-a,b,c),
center(pa,pb,pc,a,-b,c),
center(pa,pb,pc,a,b,-c))
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
ここで、傍心と内心の中点を1:1で内分する点として、これら3点の外心円を計算します。
pa=(12,18)
pb=(390,18)
pc=(102,138)
e=excenter(pa,pb,pc)
i=incenter(pa,pb,pc)
c=circumcenter(pa,pb,pc)
print('元の三角形の外心',c)
cm0=i_division(e[0],i,1,1)
cm1=i_division(e[1],i,1,1)
cm2=i_division(e[2],i,1,1)
print('内心と傍心の中点の外心',circumcenter(cm0,cm1,cm2))
元の三角形の外心 [201.00000000000003, -30.0] 内心と傍心の中点の外心 [200.99999999999997, -30.00000000000004]
このように、外心が一致することから、トリリウムの定義がいうように内心と傍心の中点は元の三角形の外周円上にあるといえます。
さらに応用の定理
さらに、傍心円の3つの中点ももとの三角形の外心円上にあるともいわれています。
mm0=i_division(e[1],e[2],1,1)
mm1=i_division(e[2],e[0],1,1)
mm2=i_division(e[0],e[1],1,1)
print('傍心の3つの中点の外心',circumcenter(mm0,mm1,mm2))
傍心の3つの中点の外心 [201.0, -29.99999999999996]
これも外心円状にあることがわかりました。