用C++实现最小二乘法,最小区域法,最小包容圆拟合圆的算法和在Qt中的运行结果

2023-11-03 05:38

本文主要是介绍用C++实现最小二乘法,最小区域法,最小包容圆拟合圆的算法和在Qt中的运行结果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用C++实现最小二乘法,最小区域法,最小包容圆拟合圆的算法和在Qt中的运行结果

我们工科生经常要处理数据,大家在处理数据的过程中遇到圆拟合的问题,一般会用到最小包容圆,最小外接圆,最小二乘拟合圆,最小区域法(遗传算法,粒子群算法),这里为了方便大家参考,提供C++实现最小二乘法,最小包容圆法,最小区域法(粒子群算法)的算法。话不多说,先上在Qt中的运行结果:

如图红色的点是随机生成的,图一中随机点在以原点为圆心,半径为10的圆内随机生成。其余两个图中点的范围在以原点为圆心,半径为9.5和10.5的同心圆范围内。黑色的线为拟合的圆。可以看到最小区域法的拟合比较精确。

下面附上三个算法代码的源文件和头文件(Qt中的代码,和C++稍微有一点不同,主要是为了可视化。大家可以根据需要自行修改。)

#ifndef LEASTSQUAREMETHODFITTINGCIRCLE_H
#define LEASTSQUAREMETHODFITTINGCIRCLE_H#include <QList>typedef struct pointInfo
{double x;double y;double radius;
}pointInfo;pointInfo LSFit(QList<pointInfo> &Point);   //最小二乘圆拟合函数#endif // LEASTSQUAREMETHODFITTINGCIRCLE_H
#include "leastsquaremethodfittingcircle.h"/* 最小二乘法圆拟合函数 */
pointInfo LSFit(QList<pointInfo> &Point)
{pointInfo tempPoint;        //定义临时变量,存储最小二乘圆心坐标double X1=0,Y1=0,X2=0,Y2=0,X3=0,Y3=0;double X1Y1=0,X1Y2=0,X2Y1=0;int N=Point.size();for(int i=0;i<Point.size();i++){double x=Point.at(i).x;double y=Point.at(i).y;double x2=x*x,y2=y*y;X1+=x;Y1+=y;X2+=x2;Y2+=y2;X3+=x*x2;Y3+=y*y2;X1Y1+=x*y;X1Y2+=x*y2;X2Y1+=x2*y;}double a=0,b=0,c=0;double C1=0,D1=0,E1=0,G1=0,H1=0;C1=N*X2-X1*X1;D1=N*X1Y1-X1*Y1;E1=N*X3+N*X1Y2-(X2+Y2)*X1;G1=N*Y2-Y1*Y1;H1=N*X2Y1+N*Y3-(X2+Y2)*Y1;a=(H1*D1-E1*G1)/(</

这篇关于用C++实现最小二乘法,最小区域法,最小包容圆拟合圆的算法和在Qt中的运行结果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335960

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�