下面给出由三角计算圆心坐标的代码
思路:根据任意两点的垂直平分线角方程,考虑斜率不存在的情况。
/************************************************************************/
/*由三点计算圆心坐标 */
/************************************************************************/
bool CntCalBy3Pts(const double x1, const double y1,
const double x2, const double y2,
const double x3, const double y3,
double& cnt_x, double& cnt_y)
{
//step1:计算中点坐标
double mid_x12 = (x1 + x2)/2;
double mid_y12 = (y1 + y2)/2;
double mid_x23 = (x2 + x3)/2;
double mid_y23 = (x2 + x3)/2;
//step2:计算垂直平方线斜率
double k1 = 0, k2 = 0;
//case1:pt1,pt2组成线段斜率不存在
if (!(y1 - y2))
{
cnt_x = mid_x12;
k2 = -((x2 - x3)/(y2 - y3));
cnt_y = k2 * mid_x12 + mid_y23 - k2 * mid_x23;
return true;
}
//case2:pt2,pt3组成的线段斜率不存在
else if (!(y2 - y3))
{
cnt_x = mid_x23;
k1 = -((x1 - x2)/(y1 - y2));
cnt_y = k1 * mid_x23 + mid_y12 - k1 * mid_x12;
return true;
}
//case3:两条线段斜率均存在
else
{
k1 = -((x1 - x2)/(y1 - y2));
k2 = -((x2 - x3)/(y2 - y3));
if (k1 == k2)
{
return false;
}
double b1 = mid_y12 - k1 * mid_x12;
double b2 = mid_y23 - k2 * mid_x23;
cnt_x = (b2 - b1)/(k1 - k2);
cnt_y = k1 * cnt_x + b1;
return true;
}
}