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

c# MathNet.Numerics 圆拟合使用案例

下载地址

https://www.nuget.org/packages/MathNet.Numerics/4.15.0#supportedframeworks-body-tab

原理

从标准圆方程(x-c1)2+(y-c2)2=r2中进行方程变换得到2xc1+2yc2+(r2−c12−c22)=x2+y2,其中,我们c3替换常量值r2−c12−c22,即:r2−c12−c22=c3。由此,我们得到2xc1+2yc2+c3=x2+y2,将点集带入,方程就只剩三个未知数`c1,c2 和 c3。

案例

using MathNet.Numerics;
using MathNet.Numerics.LinearAlgebra.Double;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace MathNetTest
{class Program{static void Main(string[] args){FitCircle();}private static void FitCircle(){var count = 5000;var step = 2 * Math.PI / 100;var rd = new Random();//参照圆var x0 = 204.1;var y0 = 213.1;var r0 = 98.4;//噪音绝对差var diff = (int)(r0 * 0.1);var x = new double[count];var y = new double[count];//输出点集for (int i = 0; i < count; i++){//circlex[i] = x0 + Math.Cos(i * step) * r0;y[i] = y0 + Math.Sin(i * step) * r0;//noisex[i] += Math.Cos(rd.Next() % 2 * Math.PI) * rd.Next(diff);y[i] += Math.Cos(rd.Next() % 2 * Math.PI) * rd.Next(diff);}var d = LinearAlgebraFit(x, y);}public static Tuple<double,double,double> LinearAlgebraFit(double[] X, double[] Y){if (X.Length < 3){return null;}var count = X.Length;var a = new double[count, 3];var c = new double[count, 1];for (int i = 0; i < count; i++){//matrixa[i, 0] = 2 * X[i];a[i, 1] = 2 * Y[i];a[i, 2] = 1;c[i, 0] = X[i] * X[i] + Y[i] * Y[i];}var A = DenseMatrix.OfArray(a);var C = DenseMatrix.OfArray(c);//A*B=Cvar B = A.Solve(C);double c1 = B.At(0, 0),c2 = B.At(1, 0),r = Math.Sqrt(B.At(2, 0) + c1 * c1 + c2 * c2);Tuple<double, double, double> XYR = new Tuple<double, double, double>(c1, c2, r);return XYR;}
}

相关文章:

  • 08章【文件与IO】
  • CMS如何调优
  • 如何在Docker下部署MinIO存储服务通过Buckets实现文件的远程上传
  • keil5 查看stm32 寄存器的值
  • MySQL对数据库的操作
  • 软件是什么?前端,后端,数据库
  • http503错误是什么原因
  • Redis(五)
  • 初识k8s(概述、原理、安装)
  • 微服务不死 — 共享变量在策略引擎项目的落地详解
  • cookie in selenium 定时更新token
  • 单调栈笔记
  • 告别无法访问的Github
  • 第九篇 华为云Iot SDK的简单应用
  • 【GitHub项目推荐--12 年历史的 PDF 工具开源了】【转载】
  • “大数据应用场景”之隔壁老王(连载四)
  • angular学习第一篇-----环境搭建
  • Bootstrap JS插件Alert源码分析
  • C++入门教程(10):for 语句
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Java反射-动态类加载和重新加载
  • js面向对象
  • LeetCode18.四数之和 JavaScript
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 电商搜索引擎的架构设计和性能优化
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 算法-图和图算法
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • Linux权限管理(week1_day5)--技术流ken
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #pragma once与条件编译
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (windows2012共享文件夹和防火墙设置
  • (九)One-Wire总线-DS18B20
  • (强烈推荐)移动端音视频从零到上手(下)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)http-server应用
  • (转)母版页和相对路径
  • .NET 反射的使用
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET企业级应用架构设计系列之技术选型
  • @Transactional 详解
  • [.net] 如何在mail的加入正文显示图片
  • [1127]图形打印 sdutOJ
  • [ActionScript][AS3]小小笔记
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [codevs] 1029 遍历问题
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)