Слияние кода завершено, страница обновится автоматически
#ifndef CIRCLEFITSOLVER_H
#define CIRCLEFITSOLVER_H
#include <complex>
#include <vector>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_multimin.h>
using namespace std;
typedef complex<int> POINT;
bool circleLeastFit(const std::vector<POINT> &points, double ¢er_x, double ¢er_y, double &radius);
class CircleFitSolver
{
public:
enum DIST_TYPE {DIST_L2, DIST_L1, DIST_L12, DIST_FAIR, DIST_WELSCH, DIST_SIMPLE};
CircleFitSolver();
~CircleFitSolver();
void setMaxIter(int iter) {m_max_iter = iter;}
/**
* @brief circleFitL1 拟合圆,拟合判据为数据点到拟合圆的距离绝对值之和最小。
* @param points 输入参数,存储各个数据点。
* @param center_x radius > 0 时作为迭代算法的初始值。计算完成后返回拟合圆的圆心 X 坐标
* @param center_y radius > 0 时作为迭代算法的初始值。计算完成后返回拟合圆的圆心 Y 坐标
* @param radius radius < 0 时,用最小二乘拟合的结果作为迭代算法的初始值。计算完成后返回拟合圆的半径。
* @return true 表示拟合成功,否则拟合失败。
*/
bool circleFitL1(const vector<POINT> &points, double ¢er_x, double ¢er_y, double &radius);
bool Fit(const vector<POINT> &points, double ¢er_x, double ¢er_y, double &radius, DIST_TYPE type = DIST_L1);
private:
gsl_multimin_function m_function;
gsl_multimin_fminimizer * m_fminimizer;
int m_max_iter; // 迭代算法的最大迭代次数
gsl_vector *m_start_point; // 迭代算法的初始值
gsl_vector *m_step_size; // 迭代算法的初始步长
void setStartPoint(double center_x, double center_y, double radius);
static double L2_distance(const gsl_vector * v, void * params);
static double L1_distance(const gsl_vector * v, void * params);
static double L12_distance(const gsl_vector * v, void * params);
static double Fair_distance(const gsl_vector * v, void * params);
static double Welsch_distance(const gsl_vector * v, void * params);
};
#endif // CIRCLEFITSOLVER_H
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )