+
+ParallelRaysums::ParallelRaysums (Projections* pProjections)
+: m_ppCoordinates(NULL), m_iNumCoordinates(0)
+{
+ int nDet = pProjections->nDet();
+ int nView = pProjections->nView();
+ int iGeometry = pProjections->geometry();
+ double dDetInc = pProjections->detInc();
+ double dDetStart = pProjections->detStart();
+ double dFocalLength = pProjections->focalLength();
+
+ m_iNumCoordinates = nDet * nView;
+ m_ppCoordinates = new ParallelRaysumCoordinate* [m_iNumCoordinates];
+ for (int i = 0; i < m_iNumCoordinates; i++)
+ m_ppCoordinates[i] = new ParallelRaysumCoordinate;
+
+ ParallelRaysumCoordinate** ppCurrentCoordinate = m_ppCoordinates;
+
+ for (int iV = 0; iV < nView; iV++) {
+ double dViewAngle = pProjections->getDetectorArray(iV).viewAngle();
+ for (int iD = 0; iD < nDet; iD++) {
+ ParallelRaysumCoordinate* pC = *ppCurrentCoordinate;
+ if (iGeometry == Scanner::GEOMETRY_PARALLEL) {
+ pC->m_dTheta = dViewAngle;
+ pC->m_dT = dDetStart + (iD * dDetInc);
+ } else if (iGeometry == Scanner::GEOMETRY_EQUILINEAR) {
+ double dDetPos = dDetStart + (iD * dDetInc);
+ double dFanAngle = atan (dDetPos / pProjections->sourceDetectorLength());
+ pC->m_dTheta = dViewAngle + dFanAngle;
+ pC->m_dT = dFocalLength * sin(dFanAngle);
+ } else if (iGeometry == Scanner::GEOMETRY_EQUIANGULAR) {
+ double dFanAngle = dDetStart + (iD * dDetInc);
+ pC->m_dTheta = dViewAngle + dFanAngle;
+ pC->m_dT = dFocalLength * sin(dFanAngle);
+ }
+ ++ppCurrentCoordinate;
+ }
+ }
+}
+
+ParallelRaysums::~ParallelRaysums()
+{
+ for (int i = 0; i < m_iNumCoordinates; i++)
+ delete m_ppCoordinates[i];
+
+ delete m_ppCoordinates;
+}
+
+void
+ParallelRaysums::getLimits (double* dMinT, double* dMaxT, double* dMinTheta, double* dMaxTheta) const
+{
+ if (m_iNumCoordinates <= 0)
+ return;
+
+ *dMinT = *dMaxT = m_ppCoordinates[0]->m_dT;
+ *dMinTheta = *dMaxTheta = m_ppCoordinates[0]->m_dTheta;
+
+ for (int i = 0; i < m_iNumCoordinates; i++) {
+ double dT = m_ppCoordinates[i]->m_dT;
+ double dTheta = m_ppCoordinates[i]->m_dTheta;
+ if (dT < *dMinT)
+ *dMinT = dT;
+ else if (dT > *dMaxT)
+ *dMaxT = dT;
+
+ if (dTheta < *dMinTheta)
+ *dMinTheta = dTheta;
+ else if (dTheta > *dMaxTheta)
+ *dMaxTheta = dTheta;
+ }
+}