当前位置: 首页 > 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 }};}
}

在这里插入图片描述

相关文章:

  • LabVIEW教学用开发平台
  • 深入理解设计模式之命令模式
  • 【Web应用】基础篇04-功能详解-权限控制(创建菜单--分配角色--创建用户)
  • maven 最短路径依赖优先
  • c#基础08(数组)
  • 第十章:构建之巅 · 打包与部署的终极试炼
  • 实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.1 R语言解题
  • Docker常用操作
  • 下一代 SaaS 平台的 AI 架构重构路径——多租户 AI 服务调度 · 多角色智能辅助 · 嵌入式 AIGC 能力的融合设计
  • 欧几里得 ---> 裴蜀定理 ---> 拓展欧几里得
  • OpenCV CUDA模块图像处理------颜色空间处理之拜耳模式去马赛克函数demosaicing()
  • HarmonyOS NEXT~鸿蒙系统运维:全面解析与最佳实践
  • el-tree拖拽事件,限制同级拖拽,获取拖拽后节点的前后节点,同级拖拽合并父节点name且子节点加入目标节点里
  • 【华为云物联网】如何实现在 MQTT.fx 上模拟数据间隔上传一次,并按设定系数变动数据
  • 打造AI智能旅行规划器:基于LLM和Crew AI的Agent实践
  • python和java差异:关键数据类型与容器
  • PaddleNLP 的文本分类项目
  • Cmake4编译PaddleOCR3.0成功步骤
  • 分块查找详解
  • yolo最终笔记
  • 东莞网站系统找哪里/seo云优化软件
  • 用什么网站可以做/企业软文营销发布平台
  • 闸北区网站设计与制/seo公司软件
  • 全国有名的网站建设公司/网站优化seo培训
  • 做网站ceo/seo项目培训
  • 用cms建网站容易吗/北京百度seo点击器