C#使用最小二乘法对多个离散点进行圆拟合

2023-02-14,,,,

        /// <summary>
/// 最小二乘法拟合圆,计算拟合圆半径和拟合圆圆心
/// </summary>
/// <param name="points">拟合点</param>
/// <returns>返回拟合圆的计算结果</returns>
public double[] FittingCircleByLeastSquare(List<Point> points)
{
//最小二乘法拟合圆
///https://blog.csdn.net/qq_31253399/article/details/107306569
double U_i = 0, V_i = 0, U_c = 0, V_c = 0;
double X = points.Average(p => p.X), Y = points.Average(p => p.Y);
double S_uuu = 0, S_vvv = 0, S_uvv = 0, S_uuv = 0;
double S_uu = 0, S_vv = 0, S_uv = 0;
for (int i = 0; i < points.Count; i++)
{
U_i = points[i].X - X;
V_i = points[i].Y - Y;
S_uuu += Math.Pow(U_i, 3);
S_uuv += Math.Pow(U_i, 2) * V_i;
S_uuu += Math.Pow(U_i, 3);
S_uvv += Math.Pow(V_i, 2) * U_i;
S_uu += Math.Pow(U_i, 2);
S_vv += Math.Pow(V_i, 2);
S_uv += U_i * V_i;
}
U_c = (S_uuv * S_uv - S_uuu * S_vv - S_uvv * S_vv + S_uv * S_vvv) / 2 * (S_uv * S_uv - S_uu * S_vv);
V_c = (S_uuu * S_uv - S_uuv * S_uu - S_uu * S_vvv + S_uv * S_uvv) / 2 * (S_uv * S_uv - S_uu * S_vv);
//计算拟合圆圆心坐标
double X_c = U_c + X;
double Y_c = V_c + Y;
//计算R
double R = points.Sum(p => ((p.X - X_c) * (p.X - X_c) + (p.Y - X_c) * (p.Y - Y_c)));
return new double[3] { X_c, Y_c, R };
}

C#使用最小二乘法对多个离散点进行圆拟合的相关教程结束。

《C#使用最小二乘法对多个离散点进行圆拟合.doc》

下载本文的Word格式文档,以方便收藏与打印。