当前位置: 首页 > news >正文

用C#最小二乘法拟合圆形,计算圆心和半径

用C#最小二乘法拟合圆形,计算圆心和半径

using System;
using System.Collections.Generic;namespace ConsoleApp2
{internal class Program{static void Main(string[] args){List<Tuple<double, double>> points = new List<Tuple<double, double>>();points.Add(Tuple.Create(0.0, 1.0));points.Add(Tuple.Create(1.0, 0.0));points.Add(Tuple.Create(2.0, 1.0));points.Add(Tuple.Create(1.0, 2.0));Operator2D.FitCircle(points,out double centerX,out double centerY, out double radius);}}}class Operator2D
{public static void FitCircle(List<Tuple<double, double>> points, out double centerX, out double centerY, out double radius){double[,] ATA = new double[3, 3];double[] ATB = new double[3];foreach (var pt in points){double x = pt.Item1, y = pt.Item2;double twoX = 2 * x, twoY = 2 * y;double B_i = x * x + y * y;// 构建ATA矩阵ATA[0, 0] += twoX * twoX;ATA[0, 1] += twoX * twoY;ATA[0, 2] += twoX;ATA[1, 0] += twoY * twoX;ATA[1, 1] += twoY * twoY;ATA[1, 2] += twoY;ATA[2, 0] += twoX;ATA[2, 1] += twoY;ATA[2, 2] += 1;// 构建ATB向量ATB[0] += twoX * B_i;ATB[1] += twoY * B_i;ATB[2] += B_i;}// 计算逆矩阵double[,] invATA = Invert3x3Matrix(ATA);// 求解参数double a = invATA[0, 0] * ATB[0] + invATA[0, 1] * ATB[1] + invATA[0, 2] * ATB[2];double b = invATA[1, 0] * ATB[0] + invATA[1, 1] * ATB[1] + invATA[1, 2] * ATB[2];double c = invATA[2, 0] * ATB[0] + invATA[2, 1] * ATB[1] + invATA[2, 2] * ATB[2];// 计算半径double rSquared = a * a + b * b + c;if (rSquared < 0) throw new ArgumentException("无法拟合有效圆形");radius = Math.Sqrt(rSquared);centerX = a;centerY = b;}// 3x3矩阵求逆static double[,] Invert3x3Matrix(double[,] matrix){double a = matrix[0, 0], b = matrix[0, 1], c = matrix[0, 2];double d = matrix[1, 0], e = matrix[1, 1], f = matrix[1, 2];double g = matrix[2, 0], h = matrix[2, 1], i = matrix[2, 2];double det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);if (Math.Abs(det) < 1e-12) throw new ArgumentException("矩阵不可逆");double invDet = 1.0 / det;return new double[,]{{ (e * i - f * h) * invDet, (c * h - b * i) * invDet, (b * f - c * e) * invDet },{ (f * g - d * i) * invDet, (a * i - c * g) * invDet, (c * d - a * f) * invDet },{ (d * h - e * g) * invDet, (b * g - a * h) * invDet, (a * e - b * d) * invDet }};}
}

在这里插入图片描述

http://www.xdnf.cn/news/675271.html

相关文章:

  • chrome打不开axure设计的软件产品原型问题解决办法
  • 尚硅谷redis7 41-46 redis持久化之AOF异常恢复演示
  • 从零开始理解机器学习:知识体系 + 核心术语详解
  • 从中控屏看HMI设计的安全与美学博弈
  • FileZillaServer(1) -- 记录
  • Git 克隆别人的远程仓库以后,推到自己的远程仓库
  • BSRN地表基准辐射网数据批量下载
  • SQL基础教程:第一章与第二章内容总结(新手入门指南)
  • 文档注释:删还是不删
  • 关于 smali:3. Smali 与 APK 结构理解
  • LWIP 中,lwip_shutdown 和 lwip_close 区别
  • 深入剖析Java CompletableFuture:原理、陷阱与高并发场景优化指南
  • R语言基础| 可视化初探(ggplot2)
  • 预测式外呼与自动外呼的区别
  • 【博客系统】博客系统第十弹:实现对数据库存储的用户密码进行加密功能、更新登录接口的密码校验功能
  • 【监控】pushgateway中间服务组件
  • openresty+lua+redis把非正常访问的域名加入黑名单
  • threejs顶点UV坐标、纹理贴图
  • SQL Server 和 MySQL 对比
  • 实现单例模式的6种方法(Python)
  • 开源多模态新标杆——BAGEL本地部署教程:7B参数撬动万亿数据
  • 《算法和数据结构》算法篇
  • 车载通信网络 --- OSI模型:网络层
  • SQL 查询慢的常见原因分析
  • 【新品发布】嵌入式人工智能实验箱EDU-AIoT ELF 2正式发布
  • 机器学习-决策树
  • 洛谷 P5091:【模板】扩展欧拉定理
  • MacOS内存管理-删除冗余系统数据System Data
  • 第六章 文件的其他操作命令
  • 计算机组成原理——CISC与RISC