三角形の外接円を求めるコード

本物のページはこちら→circumcircle

外心

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

(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++版....外接円デモアプリ…マウスをクリックすると三角形の形状が変わり、それに応じて外接円が変わる。

CCircle  CTriangle::CalcCircumCircle()//外接円の計算
{
    //外心の計算
    CalcAngleFrom3Edge();
    double A = sin(2.0*angleA);
    double B = sin(2.0*angleB);
    double C = sin(2.0*angleC);
    CVertex v;
    v.SetVertex( (a.x * A + b.x * B + c.x * C) / (A+B+C),(a.y * A + b.y * B + c.y * C) / (A+B+C));
//半径の計算    
    double rad=edgeBC / sin(angleA) / 2.0 ;
    this->circumCircle.SetCircle(&v,rad);
    return circumCircle;
 
}
 
void  CTriangle::CalcAngleFrom3Edge(){
    GetArea();
    switch(CalcLongestEdge()){
        case A:
            ha=2*area/edgeBC;
            angleB=asin(ha/edgeAB);
            angleC=asin(ha/edgeCA);
            angleA=M_PI-angleB-angleC;
            break;
        case B:
            hb=2*area/edgeCA;
            angleA=asin(hb/edgeAB);
            angleC=asin(hb/edgeBC);
            angleB=M_PI-angleC-angleA;
            break;
        case C:
            hc=2*area/edgeAB;
            angleB=asin(hc/edgeBC);
            angleA=asin(hc/edgeCA);
            angleC=M_PI-angleA-angleB;
            break;
    }
 
}
double CTriangle::GetArea(){//3辺の長さから角度を求める
    edgeAB=a.CalcLength(&b);
    edgeBC=b.CalcLength(&c);
    edgeCA=c.CalcLength(&a);
 
    double s=(edgeAB+edgeBC+edgeCA)/2.0;
    area=sqrt(s*(s-edgeAB)*(s-edgeBC)*(s-edgeCA));
    return area;
}

サポートサイト Wikidot.com