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++)
            {
   
                //circle
                x[i] = x0 + Math.Cos(i * step) * r0;
                y[i] = y0 + Math.Sin(i * step) * r0;
                //noise
                x[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++)
            {
   
                //matrix
                a[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=C
            var 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;
        }
}

相关推荐

  1. c# MathNet.Numerics 使用案例

    2024-01-24 14:06:05       34 阅读
  2. 点云方法:三点定

    2024-01-24 14:06:05       38 阅读
  3. 【C++PCL】点云处理最小三维

    2024-01-24 14:06:05       40 阅读
  4. PCL 点云二维(迭代法)

    2024-01-24 14:06:05       4 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-24 14:06:05       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-24 14:06:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-24 14:06:05       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-24 14:06:05       20 阅读

热门阅读

  1. c语言中的sscanf函数

    2024-01-24 14:06:05       32 阅读
  2. SpringBoot如何测试打包部署

    2024-01-24 14:06:05       22 阅读
  3. 蒙特卡洛方法概述

    2024-01-24 14:06:05       35 阅读
  4. Golang中int, int8, int16, int32, int64和uint区别

    2024-01-24 14:06:05       29 阅读
  5. 02_正则表达式的应用

    2024-01-24 14:06:05       35 阅读
  6. Flowable使用docker中MySQL8,Springboot启动出错

    2024-01-24 14:06:05       35 阅读
  7. el-select选项过多导致页面卡顿,路由跳转卡顿

    2024-01-24 14:06:05       32 阅读
  8. 机器的世界模型与人类的世界模型

    2024-01-24 14:06:05       30 阅读
  9. 【Spring Boot 3】【JPA】枚举类型持久化

    2024-01-24 14:06:05       35 阅读
  10. ES6笔记-symbol

    2024-01-24 14:06:05       31 阅读
  11. 最小生成树 prim + kruskal

    2024-01-24 14:06:05       28 阅读