由三点确定一个圆(圆心,半径)

整理日: 2015年2月16日

代码例


// 点结构体定义
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);
}

posted @ 2015-02-16 23:11  wanglinqiang  阅读(1225)  评论(0编辑  收藏  举报