三点画圆的有关问题
三点画圆的问题
求指导 知道三点怎么求圆心 具体算法 谢谢
------解决方案--------------------
以前写过的一段代码,试试
//三点是否在同一直线上
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 ¢re, 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;
}
------解决方案--------------------
是外接圆吧?先求外心,然后外心和其中一个顶点的距离就是半径了
求指导 知道三点怎么求圆心 具体算法 谢谢
------解决方案--------------------
以前写过的一段代码,试试
//三点是否在同一直线上
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 ¢re, 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); }