17 #ifndef __itkImageRegionMultidimensionalSplitter_txx
18 #define __itkImageRegionMultidimensionalSplitter_txx
28 template <
unsigned int VImageDimension>
36 double splitsPerDimension =
37 vcl_ceil( vcl_pow((
double) requestedNumber, 1.0/(
double) VImageDimension));
41 unsigned int i, numPieces;
43 for (i=0; i < VImageDimension; ++i)
45 if (regionSize[i] < splitsPerDimension)
47 numPieces *= regionSize[i];
51 numPieces *= (
unsigned int) splitsPerDimension;
62 template <
unsigned int VImageDimension>
75 splitSize = splitRegion.
GetSize();
80 double splitsPerDimension =
81 vcl_ceil( vcl_pow((
double) numberOfPieces, 1.0/(
double) VImageDimension));
85 unsigned int splits[VImageDimension], pixelsPerSplit[VImageDimension];
86 unsigned int j, numPieces;
87 unsigned int ijk[VImageDimension];
88 unsigned int offsetTable[VImageDimension];
90 for (j=0; j < VImageDimension; ++j)
92 offsetTable[j] = numPieces;
93 if (regionSize[j] < splitsPerDimension)
95 splits[j] = regionSize[j];
96 pixelsPerSplit[j] = 1;
97 numPieces *= regionSize[j];
101 splits[j] = (
unsigned int) splitsPerDimension;
102 pixelsPerSplit[j] = Math::Ceil<unsigned int>( regionSize[j] / (double) splits[j] );
103 numPieces *= (
unsigned int) splitsPerDimension;
108 unsigned int offset = i;
109 for (j=VImageDimension-1; j > 0; j--)
111 ijk[j] = offset / offsetTable[j];
112 offset -= (ijk[j] * offsetTable[j]);
117 for (j=0; j < VImageDimension; j++)
119 splitIndex[j] += ijk[j]*pixelsPerSplit[j];
120 if (ijk[j] < splits[j] - 1)
122 splitSize[j] = pixelsPerSplit[j];
127 splitSize[j] = splitSize[j] - ijk[j]*pixelsPerSplit[j];
133 splitRegion.
SetSize( splitSize );
135 itkDebugMacro(
" Split Piece: " << std::endl << splitRegion );
145 template <
unsigned int VImageDimension>
150 Superclass::PrintSelf(os,indent);