最小二乘法拟合圆c++
时间: 2023-06-29 12:15:30 浏览: 103
最小二乘法 拟合 圆
4星 · 用户满意度95%
以下是使用最小二乘法拟合圆的 C++ 代码示例:
```c++
#include <iostream>
#include <vector>
#include <cmath>
#include <Eigen/Dense> // 需要Eigen库的支持
using namespace std;
using namespace Eigen;
struct Point{
double x;
double y;
};
/*
最小二乘法拟合圆
输入:点集points,点数n
输出:拟合的圆心坐标(a,b)和半径r
*/
void fitCircle(const vector<Point>& points, int n, double& a, double& b, double& r){
MatrixXd A(n,3);
VectorXd B(n);
for(int i=0; i<n; ++i){
A(i,0) = 2*points[i].x;
A(i,1) = 2*points[i].y;
A(i,2) = -1;
B(i) = points[i].x*points[i].x + points[i].y*points[i].y;
}
Vector3d x = A.colPivHouseholderQr().solve(B); // 使用QR分解求解线性方程组
a = x(0);
b = x(1);
r = sqrt(a*a + b*b - x(2));
}
int main(){
vector<Point> points = {{0,0}, {1,1}, {2,0}, {0,2}, {2,2}};
int n = points.size();
double a, b, r;
fitCircle(points, n, a, b, r);
cout << "Center: (" << a << ", " << b << ")" << endl;
cout << "Radius: " << r << endl;
return 0;
}
```
其中使用了Eigen库来进行矩阵运算。对于输入的点集,可以使用结构体或者其他方式来表示。在主函数中,可以将要拟合的点集传入fitCircle函数中,然后得到拟合的圆心坐标和半径。
阅读全文