由三點肯定一個圓(圓心,半徑)

整理日: 2015年2月16日ui

代碼例code

// 點結構體定義
typedef struct CEcPoint{
    double x;
    double y;
};

// 圓結體定義
typedef struct CEcCircle{
    double raduls; // 半徑
    CEcPoint centre; // 圓心
}

// 3個點的結構體定義
typedef struct CEcPoint3{
    CEcPoint p1;
    CEcPoint p2;
    CEcPoint p3;
};

void GetCircle(CEcCircle* pCircle, double Ax, double Ay,
    double Bx, double By, double Cx, double Cy)
{

    double mat1,mat2,mat3;
    mat1 =  ( (Bx*Bx + By*By) - (Ax*Ax + Ay*Ay) ) * (2 * (Cy-Ay) ) -
            ( (Cx*Cx + Cy*Cy) - (Ax*Ax + Ay*Ay) ) * (2 * (By-Ay) );

    mat2 =  ( 2 * (Bx-Ax) ) * ( ( Cx*Cx + Cy*Cy ) - ( Ax*Ax + Ay*Ay ) ) -
            ( 2 * (Cx-Ax) ) * ( ( Bx*Bx + By*By ) - ( Ax*Ax + Ay*Ay ) );

    mat3 = 4 * ( (Bx-Ax) * (Cy-Ay) - (Cx-Ax) * (By-Ay) );

    pCircle->centre.x = mat1/mat3;
    pCircle->centre.y = mat2/mat3;
    pCircle->raduis = sqrt ( (Ax-pCircle->centre.x) * (Ax-pCircle->centre.x) +
        (Ay-pCircle->centre.y) * (Ay-pCircle->centre.y) );

}

// pCircle: 圓, p3: 3個點 
void GetCircle(CEcCircle* pCircle, CEcPoint3* p3)
{
    return GetCircle(pCircle, p3->Ax, p3->Ay, p3->Bx, p3->By, p3->Cx, p3->Cy);
}
相關文章
相關標籤/搜索