Mercurial > hg > orthanc-stone
diff Framework/Toolbox/ParallelSlices.cpp @ 735:c3bbb130abc4
removing dependencies in ImageBuffer3D
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 21 May 2019 16:15:06 +0200 |
parents | b70e9be013e4 |
children |
line wrap: on
line diff
--- a/Framework/Toolbox/ParallelSlices.cpp Tue May 21 15:20:04 2019 +0200 +++ b/Framework/Toolbox/ParallelSlices.cpp Tue May 21 16:15:06 2019 +0200 @@ -22,6 +22,7 @@ #include "ParallelSlices.h" #include "GeometryToolbox.h" +#include "../Volumes/ImageBuffer3D.h" #include <Core/Logging.h> #include <Core/OrthancException.h> @@ -30,7 +31,7 @@ { ParallelSlices::ParallelSlices() { - LinearAlgebra::AssignVector(normal_, 0, 0, 1); + Clear(); } @@ -48,7 +49,7 @@ } - ParallelSlices::~ParallelSlices() + void ParallelSlices::Clear() { for (size_t i = 0; i < slices_.size(); i++) { @@ -58,6 +59,15 @@ slices_[i] = NULL; } } + + slices_.clear(); + LinearAlgebra::AssignVector(normal_, 0, 0, 1); + } + + + ParallelSlices::~ParallelSlices() + { + Clear(); } @@ -146,4 +156,60 @@ return reversed.release(); } + + + ParallelSlices* ParallelSlices::FromVolumeImage(const VolumeImageGeometry& geometry, + VolumeProjection projection) + { + const Vector dimensions = geometry.GetVoxelDimensions(VolumeProjection_Axial); + const CoordinateSystem3D& axial = geometry.GetAxialGeometry(); + + std::auto_ptr<ParallelSlices> result(new ParallelSlices); + + switch (projection) + { + case VolumeProjection_Axial: + for (unsigned int z = 0; z < geometry.GetDepth(); z++) + { + Vector origin = axial.GetOrigin(); + origin += static_cast<double>(z) * dimensions[2] * axial.GetNormal(); + + result->AddSlice(origin, + axial.GetAxisX(), + axial.GetAxisY()); + } + break; + + case VolumeProjection_Coronal: + for (unsigned int y = 0; y < geometry.GetHeight(); y++) + { + Vector origin = axial.GetOrigin(); + origin += static_cast<double>(y) * dimensions[1] * axial.GetAxisY(); + origin += static_cast<double>(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal(); + + result->AddSlice(origin, + axial.GetAxisX(), + -axial.GetNormal()); + } + break; + + case VolumeProjection_Sagittal: + for (unsigned int x = 0; x < geometry.GetWidth(); x++) + { + Vector origin = axial.GetOrigin(); + origin += static_cast<double>(x) * dimensions[0] * axial.GetAxisX(); + origin += static_cast<double>(geometry.GetDepth() - 1) * dimensions[2] * axial.GetNormal(); + + result->AddSlice(origin, + axial.GetAxisY(), + -axial.GetNormal()); + } + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); + } + + return result.release(); + } }