circlefitting.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "circlefitting.h"
  2. CircleFitting::CircleFitting(QList<Data*>idataset)
  3. {
  4. this->PrimiDataSet.clear();
  5. this->resultList.clear();
  6. this->Xc = 0.00;
  7. this->Yc = 0.00;
  8. this->R = 0.00;
  9. for(int i=0;i<idataset.size();i++)
  10. this->PrimiDataSet<<idataset[i];
  11. this->fittingData();
  12. }
  13. CircleFitting::~CircleFitting(void)
  14. {
  15. }
  16. void CircleFitting::fittingData()
  17. {
  18. ////原始数据量
  19. int N = this->PrimiDataSet.size();
  20. ////定义用于拟合的参数
  21. double D,C,E,G,H;
  22. ////原始数据X点总和
  23. double sum_X_Raw = 0.00;
  24. ////原始数据Z点总和
  25. double sum_Z_Raw = 0.00;
  26. ////原始数据X的平方和
  27. double sum_XSquare_Raw = 0.00;
  28. ////原始数据Z的平方和
  29. double sum_ZSquare_Raw = 0.00;
  30. ////原始数据X的立方和
  31. double sum_XCube_Raw = 0.00;
  32. ////原始数据Z的立方和
  33. double sum_ZCube_Raw = 0.00;
  34. ////原始数据xzz和
  35. double sum_XZZ_Raw = 0.00;
  36. ////原始数据xz和
  37. double sum_XZ_Raw = 0.00;
  38. ////原始数据xxz和
  39. double sum_XXZ_Raw = 0.00;
  40. for(int i = 0;i < this->PrimiDataSet.size();i++)
  41. {
  42. sum_X_Raw += PrimiDataSet[i]->x;
  43. sum_Z_Raw += PrimiDataSet[i]->y;
  44. sum_XSquare_Raw += PrimiDataSet[i]->x*PrimiDataSet[i]->x;
  45. sum_ZSquare_Raw += PrimiDataSet[i]->y*PrimiDataSet[i]->y;
  46. sum_XCube_Raw += PrimiDataSet[i]->x*PrimiDataSet[i]->x*PrimiDataSet[i]->x;
  47. sum_ZCube_Raw += PrimiDataSet[i]->y*PrimiDataSet[i]->y*PrimiDataSet[i]->y;
  48. sum_XZ_Raw += PrimiDataSet[i]->x*PrimiDataSet[i]->y;
  49. sum_XZZ_Raw += PrimiDataSet[i]->x*PrimiDataSet[i]->y*PrimiDataSet[i]->y;
  50. sum_XXZ_Raw += PrimiDataSet[i]->x*PrimiDataSet[i]->x*PrimiDataSet[i]->y;
  51. }
  52. D = N*sum_XZ_Raw - sum_X_Raw*sum_Z_Raw;
  53. C = N*sum_XSquare_Raw-sum_X_Raw*sum_X_Raw;
  54. E = N*sum_XCube_Raw+N*sum_XZZ_Raw-(sum_XSquare_Raw+sum_ZSquare_Raw)*sum_X_Raw;
  55. G = N*sum_ZSquare_Raw-sum_Z_Raw*sum_Z_Raw;
  56. H = N*sum_ZCube_Raw+N*sum_XXZ_Raw-(sum_XSquare_Raw+sum_ZSquare_Raw)*sum_Z_Raw;
  57. double a = (H*D-E*G)/(C*G-D*D);
  58. double b = (H*C-E*D)/(D*D-G*C);
  59. double c = -((sum_XSquare_Raw+sum_ZSquare_Raw)+a*sum_X_Raw+b*sum_Z_Raw)/N;
  60. double A = -0.5*1.00000*a;
  61. double B = -0.5*1.00000*b;
  62. double R = 0.5*1.00000*sqrt(a*a+b*b-4*c);
  63. this->resultList<<A<<B<<R;
  64. //qDebug()<<"CircleFitting: ("<<A<<","<<B<<") R="<<R;
  65. }
  66. QList<double> CircleFitting::getResultList()
  67. {
  68. return this->resultList;
  69. }