/*========================================================================= * * 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 itkNeighborhood_hxx #define itkNeighborhood_hxx #include "itkNumericTraits.h" namespace itk { template void Neighborhood::ComputeNeighborhoodStrideTable() { OffsetValueType accum = 1; for (DimensionValueType dim = 0; dim < VDimension; ++dim) { m_StrideTable[dim] = accum; accum *= m_Size[dim]; } } template void Neighborhood::ComputeNeighborhoodOffsetTable() { m_OffsetTable.clear(); m_OffsetTable.reserve(this->Size()); OffsetType o; DimensionValueType i, j; for (j = 0; j < VDimension; ++j) { o[j] = -(static_cast(this->GetRadius(j))); } for (i = 0; i < this->Size(); ++i) { m_OffsetTable.push_back(o); for (j = 0; j < VDimension; ++j) { o[j] = o[j] + 1; if (o[j] > static_cast(this->GetRadius(j))) { o[j] = -(static_cast(this->GetRadius(j))); } else { break; } } } } template void Neighborhood::SetRadius(const SizeValueType s) { SizeType k; for (DimensionValueType i = 0; i < VDimension; ++i) { k[i] = s; } this->SetRadius(k); } template void Neighborhood::SetRadius(const SizeType & r) { this->m_Radius = r; this->SetSize(); this->Allocate(m_Size.CalculateProductOfElements()); this->ComputeNeighborhoodStrideTable(); this->ComputeNeighborhoodOffsetTable(); } template std::slice Neighborhood::GetSlice(unsigned int d) const { const OffsetValueType t = this->GetStride(d); const auto s = static_cast(this->GetSize()[d]); OffsetValueType n = this->Size() / 2; n -= t * s / 2; return { static_cast(n), static_cast(s), static_cast(t) }; } template auto Neighborhood::GetNeighborhoodIndex(const OffsetType & o) const -> NeighborIndexType { unsigned int idx = (this->Size() / 2); for (unsigned int i = 0; i < VDimension; ++i) { idx += o[i] * m_StrideTable[i]; } return idx; } template void Neighborhood::PrintSelf(std::ostream & os, Indent indent) const { os << indent << "Size: " << static_cast::PrintType>(m_Size) << std::endl; os << indent << "Radius: " << static_cast::PrintType>(m_Radius) << std::endl; os << indent << "StrideTable: [ "; for (DimensionValueType i = 0; i < VDimension; ++i) { os << indent.GetNextIndent() << m_StrideTable[i] << ' '; } os << ']' << std::endl; os << indent << "OffsetTable: [ "; for (DimensionValueType i = 0; i < m_OffsetTable.size(); ++i) { os << indent.GetNextIndent() << m_OffsetTable[i] << ' '; } os << ']' << std::endl; } } // namespace itk #endif