/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkImageSliceConstIteratorWithIndex_hxx #define itkImageSliceConstIteratorWithIndex_hxx namespace itk { //---------------------------------------------------------------------- // Advance to Next Line //---------------------------------------------------------------------- template void ImageSliceConstIteratorWithIndex::NextLine() { // Move to next line this->m_PositionIndex[m_Direction_B]++; this->m_Position += m_LineJump; // Move to beginning of line this->m_PositionIndex[m_Direction_A] = this->m_BeginIndex[m_Direction_A]; this->m_Position -= m_PixelJump * (this->m_EndIndex[m_Direction_A] - this->m_BeginIndex[m_Direction_A]); } //---------------------------------------------------------------------- // Advance to Previous Line //---------------------------------------------------------------------- template void ImageSliceConstIteratorWithIndex::PreviousLine() { // Move to previous line this->m_PositionIndex[m_Direction_B]--; this->m_Position -= m_LineJump; // Move to end of line this->m_PositionIndex[m_Direction_A] = this->m_EndIndex[m_Direction_A] - 1; this->m_Position += m_PixelJump * (this->m_EndIndex[m_Direction_A] - this->m_BeginIndex[m_Direction_A]); } //---------------------------------------------------------------------- // Go to the first pixel of the current slice //---------------------------------------------------------------------- template void ImageSliceConstIteratorWithIndex::GoToBeginOfSlice() { // Move to beginning of Slice this->m_PositionIndex[m_Direction_B] = this->m_BeginIndex[m_Direction_B]; this->m_Position -= m_LineJump * (this->m_EndIndex[m_Direction_B] - this->m_BeginIndex[m_Direction_B]); } //---------------------------------------------------------------------- // Advance to next slice //---------------------------------------------------------------------- template void ImageSliceConstIteratorWithIndex::NextSlice() { // Move to beginning of Slice this->m_Position -= m_LineJump * (this->m_PositionIndex[m_Direction_B] - this->m_BeginIndex[m_Direction_B]); this->m_PositionIndex[m_Direction_B] = this->m_BeginIndex[m_Direction_B]; for (unsigned int n = 0; n < TImage::ImageDimension; ++n) { this->m_Remaining = false; if (n == m_Direction_B || n == m_Direction_A) { continue; } this->m_PositionIndex[n]++; if (this->m_PositionIndex[n] < this->m_EndIndex[n]) { this->m_Position += this->m_OffsetTable[n]; this->m_Remaining = true; break; } else { this->m_Position -= this->m_OffsetTable[n + 1] - this->m_OffsetTable[n]; this->m_PositionIndex[n] = this->m_BeginIndex[n]; } } } //---------------------------------------------------------------------- // Go Back to previous slice //---------------------------------------------------------------------- template void ImageSliceConstIteratorWithIndex::PreviousSlice() { // Move to end of Slice this->m_PositionIndex[m_Direction_B] = this->m_EndIndex[m_Direction_B] - 1; this->m_Position += m_LineJump * (this->m_EndIndex[m_Direction_B] - this->m_BeginIndex[m_Direction_B]); for (unsigned int n = 0; n < TImage::ImageDimension; ++n) { this->m_Remaining = false; if (n == m_Direction_B || n == m_Direction_A) { continue; } this->m_PositionIndex[n]--; if (this->m_PositionIndex[n] >= this->m_BeginIndex[n]) { this->m_Position -= this->m_OffsetTable[n]; this->m_Remaining = true; break; } else { this->m_Position += this->m_OffsetTable[n + 1] - this->m_OffsetTable[n]; this->m_PositionIndex[n] = this->m_EndIndex[n] - 1; } } } //---------------------------------------------------------------------- // Test for end of line //---------------------------------------------------------------------- template bool ImageSliceConstIteratorWithIndex::IsAtEndOfLine() const { return this->m_PositionIndex[m_Direction_A] >= this->m_EndIndex[m_Direction_A]; } //---------------------------------------------------------------------- // Test for end of slice //---------------------------------------------------------------------- template bool ImageSliceConstIteratorWithIndex::IsAtEndOfSlice() const { return this->m_PositionIndex[m_Direction_B] >= this->m_EndIndex[m_Direction_B]; } //---------------------------------------------------------------------- // Test for begin of line //---------------------------------------------------------------------- template bool ImageSliceConstIteratorWithIndex::IsAtReverseEndOfLine() const { return this->m_PositionIndex[m_Direction_A] < this->m_BeginIndex[m_Direction_A]; } //---------------------------------------------------------------------- // Test for begin of slice //---------------------------------------------------------------------- template bool ImageSliceConstIteratorWithIndex::IsAtReverseEndOfSlice() const { return this->m_PositionIndex[m_Direction_B] < this->m_BeginIndex[m_Direction_B]; } //---------------------------------------------------------------------- // Select the fastest changing direction //---------------------------------------------------------------------- template void ImageSliceConstIteratorWithIndex::SetFirstDirection(unsigned int direction) { if (direction >= TImage::ImageDimension) { itkGenericExceptionMacro("In image of dimension " << TImage::ImageDimension << " Direction " << direction << " sas selected"); } m_Direction_A = direction; m_PixelJump = this->m_OffsetTable[m_Direction_A]; } //---------------------------------------------------------------------- // Select the second fastest changing direction //---------------------------------------------------------------------- template void ImageSliceConstIteratorWithIndex::SetSecondDirection(unsigned int direction) { if (direction >= TImage::ImageDimension) { itkGenericExceptionMacro("In image of dimension " << TImage::ImageDimension << " Direction " << direction << " sas selected"); } m_Direction_B = direction; m_LineJump = this->m_OffsetTable[m_Direction_B]; } //---------------------------------------------------------------------- // Advance along a line //---------------------------------------------------------------------- template ImageSliceConstIteratorWithIndex & ImageSliceConstIteratorWithIndex::operator++() { this->m_PositionIndex[m_Direction_A]++; this->m_Position += m_PixelJump; return *this; } //---------------------------------------------------------------------- // Go back along a line //---------------------------------------------------------------------- template ImageSliceConstIteratorWithIndex & ImageSliceConstIteratorWithIndex::operator--() { this->m_PositionIndex[m_Direction_A]--; this->m_Position -= m_PixelJump; return *this; } } // end namespace itk #endif