目的
外心を求めた前回の記事に引き続き,怒りに任せて任意次元空間における三角形の内心の簡単な求め方と実装を書きます.
方針
三角形の3頂点を$A, B, C$とし,適当な原点$O$を取ります.
求める点をPとすると,とある実数$x, y, z$を用いて
\vec{OP} = x \vec{OA} + y \vec{OB} + z \vec{OC} \\
(x+y+z=1)
と書けます.この式を点$A$からのベクトルに書き直します.
\vec{AP} = y \vec{AB} + z \vec{AC}
ここで注意することは,
内心は3つの角の二等分線の交点である。
ので(例えばWikipedia参照),適当な実数$k$を用いて
\vec{AP} = k \frac{\vec{AB}}{\|\vec{AB}\|} + k \frac{\vec{AC}}{\|\vec{AC}\|}
と書ける必要があります.そのためには
y\|\vec{AB}\| = z\|\vec{AC}\|
が必要です.
同様に
x\|\vec{AC}\| = y\|\vec{BC}\| \\
x\|\vec{AB}\| = z\|\vec{BC}\|
が成り立ちます.これは
\left(x, y, z\right) = \frac{1}{\|\vec{AB}\| + \|\vec{BC}\| + \|\vec{AC}\|} \left(\|\vec{BC}\|, \|\vec{AC}\|, \|\vec{AB}\|\right)
とすれば全て成立します
実装
vector<double> incenter(vector<double> P1, vector<double> P2, vector<double> P3){
vector<double> ans(D, 0.0);
double AB2=0.0;
double AC2=0.0;
double BC2=0.0;
for(ll i=0; i<D; ++i){
AB2 += (P2[i]-P1[i])*(P2[i]-P1[i]);
BC2 += (P3[i]-P2[i])*(P3[i]-P2[i]);
AC2 += (P3[i]-P1[i])*(P3[i]-P1[i]);
}
AB2 = sqrt(AB2);
BC2 = sqrt(BC2);
AC2 = sqrt(AC2);
for(ll i=0; i<D; ++i){
ans[i] = (BC2*P1[i]+AC2*P2[i]+AB2*P3[i])/(AB2+BC2+AC2);
}
return ans;
};