- m_detLen = SQRT2 * m_phmLen * ((m_nDet + N_EXTRA_DETECTORS) / static_cast<double>(m_nDet));
-
- m_rotLen = rot_anglen;
-
- m_radius = m_detLen / 2;
- m_detInc = m_detLen / m_nDet;
- m_rotInc = m_rotLen / m_nView;
-
- m_initPos.xd1 = m_detLen / 2;
- m_initPos.yd1 = -m_detLen / 2;
- m_initPos.xd2 = m_detLen / 2;
- m_initPos.yd2 = m_detLen / 2;
- m_initPos.xs1 = -m_detLen / 2;
- m_initPos.ys1 = -m_detLen / 2;
- m_initPos.xs2 = -m_detLen / 2;
- m_initPos.ys2 = m_detLen / 2;
- m_initPos.angle = 0.0;
+ m_dFocalLengthRatio = dFocalLengthRatio;
+ m_dFieldOfViewRatio = dFieldOfViewRatio;
+ m_dFocalLength = (m_phmLen * SQRT2 / 2) * dFocalLengthRatio;
+ m_dFieldOfView = m_phmLen * SQRT2 * dFieldOfViewRatio;
+
+ m_dXCenter = phm.xmin() + (phm.xmax() - phm.xmin()) / 2;
+ m_dYCenter = phm.ymin() + (phm.ymax() - phm.ymin()) / 2;
+ if (m_idGeometry == GEOMETRY_PARALLEL) {
+ m_detLen = m_dFieldOfView;
+ m_detInc = m_detLen / m_nDet;
+ m_rotLen = rot_anglen;
+ m_rotInc = m_rotLen / m_nView;
+
+ double dHalfDetLen = m_detLen / 2;
+ m_initPos.xs1 = m_dXCenter - m_dFocalLength;
+ m_initPos.ys1 = m_dYCenter - dHalfDetLen;
+ m_initPos.xs2 = m_dXCenter - m_dFocalLength;
+ m_initPos.ys2 = m_dYCenter + dHalfDetLen;
+ m_initPos.xd1 = m_dXCenter + m_dFocalLength;
+ m_initPos.yd1 = m_dYCenter - dHalfDetLen;
+ m_initPos.xd2 = m_dXCenter + m_dFocalLength;
+ m_initPos.yd2 = m_dYCenter + dHalfDetLen;
+ m_initPos.angle = 0.0;
+ } else if (m_idGeometry == GEOMETRY_EQUILINEAR) {
+ double dHalfSquare = m_dFieldOfView / SQRT2 / 2;
+ double dFocalPastPhm = m_dFocalLength - dHalfSquare;
+ if (dFocalPastPhm <= 0.) {
+ m_fail = true;
+ m_failMessage = "Focal Point inside of phantom";
+ return;
+ }
+ double dAngle = atan( dHalfSquare / dFocalPastPhm );
+ double dHalfDetLen = 2 * m_dFocalLength * tan (dAngle);
+
+ m_detLen = dHalfDetLen * 2;
+ m_detInc = m_detLen / m_nDet;
+ m_rotLen = rot_anglen;
+ m_rotInc = m_rotLen / m_nView;
+
+ m_initPos.xs1 = m_dXCenter - m_dFocalLength;
+ m_initPos.ys1 = m_dYCenter;
+ m_initPos.xs2 = m_dXCenter - m_dFocalLength;
+ m_initPos.ys2 = m_dYCenter;
+ m_initPos.xd1 = m_dXCenter + m_dFocalLength;
+ m_initPos.yd1 = m_dYCenter - dHalfDetLen;
+ m_initPos.xd2 = m_dXCenter + m_dFocalLength;
+ m_initPos.yd2 = m_dYCenter + dHalfDetLen;
+ m_initPos.angle = 0.0;
+ } else if (m_idGeometry == GEOMETRY_EQUIANGULAR) {
+ double dHalfSquare = m_dFieldOfView / SQRT2 / 2;
+ double dFocalPastPhm = m_dFocalLength - dHalfSquare;
+ if (dFocalPastPhm <= 0.) {
+ m_fail = true;
+ m_failMessage = "Focal Point inside of phantom";
+ return;
+ }
+ double dAngle = 2 * atan( dHalfSquare / dFocalPastPhm );
+ m_detLen = 2 * dAngle;
+ m_detInc = m_detLen / m_nDet;
+ m_rotLen = rot_anglen;
+ m_rotInc = m_rotLen / m_nView;
+
+ m_initPos.xs1 = m_dXCenter - m_dFocalLength;
+ m_initPos.ys1 = m_dYCenter;
+ m_initPos.xs2 = m_dXCenter - m_dFocalLength;
+ m_initPos.ys2 = m_dYCenter;
+ m_initPos.angle = -dAngle;
+ }
+
+ // 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);
+