三角形の外接円

circumcircle.png

外心

三角形の外接円の中心です

(1)
\begin{align} \frac{\sin 2 A a+ \sin 2B b + \sin 2C c}{\sin2A+\sin2B+\sin2C} \end{align}

重心座標で外心座標は

(2)
\begin{align} \sin2A : \sin2B : \sin2C \end{align}

外接円計算デモ


    /*三角形の外接円を計算する*/
    circle calcCircumCircle(const tri& t) {
        //各辺の長さを求める
        float ab = glm::distance(t.a,t.b);
        float bc = glm::distance(t.b,t.c);
        float ca = glm::distance(t.c,t.a);
 
        //三角形の面積を求める
        float s = (ab + bc + ca) / 2.0;
        float area = sqrt(s*(s - ab)*(s - bc)*(s - ca));
 
        //三角形の辺の中で一番長い辺を求める
        float maxlength = 0;
        char longestEdge = 'A';
        if (maxlength<ab) { maxlength = ab; longestEdge = 'C'; }
        if (maxlength<bc) { maxlength = bc; longestEdge = 'A'; }
        if (maxlength<ca) { maxlength = ca; longestEdge = 'B'; }
 
        float angleA, angleB, angleC;
        //三角形の面積の公式 1/2absinθを使って,三角形の角度を求める
        switch (longestEdge) {
        case 'A':
        {
            float sinA = 2 * area / bc;
            angleB = asin(sinA / ab);
            angleC = asin(sinA / ca);
            angleA = M_PI - angleB - angleC;
        }
            break;
        case 'B':
        {
            float sinB = 2 * area / ca;
            angleA = asin(sinB / ab);
            angleC = asin(sinB / bc);
            angleB = M_PI - angleC - angleA;
        }
            break;
        case 'C':
        {
            float sinC = 2 * area / ab;
            angleB = asin(sinC / bc);
            angleA = asin(sinC / ca);
            angleC = M_PI - angleA - angleB;
        }
            break;
        default:
            assert(!"異常 外接円");
            break;
        }
        //外心を求めます
        float sin2A = sin(2.0*angleA);
        float sin2B = sin(2.0*angleB);
        float sin2C = sin(2.0*angleC);
        float center_x = (t.a.x * sin2A + t.b.x * sin2B + t.c.x * sin2C) / (sin2A + sin2B + sin2C);
        float center_y = (t.a.y * sin2A + t.b.y * sin2B + t.c.y * sin2C) / (sin2A + sin2B + sin2C);
        glm::vec3 v(center_x,center_y,0);
        //半径の計算(正弦定理より)
        float radius = bc / sin(angleA) / 2.0;
        return circle(v, radius );
 
    }

ソースコードgithub

.c++版....外接円デモアプリ…マウスをクリックすると三角形の形状が変わり、それに応じて外接円が変わる。


circle delaunaytriangulation triangle

サポートサイト Wikidot.com circledelaunaytriangulationtriangle