Guest User

Untitled

a guest
Jan 21st, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. #include "BiasModel.h"
  2. #include <math.h>
  3.  
  4. BiasModel::BiasModel(int size, float distanceTolerance) {
  5. dSize = size;
  6. minPoints = size / 2;
  7. dTolerance = distanceTolerance * distanceTolerance;
  8. prevInsert = dPoints = level = 0;
  9. center = TNT::Vector<float>(3, 0.0);
  10. data = TNT::Array1D<TNT::Vector<float> >(size, TNT::Vector<float>(3, 0.0));
  11. coeff = TNT::Matrix<float>();
  12. _const = TNT::Vector<float>();
  13. }
  14.  
  15. bool BiasModel::addPoint(TNT::Vector<float> &coord) {
  16. if (dPoints < dSize) {
  17. prevInsert = dPoints ? (prevInsert + 1) % dSize : 0;
  18. data[prevInsert] = coord;
  19. dPoints++;
  20. } else {
  21. int i;
  22. for (i = 0; i < dSize; i++) {
  23. TNT::Vector<float> vtmp = data[i] - coord;
  24. float distSqr = vtmp * vtmp;
  25. if (distSqr < dTolerance) {
  26. cerr << "already have " << dSize << " points and distance " << sqrt(distSqr) << " is below threshold " << sqrt(dTolerance) << endl;
  27. return false;
  28. }
  29. }
  30. prevInsert = dPoints ? (prevInsert + 1) % dSize : 0;
  31. data[prevInsert] = coord;
  32. }
  33. return true;
  34. }
  35.  
  36. bool BiasModel::updateBias(float *input, float *output) {
  37. int i;
  38. TNT::Vector<float> coord = TNT::Vector<float>(3, input);
  39. coord -= center;
  40. if (addPoint(coord))
  41. minPoints--;
  42. if (!minPoints)
  43. minPoints = dSize / 2;
  44. else {
  45. output[0] = center[0]; output[1] = center[1]; output[2] = center[2];
  46. return false;
  47. }
  48. coeff.newsize(dPoints, 4);
  49. _const.newsize(dPoints);
  50. if (!level) {
  51. for (i = 0; i < dPoints; i++)
  52. center += data[i];
  53. for (i = 0; i < 3; i++)
  54. center[i] /= dPoints;
  55. level = 1;
  56. for (i = 0; i < dPoints; i++)
  57. data[i] -= center;
  58. }
  59. for (i = 0; i < dPoints; i++) {
  60. coeff[i][0] = 2 * data[i][0];
  61. coeff[i][1] = 2 * data[i][1];
  62. coeff[i][2] = 2 * data[i][2];
  63. coeff[i][3] = 1;
  64. _const[i] = data[i] * data[i];
  65. }
  66. TNT::Linear_Algebra::QR<float> decomp = TNT::Linear_Algebra::QR<float>(coeff);
  67. TNT::Vector<float> result = decomp.solve(_const);
  68. for (i = 0; i < 3; i++)
  69. result[3] += result[i] * result[i];
  70. result[3] = sqrt(result[3]);
  71. TNT::Vector<float> newOffset(3);
  72. newOffset[0] = result[0];
  73. newOffset[1] = result[1];
  74. newOffset[2] = result[2];
  75. for (i = 0; i < dPoints; i++) {
  76. data[i] -= newOffset;
  77. }
  78. center += newOffset;
  79. cout << "new estimate: <" << center[0] << "," << center[1] << "," << center[2] << "> radius " << result[3] << endl;
  80. output[0] = center[0]; output[1] = center[1]; output[2] = center[2];
  81.  
  82. }
  83.  
  84. int main(int argc, char *argv[]) {
  85. BiasModel bm = BiasModel(100, 0);
  86. float bias[3] = { 0.0, 0.0, 0.0 };
  87. while(!cin.eof()) {
  88. float tdata[3];
  89. cin >> tdata[0];
  90. cin >> tdata[1];
  91. cin >> tdata[2];
  92. cout << "read: " << tdata[0] << " " << tdata[1] << " " << tdata[2] << endl;
  93. bm.updateBias(tdata, bias);
  94. int i;
  95. for (i = 0; i < 3; i++)
  96. tdata[i] -= bias[i];
  97. cout << "filtered: " << tdata[0] << " " << tdata[1] << " " << tdata[2] << " (" << (sqrt(tdata[0]*tdata[0]+tdata[1]*tdata[1]+tdata[2]*tdata[2])) << ")" << endl;
  98. }
  99. return 0;
  100. }
Add Comment
Please, Sign In to add comment