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

最新文章

  1. Agile
  2. 【转】常见的python机器学习工具包比较
  3. java中的BigDecimal和String的相互转换
  4. 利用pl/sql developer进行远程连接oracle server出现的问题及解决办法
  5. ExtJs布局之Column
  6. c++算术运算时数据类型提升带来的问题
  7. 【转】MyBatis中Like语句使用方式
  8. 模仿jquery的一些实现
  9. Centos根据系统VPS安装SendMail组件使WordPress支持E-mail
  10. DFGUI-- 标签交换 Tabstrip
  11. 认识&lt;meta&gt;
  12. Git学习 -- 简介
  13. 剑指offer得意之作——顺时针打印矩阵
  14. 04、NetCore2.0下Web应用之Startup源码解析
  15. iOS 数据归档----温故而知新
  16. ODPS-Java-SDK快速入门
  17. leetcode149
  18. An Objective-C Error
  19. 下载 ....aar jitpack.io 打不开。
  20. spineRuntTime for cocos2dx v3,attack播完后回到idle

热门文章

  1. 阿色全息脑图,及制作软件AHMM
  2. Windows 2012 R2上搭建IIS管理用户的隔离模式FTP
  3. Java中的Optional
  4. (一)JPA的快速入门
  5. Containerd教程
  6. Elasticsearch:同步 MongoDB 数据到 Elasticsearch
  7. 定制开发 ERP 的优势有哪些?
  8. MatrixOne从入门到实践08——SSB性能测试
  9. 没有使用IaC的DevOps系统都是耍流氓
  10. PHP Phar反序列化学习