C#使用最小二乘法对多个离散点进行圆拟合
2024-09-03 15:54:31
/// <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 };
}
最新文章
- Agile
- 【转】常见的python机器学习工具包比较
- java中的BigDecimal和String的相互转换
- 利用pl/sql developer进行远程连接oracle server出现的问题及解决办法
- ExtJs布局之Column
- c++算术运算时数据类型提升带来的问题
- 【转】MyBatis中Like语句使用方式
- 模仿jquery的一些实现
- Centos根据系统VPS安装SendMail组件使WordPress支持E-mail
- DFGUI-- 标签交换 Tabstrip
- 认识<;meta>;
- Git学习 -- 简介
- 剑指offer得意之作——顺时针打印矩阵
- 04、NetCore2.0下Web应用之Startup源码解析
- iOS 数据归档----温故而知新
- ODPS-Java-SDK快速入门
- leetcode149
- An Objective-C Error
- 下载 ....aar jitpack.io 打不开。
- spineRuntTime for cocos2dx v3,attack播完后回到idle