summaryrefslogtreecommitdiffstats
path: root/include/astra/DataProjector.h
diff options
context:
space:
mode:
authorWillem Jan Palenstijn <WillemJan.Palenstijn@uantwerpen.be>2013-07-01 22:34:11 +0000
committerwpalenst <WillemJan.Palenstijn@uantwerpen.be>2013-07-01 22:34:11 +0000
commitb2fc6c70434674d74551c3a6c01ffb3233499312 (patch)
treeb17f080ebc504ab85ebb7c3d89f917fd87ce9e00 /include/astra/DataProjector.h
downloadastra-b2fc6c70434674d74551c3a6c01ffb3233499312.tar.gz
astra-b2fc6c70434674d74551c3a6c01ffb3233499312.tar.bz2
astra-b2fc6c70434674d74551c3a6c01ffb3233499312.tar.xz
astra-b2fc6c70434674d74551c3a6c01ffb3233499312.zip
Update version to 1.3
Diffstat (limited to 'include/astra/DataProjector.h')
-rw-r--r--include/astra/DataProjector.h327
1 files changed, 327 insertions, 0 deletions
diff --git a/include/astra/DataProjector.h b/include/astra/DataProjector.h
new file mode 100644
index 0000000..a324625
--- /dev/null
+++ b/include/astra/DataProjector.h
@@ -0,0 +1,327 @@
+/*
+-----------------------------------------------------------------------
+Copyright 2012 iMinds-Vision Lab, University of Antwerp
+
+Contact: astra@ua.ac.be
+Website: http://astra.ua.ac.be
+
+
+This file is part of the
+All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox").
+
+The ASTRA Toolbox is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+The ASTRA Toolbox is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+
+-----------------------------------------------------------------------
+$Id$
+*/
+
+#ifndef _INC_ASTRA_DATAPROJECTOR
+#define _INC_ASTRA_DATAPROJECTOR
+
+#include "Projector2D.h"
+
+#include "TypeList.h"
+
+#include "ProjectorTypelist.h"
+
+#include "DataProjectorPolicies.h"
+
+namespace astra
+{
+
+
+/**
+ * Interface class for the Data Projector. The sole purpose of this class is to force child classes to implement a series of methods
+ */
+class CDataProjectorInterface {
+public:
+ CDataProjectorInterface() { }
+ virtual ~CDataProjectorInterface() { }
+ virtual void project() = 0;
+ virtual void projectSingleProjection(int _iProjection) = 0;
+ virtual void projectSingleRay(int _iProjection, int _iDetector) = 0;
+// virtual void projectSingleVoxel(int _iRow, int _iCol) = 0;
+// virtual void projectAllVoxels() = 0;
+};
+
+/**
+ * Templated Data Projector Class. In this class a specific projector and policies are combined.
+ */
+template <typename Projector, typename Policy>
+class CDataProjector: public CDataProjectorInterface {
+
+private:
+
+ Projector* m_pProjector;
+ Policy m_pPolicy;
+
+public:
+
+ CDataProjector() {};
+
+ CDataProjector(Projector* _p, Policy _a);
+ ~CDataProjector();
+
+ virtual void project();
+
+ virtual void projectSingleProjection(int _iProjection);
+
+ virtual void projectSingleRay(int _iProjection, int _iDetector);
+
+// virtual void projectSingleVoxel(int _iRow, int _iCol);
+
+// virtual void projectAllVoxels();
+};
+
+//----------------------------------------------------------------------------------------
+/**
+ * Constructor
+*/
+template <typename Projector, typename Policy>
+CDataProjector<Projector,Policy>::CDataProjector(Projector* _p, Policy _a)
+{
+ m_pProjector = _p;
+ m_pPolicy = _a;
+}
+
+//----------------------------------------------------------------------------------------
+/**
+ * Destructor
+*/
+template <typename Projector, typename Policy>
+CDataProjector<Projector,Policy>::~CDataProjector()
+{
+ // does nothing
+}
+
+//----------------------------------------------------------------------------------------
+/**
+ * Compute projection using the algorithm specific to the projector type
+*/
+template <typename Projector, typename Policy>
+void CDataProjector<Projector,Policy>::project()
+{
+ m_pProjector->project(m_pPolicy);
+}
+
+//----------------------------------------------------------------------------------------
+/**
+ * Compute just one projection using the algorithm specific to the projector type
+*/
+template <typename Projector, typename Policy>
+void CDataProjector<Projector,Policy>::projectSingleProjection(int _iProjection)
+{
+ m_pProjector->projectSingleProjection(_iProjection, m_pPolicy);
+}
+
+//----------------------------------------------------------------------------------------
+/**
+ * Compute projection of one ray using the algorithm specific to the projector type
+*/
+template <typename Projector, typename Policy>
+void CDataProjector<Projector,Policy>::projectSingleRay(int _iProjection, int _iDetector)
+{
+ m_pProjector->projectSingleRay(_iProjection, _iDetector, m_pPolicy);
+}
+
+//----------------------------------------------------------------------------------------
+//template <typename Projector, typename Policy>
+//void CDataProjector<Projector,Policy>::projectSingleVoxel(int _iRow, int _iCol)
+//{
+// m_pProjector->projectSingleVoxel(_iRow, _iCol, m_pPolicy);
+//}
+
+//----------------------------------------------------------------------------------------
+//template <typename Projector, typename Policy>
+//void CDataProjector<Projector,Policy>::projectAllVoxels()
+//{
+// m_pProjector->projectAllVoxels(m_pPolicy);
+//}
+//----------------------------------------------------------------------------------------
+
+
+
+
+//-----------------------------------------------------------------------------------------
+// Create a new datainterface from the projector TypeList
+namespace typelist {
+ template <class TList>
+ struct CreateDataProjector {
+ template <class U, typename Policy>
+ static void find (U& functor, CProjector2D* _pProjector, const Policy& _pPolicy) {
+ if (functor(TList::Head::type)) {
+ functor.res = new CDataProjector<typename TList::Head, Policy>(static_cast<typename TList::Head*>(_pProjector), _pPolicy);
+ }
+ CreateDataProjector<typename TList::Tail>::find(functor, _pProjector, _pPolicy);
+ }
+ };
+ template <>
+ struct CreateDataProjector<NullType> {
+ template <class U, typename Policy>
+ static void find(U& functor, CProjector2D* _pProjector, const Policy& _pPolicy) {}
+ };
+
+ struct functor_find_datainterface {
+ functor_find_datainterface() { res = NULL; }
+ bool operator() (std::string name) {
+ return strcmp(tofind.c_str(), name.c_str()) == 0;
+ }
+ std::string tofind;
+ CDataProjectorInterface* res;
+ };
+}
+//-----------------------------------------------------------------------------------------
+
+/**
+ * Data Projector Dispatcher - 1 Policy
+ */
+template <typename Policy>
+static CDataProjectorInterface* dispatchDataProjector(CProjector2D* _pProjector, const Policy& _policy)
+{
+ typelist::functor_find_datainterface finder = typelist::functor_find_datainterface();
+ finder.tofind = _pProjector->getType();
+ typelist::CreateDataProjector<Projector2DTypeList>::find(finder, _pProjector, _policy);
+ return finder.res;
+}
+
+
+
+/**
+ * Data Projector Dispatcher - 2 Policies
+ */
+template <typename Policy1, typename Policy2>
+static CDataProjectorInterface* dispatchDataProjector(CProjector2D* _pProjector,
+ const Policy1& _policy,
+ const Policy2& _policy2,
+ bool _bUsePolicy1 = true,
+ bool _bUsePolicy2 = true)
+{
+ if (!_bUsePolicy1 && !_bUsePolicy2) {
+ return dispatchDataProjector(_pProjector, EmptyPolicy());
+ } else if (!_bUsePolicy1) {
+ return dispatchDataProjector(_pProjector, _policy2);
+ } else if (!_bUsePolicy2) {
+ return dispatchDataProjector(_pProjector, _policy);
+ } else {
+ return dispatchDataProjector(_pProjector, CombinePolicy<Policy1, Policy2>(_policy, _policy2));
+ }
+
+}
+
+/**
+ * Data Projector Dispatcher - 3 Policies
+ */
+
+template <typename Policy1, typename Policy2, typename Policy3>
+static CDataProjectorInterface* dispatchDataProjector(CProjector2D* _pProjector,
+ const Policy1& _policy1,
+ const Policy2& _policy2,
+ const Policy3& _policy3,
+ bool _bUsePolicy1 = true,
+ bool _bUsePolicy2 = true,
+ bool _bUsePolicy3 = true)
+{
+ if (!_bUsePolicy1) {
+ return dispatchDataProjector(_pProjector, _policy2, _policy3, _bUsePolicy2, _bUsePolicy3);
+ } else if (!_bUsePolicy2) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy3, _bUsePolicy1, _bUsePolicy3);
+ } else if (!_bUsePolicy3) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy2, _bUsePolicy1, _bUsePolicy2);
+ } else {
+ return dispatchDataProjector(_pProjector, Combine3Policy<Policy1, Policy2, Policy3>(_policy1, _policy2, _policy3));
+ }
+}
+
+/**
+ * Data Projector Dispatcher - 4 Policies
+ */
+template <typename Policy1, typename Policy2, typename Policy3, typename Policy4>
+static CDataProjectorInterface* dispatchDataProjector(CProjector2D* _pProjector,
+ const Policy1& _policy1,
+ const Policy2& _policy2,
+ const Policy3& _policy3,
+ const Policy4& _policy4,
+ bool _bUsePolicy1 = true,
+ bool _bUsePolicy2 = true,
+ bool _bUsePolicy3 = true,
+ bool _bUsePolicy4 = true)
+{
+ if (!_bUsePolicy1) {
+ return dispatchDataProjector(_pProjector, _policy2, _policy3, _policy4, _bUsePolicy2, _bUsePolicy3, _bUsePolicy4);
+ } else if (!_bUsePolicy2) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy3, _policy4, _bUsePolicy1, _bUsePolicy3, _bUsePolicy4);
+ } else if (!_bUsePolicy3) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy2, _policy4, _bUsePolicy1, _bUsePolicy2, _bUsePolicy4);
+ } else if (!_bUsePolicy4) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy2, _policy3, _bUsePolicy1, _bUsePolicy2, _bUsePolicy3);
+ } else {
+ return dispatchDataProjector(_pProjector, Combine4Policy<Policy1, Policy2, Policy3, Policy4>(_policy1, _policy2, _policy3, _policy4));
+ }
+}
+
+/**
+ * Data Projector Dispatcher - 5 Policies
+ */
+template <typename Policy1, typename Policy2, typename Policy3, typename Policy4, typename Policy5>
+static CDataProjectorInterface* dispatchDataProjector(CProjector2D* _pProjector,
+ const Policy1& _policy1,
+ const Policy2& _policy2,
+ const Policy3& _policy3,
+ const Policy4& _policy4,
+ const Policy5& _policy5,
+ bool _bUsePolicy1 = true,
+ bool _bUsePolicy2 = true,
+ bool _bUsePolicy3 = true,
+ bool _bUsePolicy4 = true,
+ bool _bUsePolicy5 = true)
+{
+ if (!_bUsePolicy1) {
+ return dispatchDataProjector(_pProjector, _policy2, _policy3, _policy4, _policy5, _bUsePolicy2, _bUsePolicy3, _bUsePolicy4, _bUsePolicy5);
+ } else if (!_bUsePolicy2) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy3, _policy4, _policy5, _bUsePolicy1, _bUsePolicy3, _bUsePolicy4, _bUsePolicy5);
+ } else if (!_bUsePolicy3) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy2, _policy4, _policy5, _bUsePolicy1, _bUsePolicy2, _bUsePolicy4, _bUsePolicy5);
+ } else if (!_bUsePolicy4) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy2, _policy3, _policy5, _bUsePolicy1, _bUsePolicy2, _bUsePolicy3, _bUsePolicy5);
+ } else if (!_bUsePolicy5) {
+ return dispatchDataProjector(_pProjector, _policy1, _policy2, _policy3, _policy4, _bUsePolicy1, _bUsePolicy2, _bUsePolicy3, _bUsePolicy4);
+ } else {
+ return dispatchDataProjector(_pProjector, CombinePolicy< Combine4Policy<Policy1, Policy2, Policy3, Policy4>, Policy5>(
+ Combine4Policy<Policy1, Policy2, Policy3, Policy4>(_policy1, _policy2, _policy3, _policy4),
+ _policy5)
+ );
+ }
+}
+
+
+
+
+//-----------------------------------------------------------------------------------------
+/**
+ * Data Projector Project
+ */
+template <typename Policy>
+static void projectData(CProjector2D* _pProjector, const Policy& _policy)
+{
+ CDataProjectorInterface* dp = dispatchDataProjector(_pProjector, _policy);
+ dp->project();
+ delete dp;
+}
+
+
+
+
+} // namespace astra
+
+#endif