generatorMove.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "stdafx.h"
  2. #include "generatorMove.hpp"
  3. #include <math.h>
  4. #include <iostream>
  5. int tomoMotionGeometry(
  6. int flag,
  7. float rstPos,
  8. float accDst,
  9. float brkDst,
  10. float latDst,
  11. float susDst,
  12. float SID,
  13. float v,
  14. int NProj,
  15. float scanAngle,
  16. float AngPerMot,
  17. float kvAng,
  18. float& warmAngle,
  19. float& AnglePerSec,
  20. float* Seq,
  21. int* NCount,
  22. int* Period,
  23. int& Nsec,
  24. int& NSeqLen)
  25. {
  26. int N = NProj - 1;
  27. float perSec = scanAngle / N;
  28. float setAng = N * perSec;
  29. float pi = atan(1.0f) * 4;
  30. float start = rstPos + tan(setAng / 2 * pi / 180) * SID;
  31. if (SID < (1.0 - 0.5)
  32. || abs(setAng / 2) > 30
  33. || flag == 0)
  34. {
  35. return -1;
  36. }
  37. warmAngle = scanAngle;
  38. if (flag == 1)
  39. {
  40. Seq[2] = start;
  41. Seq[1] = Seq[2] + latDst;
  42. Seq[0] = Seq[1] + accDst;
  43. if ((N % 2) == 0)
  44. {
  45. for (int i = 1; i <= (N / 2); ++i)
  46. {
  47. Seq[N / 2 - i - 1 + 3] = rstPos + SID * tan(((i)* perSec) * pi / 180);
  48. }
  49. Seq[3 + N / 2 - 1] = rstPos;
  50. for (int i = 0; i < (N / 2); ++i)
  51. {
  52. Seq[3 + N / 2 + i] = 2 * rstPos - Seq[2 + N / 2 - i - 1];
  53. }
  54. }
  55. else
  56. {
  57. float alpha = perSec / 2.0f;
  58. int halfCount = (int)floor(N / 2);
  59. for (int i = 0; i < halfCount + 1; ++i)
  60. {
  61. Seq[halfCount - i - 1 + 3] = rstPos + SID * tan(((2 * i + 1) * alpha) * pi / 180);
  62. }
  63. for (int i = 0; i < halfCount + 1; ++i)
  64. {
  65. Seq[3 + halfCount + i] = 2 * rstPos - Seq[2 + halfCount - i];
  66. }
  67. }
  68. Seq[3 + N] = Seq[2 + N] - susDst;
  69. Seq[4 + N] = Seq[3 + N] - brkDst;
  70. for (int i = 0; i < N; ++i)
  71. {
  72. NCount[i] = (int)(perSec / AngPerMot);
  73. float hi = abs(Seq[2 + i] - Seq[2 + i + 1]);
  74. int NTReslution = (int)floor(kvAng * (1e+6 * AngPerMot) * hi / (v * perSec));
  75. Period[i] = NTReslution;
  76. }
  77. AnglePerSec = perSec;
  78. Nsec = N;
  79. NSeqLen = Nsec + 5;
  80. }
  81. return 0;
  82. }