18 #ifndef itkPhasedArray3DSpecialCoordinatesImage_h
19 #define itkPhasedArray3DSpecialCoordinatesImage_h
94 template <
typename TPixel>
126 using typename Superclass::IOPixelType;
145 static constexpr
unsigned int ImageDimension = 3;
152 using typename Superclass::OffsetType;
172 using typename Superclass::SpacingType;
185 template <
typename TIndexRep,
typename TCoordRep>
189 const RegionType region = this->GetLargestPossibleRegion();
190 const double maxAzimuth = region.
GetSize(0) - 1;
191 const double maxElevation = region.
GetSize(1) - 1;
206 index[0] = static_cast<TCoordRep>((azimuth / m_AzimuthAngularSeparation) + (maxAzimuth / 2.0));
207 index[1] = static_cast<TCoordRep>((elevation / m_ElevationAngularSeparation) + (maxElevation / 2.0));
208 index[2] = static_cast<TCoordRep>(((radius - m_FirstSampleDistance) / m_RadiusSampleSize));
216 template <
typename TCoordRep,
typename TIndexRep>
221 index = this->TransformPhysicalPointToContinuousIndex<TIndexRep>(
point);
224 const bool isInside = this->GetLargestPossibleRegion().IsInside(index);
232 template <
typename TCoordRep>
236 const RegionType region = this->GetLargestPossibleRegion();
237 const double maxAzimuth = region.
GetSize(0) - 1;
238 const double maxElevation = region.
GetSize(1) - 1;
253 index[0] = static_cast<IndexValueType>((azimuth / m_AzimuthAngularSeparation) + (maxAzimuth / 2.0));
254 index[1] = static_cast<IndexValueType>((elevation / m_ElevationAngularSeparation) + (maxElevation / 2.0));
255 index[2] = static_cast<IndexValueType>(((radius - m_FirstSampleDistance) / m_RadiusSampleSize));
263 template <
typename TCoordRep>
267 index = this->TransformPhysicalPointToIndex(
point);
270 const bool isInside = this->GetLargestPossibleRegion().IsInside(index);
279 template <
typename TCoordRep,
typename TIndexRep>
284 const RegionType region = this->GetLargestPossibleRegion();
285 const double maxAzimuth = region.
GetSize(0) - 1;
286 const double maxElevation = region.
GetSize(1) - 1;
290 const TCoordRep azimuth = (index[0] - (maxAzimuth / 2.0)) * m_AzimuthAngularSeparation;
291 const TCoordRep elevation = (index[1] - (maxElevation / 2.0)) * m_ElevationAngularSeparation;
292 const TCoordRep radius = (index[2] * m_RadiusSampleSize) + m_FirstSampleDistance;
295 const TCoordRep tanOfAzimuth = std::tan(azimuth);
296 const TCoordRep tanOfElevation = std::tan(elevation);
299 static_cast<TCoordRep>(radius / std::sqrt(1 + tanOfAzimuth * tanOfAzimuth + tanOfElevation * tanOfElevation));
300 point[1] = static_cast<TCoordRep>(
point[2] * tanOfElevation);
301 point[0] = static_cast<TCoordRep>(
point[2] * tanOfAzimuth);
305 template <
typename TCoordRep,
typename TIndexRep>
310 this->TransformContinuousIndexToPhysicalPoint(index,
point);
320 template <
typename TCoordRep>
324 const RegionType region = this->GetLargestPossibleRegion();
325 const double maxAzimuth = region.
GetSize(0) - 1;
326 const double maxElevation = region.
GetSize(1) - 1;
330 const TCoordRep azimuth = (static_cast<double>(index[0]) - (maxAzimuth / 2.0)) * m_AzimuthAngularSeparation;
331 const TCoordRep elevation = (static_cast<double>(index[1]) - (maxElevation / 2.0)) * m_ElevationAngularSeparation;
332 const TCoordRep radius = (static_cast<double>(index[2]) * m_RadiusSampleSize) + m_FirstSampleDistance;
335 const TCoordRep tanOfAzimuth = std::tan(azimuth);
336 const TCoordRep tanOfElevation = std::tan(elevation);
339 static_cast<TCoordRep>(radius / std::sqrt(1.0 + tanOfAzimuth * tanOfAzimuth + tanOfElevation * tanOfElevation));
340 point[1] = static_cast<TCoordRep>(
point[2] * tanOfElevation);
341 point[0] = static_cast<TCoordRep>(
point[2] * tanOfAzimuth);
345 template <
typename TCoordRep>
350 this->TransformIndexToPhysicalPoint(index,
point);
356 itkSetMacro(AzimuthAngularSeparation,
double);
359 itkSetMacro(ElevationAngularSeparation,
double);
362 itkSetMacro(RadiusSampleSize,
double);
365 itkSetMacro(FirstSampleDistance,
double);
367 template <
typename TCoordRep>
371 template <
typename TCoordRep>
391 NeighborhoodAccessorFunctorType
398 const NeighborhoodAccessorFunctorType
407 m_RadiusSampleSize = 1;
408 m_AzimuthAngularSeparation = 1 * (2.0 *
itk::Math::pi / 360.0);
410 m_ElevationAngularSeparation = 1 * (2.0 *
itk::Math::pi / 360.0);
412 m_FirstSampleDistance = 0;
417 PrintSelf(std::ostream & os,
Indent indent)
const override;
420 double m_AzimuthAngularSeparation{};
421 double m_ElevationAngularSeparation{};
422 double m_RadiusSampleSize{};
423 double m_FirstSampleDistance{};
427 #ifndef ITK_MANUAL_INSTANTIATION
428 # include "itkPhasedArray3DSpecialCoordinatesImage.hxx"