ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】三角形の五心を全て実装する

成果物

www.youtube.com
今まで、外心をよく使っていたのですが、垂心や傍心などはほとんど使ったことがなかったので実装してみました。三角関数を使って表されている場合もあるのですが、計算の負荷などを考え、使わずにする方法をなんとか見つけました。

仕組み

定義などはこちらを参考にしてください
三角形の五心の覚えておくべき性質を整理 | 高校数学の美しい物語

重心,Centroid,Center of Gravity

各頂点位置の平均を求めるだけです。
(x_G,y_G)=(\dfrac{x_A+x_B+x_C}{3},\dfrac{y_A+y_B+y_C}{3})

外心,Circumcenter

多くのサイトで三角関数を使って表されていますが、こちらの長めの数式を使うと、使わずに計算できます。
  \begin{array}{l}
{\displaystyle D=2( A_{x} (B_{y} -C_{y} )+B_{x} (C_{y} -A_{y} )+C_{x} (A_{y} -B_{y} )) .}\\
外心=( U_{x} ,U_{y})\\
{\displaystyle \begin{aligned}
U_{x} & =\frac{1}{D}\left( (A^{2}_{x} +A^{2}_{y} )(B_{y} -C_{y} )+(B^{2}_{x} +B^{2}_{y} )(C_{y} -A_{y} )+(C^{2}_{x} +C^{2}_{y} )(A_{y} -B_{y} )\right)\\
U_{y} & =\frac{1}{D}\left( (A^{2}_{x} +A^{2}_{y} )(C_{x} -B_{x} )+(B^{2}_{x} +B^{2}_{y} )(A_{x} -C_{x} )+(C^{2}_{x} +C^{2}_{y} )(B_{x} -A_{x} )\right)
\end{aligned}} \ 
\end{array}
外接円の半径は、外心と任意の頂点との距離を求めると得られます。
How do I find the circumcenter of the triangle using python without external libraries? - Stack Overflow

内心,Inner center, Incenter

頂点の座標を辺の長さで重み付けをするようにして得られます。
{\displaystyle \frac{a(x_{A} ,y_{A} )+b(x_{B} ,y_{B} )+c(x_{C} ,y_{C} )}{a+b+c}}
Incircle and excircles of a triangle - Wikipedia
また、内心円の半径は次の式で求められます。
{\displaystyle r=\frac{\sqrt{s(s-a)(s-b)(s-c)}}{s} ,} where\ {\displaystyle s=\frac{{\displaystyle a+b+c}}{2}}
Incircle and excircles of a triangle - Wikipedia

垂心,Orthocenter

少し長いですが、垂心はこちらの式で求めることができます。
 \begin{array}{l}
辺AB,辺BCの傾きを求めます。\\
ABm=\frac{B_{y} -A_{y}}{B_{x} -A_{x}}\\
BCm=\frac{C_{y} -B_{y}}{C_{x} -B_{x}}\\
傾き\frac{-1}{ABm} はABmに垂直なので、辺AB,辺BCの接線の方程式は\dotsc \\
y=\frac{-1}{ABm} x+b_{1} \ ( 1)\\
y=\frac{-1}{BCm} x+b_{2}\\
辺ABの接線はCを、辺BCの接線はAを通過するので、b_{1} ,b_{2} は\dotsc \\
b_{1} =C_{y} +\frac{C_{x}}{ABm}\\
b_{2} =A_{y} +\frac{A_{x}}{BCm}\\
二つの接線が交わる点なので\dotsc \\
\frac{-1}{ABm} x+b_{1} =\frac{-1}{BCm} x+b_{2}\\
x\left(\frac{-1}{ABm} +\frac{1}{BCm}\right) =b_{2} -b_{1}\\
x=\frac{b_{2} -b_{1}}{\frac{-1}{ABm} +\frac{1}{BCm}}\\
( 1) に代入して\\
y=\frac{-1}{ABm} x+b_{1}
\end{array}
こちらのサイトを元に実装に適した形に書き換えました。
How To Find Orthocenter of a Triangle | 4 Easy Steps (Video)

傍心,Excenter

三線座標系というものが内心では1:1:1なのですが、傍心では-1:1:1なので、それを利用して求めているようです。詳しくはこちらをご覧ください。
geometry - Finding the Excenter of a Triangle. - Mathematics Stack Exchange
傍心は三つあるので注意です。

コード

Five Triangle Centersという名前で追加しています。
github.com