From b2fc6c70434674d74551c3a6c01ffb3233499312 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Mon, 1 Jul 2013 22:34:11 +0000 Subject: Update version to 1.3 --- src/Float32VolumeData3D.cpp | 269 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 src/Float32VolumeData3D.cpp (limited to 'src/Float32VolumeData3D.cpp') diff --git a/src/Float32VolumeData3D.cpp b/src/Float32VolumeData3D.cpp new file mode 100644 index 0000000..d269aa8 --- /dev/null +++ b/src/Float32VolumeData3D.cpp @@ -0,0 +1,269 @@ +/* +----------------------------------------------------------------------- +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 . + +----------------------------------------------------------------------- +$Id$ +*/ + +#include "astra/Float32VolumeData3D.h" + +namespace astra +{ + +//---------------------------------------------------------------------------------------- +// Default constructor. +CFloat32VolumeData3D::CFloat32VolumeData3D() : + CFloat32Data3D() { + +} + +//---------------------------------------------------------------------------------------- +// Destructor +CFloat32VolumeData3D::~CFloat32VolumeData3D() { + +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator+=(const CFloat32VolumeData3D& _data) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); +#ifdef _DEBUG + CVolumeGeometry3D * pDataGeometry = _data.getGeometry(); + int iThisSlicePixelCount = pThisGeometry->getGridRowCount() * pThisGeometry->getGridColCount(); + int iDataSlicePixelCount = pDataGeometry->getGridRowCount() * pDataGeometry->getGridColCount(); + + ASTRA_ASSERT(iSliceCount == pDataGeometry->getGridSliceCount()); + ASTRA_ASSERT(iThisSlicePixelCount == iDataSlicePixelCount); +#endif + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + CFloat32VolumeData2D * pDataProjection = _data.fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; + + fThisValue += fDataValue; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + delete pDataProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator-=(const CFloat32VolumeData3D& _data) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); +#ifdef _DEBUG + CVolumeGeometry3D * pDataGeometry = _data.getGeometry(); + int iThisSlicePixelCount = pThisGeometry->getGridRowCount() * pThisGeometry->getGridColCount(); + int iDataSlicePixelCount = pDataGeometry->getGridRowCount() * pDataGeometry->getGridColCount(); + + ASTRA_ASSERT(iSliceCount == pDataGeometry->getGridSliceCount()); + ASTRA_ASSERT(iThisSlicePixelCount == iDataSlicePixelCount); +#endif + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + CFloat32VolumeData2D * pDataProjection = _data.fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; + + fThisValue -= fDataValue; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + delete pDataProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator*=(const CFloat32VolumeData3D& _data) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); +#ifdef _DEBUG + CVolumeGeometry3D * pDataGeometry = _data.getGeometry(); + int iThisSlicePixelCount = pThisGeometry->getGridRowCount() * pThisGeometry->getGridColCount(); + int iDataSlicePixelCount = pDataGeometry->getGridRowCount() * pDataGeometry->getGridColCount(); + + ASTRA_ASSERT(iSliceCount == pDataGeometry->getGridSliceCount()); + ASTRA_ASSERT(iThisSlicePixelCount == iDataSlicePixelCount); +#endif + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + CFloat32VolumeData2D * pDataProjection = _data.fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + float32 fDataValue = pDataProjection->getDataConst()[iDetectorIndex]; + + fThisValue *= fDataValue; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + delete pDataProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator*=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue *= _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator/=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue /= _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator+=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue += _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +CFloat32VolumeData3D& CFloat32VolumeData3D::operator-=(const float32& _fScalar) +{ + CVolumeGeometry3D * pThisGeometry = getGeometry(); + + int iSliceCount = pThisGeometry->getGridSliceCount(); + + for(int iSliceIndex = 0; iSliceIndex < iSliceCount; iSliceIndex++) + { + CFloat32VolumeData2D * pThisProjection = fetchSliceZ(iSliceIndex); + + for(int iDetectorIndex = 0; iDetectorIndex < iDetectorIndex; iDetectorIndex++) + { + float32 fThisValue = pThisProjection->getData()[iDetectorIndex]; + + fThisValue -= _fScalar; + + pThisProjection->getData()[iDetectorIndex] = fThisValue; + } + + returnSliceZ(iSliceIndex, pThisProjection); + + delete pThisProjection; + } + + return *this; +} + +} // end namespace astra -- cgit v1.2.3