/// <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); }