旋转标定的数学公式 一 旋转中心标定 public class CircleFitter { /// <summary> /// 通过三个点计算圆心坐标 /// </summary> /// <param name="point1">第一个点 (x1, y1)</param> /// <param name="point2">第二个点 (x2, y2)</param> /// <param name="point3">第三个点 (x3, y3)</param> /// <returns>圆心坐标 (cx, cy)</returns> public static ( double cx, double cy) FitCircleFromThreePoints ( ( double x, double y) point1, ( double x, double y) point2, ( double x, double y) point3) { // 解法基于三点确定一个圆的几何原理 // 设圆心为 (cx, cy),则有: // (x1-cx)² + (y1-cy)² = (x2-cx)² + (y2-cy)² = (x3-cx)² + (y3-cy)² = r² double x1= point1. x, y1= point1. y; double x2= point2. x, y2= point2. y; double x3= point3. x, y3= point3. y; // 计算中间变量 double A= x2- x1; double B= y2- y1; double C= x3- x1; double D= y3- y1; double E= A* ( x1+ x2) + B* ( y1+ y2) ; double F= C* ( x1+ x3) + D* ( y1+ y3) ; double G= 2 * ( A* ( y3- y1) - B* ( x3- x1) ) ; // 避免除以零(三点共线的情况) if ( Math. Abs ( G) < 1e-10 ) { throw new ArgumentException ( "三点共线,无法确定唯一的圆" ) ; } // 计算圆心坐标 double cx= ( D* E- B* F) / G; double cy= ( A* F- C* E) / G; return ( cx, cy) ; } /// <summary> /// 计算圆的半径 /// </summary> public static double CalculateRadius ( ( double x, double y) center, ( double x, double y) point) { double dx= point. x- center. x; double dy= point. y- center. y; return Math. Sqrt ( dx* dx+ dy* dy) ; } } 二 使用 public partial class Form1 : Form { public Form1 ( ) { InitializeComponent ( ) ; } private void button1_Click ( object sender, EventArgs e) { try { // 拟合圆的三个点坐标 var point1= ( x : 3332.24 , y : 1807.67 ) ; var point2= ( x : 3099.6 , y : 1922.86 ) ; var point3= ( x : 2838.07 , y : 2000.45 ) ; // 计算圆心 var center= CircleFitter. FitCircleFromThreePoints ( point1, point2, point3) ; MessageBox. Show ( $"圆心坐标: ( { center. cx : F4} , { center. cy : F4} )" ) ; // 计算半径(使用第一个点) double radius= CircleFitter. CalculateRadius ( center, point1) ; MessageBox. Show ( $"圆的半径: { radius : F4} " ) ; } catch ( ArgumentException ex) { Console. WriteLine ( $"错误: { ex. Message } " ) ; } } }