3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

任意次元空間における三角形の内心の簡単な求め方

Posted at

目的

外心を求めた前回の記事に引き続き,怒りに任せて任意次元空間における三角形の内心の簡単な求め方と実装を書きます.

方針

三角形の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;
    };
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?