已知圆心上的三点:,, ,求圆心:
把三点坐标圆的方程: 得:
把 展开整理得:
令
- ;
- ;
- , ,
- ,
求
求
把 移项整理得:
把 移项整理得:
还原代入式子:
整理结果
简化:
其中:
- 圆心坐标
- ,, 为不在同一直线上的坐标;
- ;
- ;
- , ,
- ,
C#中的运用
/// <summary>
/// <para>二维:已知圆上三点,求圆心坐标</para>
/// <para>三个点不在同一直线上</para>
/// </summary>
/// <param name="P1">点1</param>
/// <param name="P2">点2</param>
/// <param name="P3">点3</param>
/// <returns></returns>
public PointF GetCentre(PointF P1,PointF P2, PointF P3)
{
double a13 = P1.X - P3.X;
double a13_ = P1.X + P3.X;
double b13 = P1.Y - P3.Y;
double b13_ = P1.Y + P3.Y;
double a12 = P1.X - P2.X;
double a12_ = P1.X + P2.X;
double b12 = P1.Y - P2.Y;
double b12_ = P1.Y + P2.Y;
double a12b12_2 = a12 * a12_ + b12 * b12_;
double a13b13_2 = a13 * a13_ + b13 * b13_;
double a13b12 =2* a13 * b12;
double a12b13 =2* a12 * b13;
if (a12b13 - a13b12 == 0) return new PointF((P2.X+P1.X)/2, (P2.Y+P1.Y)/2);
double af = a12b13 - a13b12;
double bf = a13b12 - a12b13;
double az = b13 * a12b12_2 - b12 * a13b13_2;
double bz = a13 * a12b12_2 - a12 * a13b13_2;
double a = az / af;
double b = bz / bf;
return new PointF((float)a,(float)b);
}