/// <summary>
/// 两点弧度逆时针圆心
/// </summary>
/// <param name="P1">点1</param>
/// <param name="P2">点2</param>
/// <param name="theta">弧度</param>
/// <returns></returns>
private static PointF GetCentre(PointF P1, PointF P2, double theta)
{
double t = Math.PI * theta / 180.0;
double sinT = Math.Sin(t);
double cosT = Math.Cos(t);
double temp = 0.5 / (1.0 - cosT);
double cx = (P1.X + P2.X) * 0.5 + sinT * (P1.Y - P2.Y) * temp;
double cy = (P1.Y + P2.Y) * 0.5 + sinT * (P2.X - P1.X) * temp;
return new PointF((float)cx, (float)cy);
}
/// <summary>
/// 二维:已知圆上三点,求圆心坐标
/// </summary>
/// <param name="P1">点1</param>
/// <param name="P2">点2</param>
/// <param name="P3">点3</param>
/// <returns></returns>
public static 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);
}