summaryrefslogtreecommitdiffstats
path: root/src/ConeProjectionGeometry3D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ConeProjectionGeometry3D.cpp')
-rw-r--r--src/ConeProjectionGeometry3D.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/ConeProjectionGeometry3D.cpp b/src/ConeProjectionGeometry3D.cpp
index 129e675..4cdb9e4 100644
--- a/src/ConeProjectionGeometry3D.cpp
+++ b/src/ConeProjectionGeometry3D.cpp
@@ -225,4 +225,36 @@ CVector3D CConeProjectionGeometry3D::getProjectionDirection(int _iProjectionInde
return ret;
}
+void CConeProjectionGeometry3D::projectPoint(float32 fX, float32 fY, float32 fZ,
+ int iAngleIndex,
+ float32 &fU, float32 &fV) const
+{
+ ASTRA_ASSERT(iAngleIndex >= 0);
+ ASTRA_ASSERT(iAngleIndex < m_iProjectionAngleCount);
+
+ float alpha = m_pfProjectionAngles[iAngleIndex];
+
+ // Project point onto optical axis
+
+ // Projector direction is (cos(alpha), sin(alpha))
+ // Vector source->origin is (-sin(alpha), cos(alpha))
+
+ // Distance from source, projected on optical axis
+ float fD = -sin(alpha) * fX + cos(alpha) * fY + m_fOriginSourceDistance;
+
+ // Scale fZ to detector plane
+ fV = detectorOffsetYToRowIndexFloat( (fZ * (m_fOriginSourceDistance + m_fOriginDetectorDistance)) / fD );
+
+
+ // Orthogonal distance in XY-plane to optical axis
+ float fS = cos(alpha) * fX + sin(alpha) * fY;
+
+ // Scale fS to detector plane
+ fU = detectorOffsetXToColIndexFloat( (fS * (m_fOriginSourceDistance + m_fOriginDetectorDistance)) / fD );
+
+ fprintf(stderr, "alpha: %f, D: %f, V: %f, S: %f, U: %f\n", alpha, fD, fV, fS, fU);
+
+}
+
+
} // end namespace astra