Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "cmtkSymmetryPlaneFunctional.h"
00034
00035 #include <Base/cmtkTransformedVolumeAxes.h>
00036
00037 namespace
00038 cmtk
00039 {
00040
00043
00044 SymmetryPlaneFunctional::SymmetryPlaneFunctional
00045 ( UniformVolume::SmartPtr& volume ) : m_Volume( NULL )
00046 {
00047 this->SetVolume( volume );
00048
00049 m_Metric = new VoxelMatchingNormMutInf<>( volume, volume );
00050 }
00051
00052 SymmetryPlaneFunctional::SymmetryPlaneFunctional
00053 ( UniformVolume::SmartPtr& volume,
00054 const Types::DataItemRange& valueRange )
00055 : m_Volume( NULL )
00056 {
00057 this->SetVolume( volume );
00058
00059 m_Metric = new VoxelMatchingNormMutInf<>( volume, volume, valueRange, valueRange );
00060 }
00061
00062 Types::Coordinate
00063 SymmetryPlaneFunctional::GetParamStep
00064 ( const size_t idx, const Types::Coordinate mmStep )
00065 const
00066 {
00067 switch ( idx )
00068 {
00069
00070 case 0:
00071 return mmStep;
00072
00073 case 1:
00074 case 2:
00075 return mmStep / sqrt( MathUtil::Square( 0.5 * m_Volume->Size[0] ) + MathUtil::Square( 0.5 * m_Volume->Size[1] ) + MathUtil::Square( 0.5 * m_Volume->Size[2] ) ) * 90/M_PI;
00076 }
00077 return mmStep;
00078 }
00079
00080 SymmetryPlaneFunctional::ReturnType
00081 SymmetryPlaneFunctional::Evaluate()
00082 {
00083 const TransformedVolumeAxes gridHash( *m_Volume, this->m_ParametricPlane, m_Volume->Deltas().begin() );
00084 const Vector3D *HashX = gridHash[0], *HashY = gridHash[1], *HashZ = gridHash[2];
00085
00086 Vector3D pFloating;
00087
00088 m_Metric->Reset();
00089
00090 const DataGrid::IndexType& Dims = m_Volume->GetDims();
00091 const int DimsX = Dims[0], DimsY = Dims[1], DimsZ = Dims[2];
00092
00093 int fltIdx[3];
00094 Types::Coordinate fltFrac[3];
00095
00096 Vector3D planeStart, rowStart;
00097
00098 int r = 0;
00099 for ( int pZ = 0; pZ<DimsZ; ++pZ )
00100 {
00101 planeStart = HashZ[pZ];
00102
00103 for ( int pY = 0; pY<DimsY; ++pY )
00104 {
00105 (rowStart = planeStart) += HashY[pY];
00106
00107 for ( int pX = 0; pX<DimsX; ++pX, ++r )
00108 {
00109 (pFloating = rowStart) += HashX[pX];
00110
00111
00112
00113 if ( m_Volume->FindVoxelByIndex( pFloating, fltIdx, fltFrac ) )
00114 {
00115
00116 int offset = fltIdx[0] + DimsX * (fltIdx[1] + DimsY * fltIdx[2]);
00117
00118
00119 m_Metric->Proceed( (int) r, offset, fltFrac );
00120 }
00121 }
00122 }
00123 }
00124
00125 return m_Metric->Get();
00126 }
00127
00128 }