三点画圆的有关问题

三点画圆的问题
求指导 知道三点怎么求圆心 具体算法 谢谢

------解决方案--------------------
以前写过的一段代码,试试


//三点是否在同一直线上
BOOL IsPointInALine(CPoint point1, CPoint point2, CPoint point3)
{
if ((point1==point2) || (point1==point2) || (point1==point2))
return TRUE;

DOUBLE d1,d2,d3,Delta=0.01;
d1=sqrt((point1.x-point2.x)*(point1.x-point2.x)
+(point1.y-point2.y)*(point1.y-point2.y));
d2=sqrt((point3.x-point2.x)*(point3.x-point2.x)
+(point3.y-point2.y)*(point3.y-point2.y));
d3=sqrt((point1.x-point3.x)*(point1.x-point3.x)
+(point1.y-point3.y)*(point1.y-point3.y));

if ((fabs(d1+d2-d3)<Delta) || (fabs(d1+d3-d2)<Delta) || (fabs(d2+d3-d1)<Delta))//如果三点能构成三角形,则不在同一直线上。
return TRUE;

return FALSE;

}

//计算三点point1,point2,point3确定的圆心坐标centre和半径radius
BOOL FindCircle(CPoint point1, CPoint point2, CPoint point3, CPoint &centre, float &radius)
{
if (!IsPointInALine(point1,point2,point3))
{
double x1,x2,x3,y1,y2,y3;
double x,y;
double x_m1,y_m1,y_m2,x_m2;
double b1,k1,b2,k2;

x1 = point1.x;
x2 = point2.x;
x3 = point3.x;
y1 = point1.y;
y2 = point2.y;
y3 = point3.y;

if(point1.y == point2.y)
{
x1 = point1.x;
x2 = point3.x;
x3 = point2.x;
y1 = point1.y;
y2 = point3.y;
y3 = point2.y;
}
if (point1.y == point3.y)
{
x1 = point1.x;
x2 = point2.x;
x3 = point3.x;
y1 = point1.y;
y2 = point2.y;
y3 = point3.y;
}
if (point2.y == point3.y)
{
x1 = point2.x;
x2 = point1.x;
x3 = point3.x;
y1 = point2.y;
y2 = point1.y;
y3 = point3.y;
}


x_m1=(x1+x2)/2;
y_m1=(y1+y2)/2;

x_m2=(x2+x3)/2;
y_m2=(y2+y3)/2;

k1=-(x2-x1)/(y2-y1);
b1=y_m1-k1*x_m1;

k2=-(x3-x2)/(y3-y2);
b2=y_m2-k2*x_m2;

x=(b2-b1)/(k1-k2);
y=k1*x+b1;
  
radius = (float)(sqrt((point1.x-x)*(point1.x-x)+(point1.y-y)*(point1.y-y)));
centre.x = (int)(x+0.5);
centre.y = (int)(y+0.5);
return TRUE;
}
else
return FALSE;
}
------解决方案--------------------
是外接圆吧?先求外心,然后外心和其中一个顶点的距离就是半径了
C/C++ code


#define EPS 1e-10

bool inline _equal(const double &lhs,const double &rhs)            {    return fabs(lhs-rhs)< EPS;  }

// 点的定义
struct POINT{
    double x,y;
}point[MAX];

// 两直线的交点
POINT intersectPoint(const POINT &a,const POINT &b,const POINT &c,const POINT &d)
{
    POINT ans;
    if(_equal(a.y,b.y))
    {
        ans.y=a.y;
        double f=(d.x-c.x)/(d.y-c.y);
        ans.x=f*(ans.y-c.y)+c.x;
        return ans;
    }
    if (_equal(c.y,d.y))
    {
        ans.y=c.y;
        double e=(b.x-a.x)/(b.y-a.y);
        ans.x=e*(ans.y-a.y)+a.x;
        return ans;
    }
    double e=(b.x-a.x)/(b.y-a.y);
    double f=(d.x-c.x)/(d.y-c.y);
    ans.y = (e*a.y-a.x-f*c.y+c.x)/(e-f);
    ans.x = e*ans.y-e*a.y+a.x;
    return ans;
}

// 获取三角形外心算法 
POINT circumCenter(const POINT &pa,const POINT &pb, const POINT &pc)
{
    POINT a,b,c,d;
    a.x=(pa.x+pb.x)/2;    //根据k1=-1/k2获取ab的中垂线,其中k为斜率
    a.y=(pa.y+pb.y)/2;
    b.x=a.x-pa.y+pb.y;
    b.y=a.y+pa.x-pb.x;

    c.x=(pa.x+pc.x)/2;
    c.y=(pa.y+pc.y)/2;
    d.x=c.x-pa.y+pc.y;
    d.y=c.y+pa.x-pc.x;

    return intersectPoint(a,b,c,d);
}