+ double dHalfDetLen = m_detLen / 2;
+ m_initPos.xs1 = m_dXCenter - dHalfDetLen;
+ m_initPos.ys1 = m_dYCenter + m_dFocalLength;
+ m_initPos.xs2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset;
+ m_initPos.ys2 = m_dYCenter + m_dFocalLength;
+ m_initPos.xd1 = m_dXCenter - dHalfDetLen;
+ m_initPos.yd1 = m_dYCenter - m_dFocalLength;
+ m_initPos.xd2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset;
+ m_initPos.yd2 = m_dYCenter - m_dFocalLength;
+ m_initPos.angle = 0.0;
+ } else if (m_idGeometry == GEOMETRY_EQUILINEAR) {
+ if (m_dScanDiameter / 2 >= m_dFocalLength) {
+ m_fail = true;
+ m_failMessage = "Invalid geometry: Focal length must be larger than scan length";
+ return;
+ }
+ const double dAngle = asin ((m_dScanDiameter / 2) / m_dFocalLength);
+ const double dHalfDetLen = 2 * m_dFocalLength * tan (dAngle);
+
+ m_detLen = dHalfDetLen * 2;
+ m_detInc = m_detLen / m_nDet;
+ double dDetectorArrayEndOffset = 0;
+ if (m_nDet % 2 == 0) { // Adjust for Even number of detectors
+ m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)
+ dDetectorArrayEndOffset = m_detInc;
+ }
+
+ m_dFanBeamAngle = dAngle * 2;
+ m_initPos.angle = 0.0;
+ m_initPos.xs1 = m_dXCenter;
+ m_initPos.ys1 = m_dYCenter + m_dFocalLength;
+ m_initPos.xs2 = m_dXCenter;
+ m_initPos.ys2 = m_dYCenter + m_dFocalLength;
+ m_initPos.xd1 = m_dXCenter - dHalfDetLen;
+ m_initPos.yd1 = m_dYCenter - m_dFocalLength;
+ m_initPos.xd2 = m_dXCenter + dHalfDetLen + dDetectorArrayEndOffset;
+ m_initPos.yd2 = m_dYCenter - m_dFocalLength;
+ m_initPos.angle = 0.0;
+ } else if (m_idGeometry == GEOMETRY_EQUIANGULAR) {
+ if (m_dScanDiameter / 2 > m_dFocalLength) {
+ m_fail = true;
+ m_failMessage = "Invalid geometry: Focal length must be larger than scan length";
+ return;
+ }
+ const double dAngle = asin ((m_dScanDiameter / 2) / m_dFocalLength);
+
+ m_detLen = 2 * dAngle;
+ m_detInc = m_detLen / m_nDet;
+ double dDetectorArrayEndOffset = 0;
+ if (m_nDet % 2 == 0) { // Adjust for Even number of detectors
+ m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)
+ dDetectorArrayEndOffset = m_detInc;
+ }
+ m_dAngularDetIncrement = 2 * m_detInc; // Angular Position 2x gamma angle
+ m_dAngularDetLen = 2 * m_detLen + 2 * dDetectorArrayEndOffset;
+ m_initPos.dAngularDet = -m_dAngularDetLen / 2;
+
+ m_dFanBeamAngle = dAngle * 2;
+ m_initPos.angle = 0;
+ m_initPos.xs1 = m_dXCenter;
+ m_initPos.ys1 = m_dYCenter + m_dFocalLength;;
+ m_initPos.xs2 = m_dXCenter;
+ m_initPos.ys2 = m_dYCenter + m_dFocalLength;
+ }
+
+ // Calculate incrementatal rotation matrix
+ GRFMTX_2D temp;
+ xlat_mtx2 (m_rotmtxIncrement, -m_dXCenter, -m_dYCenter);
+ rot_mtx2 (temp, m_rotInc);
+ mult_mtx2 (m_rotmtxIncrement, temp, m_rotmtxIncrement);
+ xlat_mtx2 (temp, m_dXCenter, m_dYCenter);
+ mult_mtx2 (m_rotmtxIncrement, temp, m_rotmtxIncrement);
+