1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #include "stdafx.h"
- #include "generatorMove.hpp"
- #include <math.h>
- #include <iostream>
- int tomoMotionGeometry(
- int flag,
- float rstPos,
- float accDst,
- float brkDst,
- float latDst,
- float susDst,
- float SID,
- float v,
- int NProj,
- float scanAngle,
- float AngPerMot,
- float kvAng,
- float& warmAngle,
- float& AnglePerSec,
- float* Seq,
- int* NCount,
- int* Period,
- int& Nsec,
- int& NSeqLen)
- {
- int N = NProj - 1;
- float perSec = scanAngle / N;
- float setAng = N * perSec;
- float pi = atan(1.0f) * 4;
- float start = rstPos + tan(setAng / 2 * pi / 180) * SID;
- if (SID < (1.0 - 0.5)
- || abs(setAng / 2) > 30
- || flag == 0)
- {
- return -1;
- }
- warmAngle = scanAngle;
-
-
- if (flag == 1)
- {
- Seq[2] = start;
- Seq[1] = Seq[2] + latDst;
- Seq[0] = Seq[1] + accDst;
- if ((N % 2) == 0)
- {
- for (int i = 1; i <= (N / 2); ++i)
- {
- Seq[N / 2 - i - 1 + 3] = rstPos + SID * tan(((i)* perSec) * pi / 180);
- }
- Seq[3 + N / 2 - 1] = rstPos;
- for (int i = 0; i < (N / 2); ++i)
- {
- Seq[3 + N / 2 + i] = 2 * rstPos - Seq[2 + N / 2 - i - 1];
- }
- }
- else
- {
- float alpha = perSec / 2.0f;
- int halfCount = (int)floor(N / 2);
- for (int i = 0; i < halfCount + 1; ++i)
- {
- Seq[halfCount - i - 1 + 3] = rstPos + SID * tan(((2 * i + 1) * alpha) * pi / 180);
- }
- for (int i = 0; i < halfCount + 1; ++i)
- {
- Seq[3 + halfCount + i] = 2 * rstPos - Seq[2 + halfCount - i];
- }
- }
- Seq[3 + N] = Seq[2 + N] - susDst;
- Seq[4 + N] = Seq[3 + N] - brkDst;
- for (int i = 0; i < N; ++i)
- {
- NCount[i] = (int)(perSec / AngPerMot);
- float hi = abs(Seq[2 + i] - Seq[2 + i + 1]);
- int NTReslution = (int)floor(kvAng * (1e+6 * AngPerMot) * hi / (v * perSec));
- Period[i] = NTReslution;
- }
- AnglePerSec = perSec;
- Nsec = N;
- NSeqLen = Nsec + 5;
- }
- return 0;
- }
|