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));
220 template <
typename TCoordRep,
typename TIndexRep>
221 ITK_NODISCARD(
"Call the overload which has the point as the only parameter and returns the index")
222 bool TransformPhysicalPointToContinuousIndex(const
Point<TCoordRep, 3> &
point,
225 index = this->TransformPhysicalPointToContinuousIndex<TIndexRep>(
point);
228 const bool isInside = this->GetLargestPossibleRegion().IsInside(index);
236 template <
typename TCoordRep>
240 const RegionType region = this->GetLargestPossibleRegion();
241 const double maxAzimuth = region.
GetSize(0) - 1;
242 const double maxElevation = region.
GetSize(1) - 1;
257 index[0] = static_cast<IndexValueType>((azimuth / m_AzimuthAngularSeparation) + (maxAzimuth / 2.0));
258 index[1] = static_cast<IndexValueType>((elevation / m_ElevationAngularSeparation) + (maxElevation / 2.0));
259 index[2] = static_cast<IndexValueType>(((radius - m_FirstSampleDistance) / m_RadiusSampleSize));
271 template <
typename TCoordRep>
272 ITK_NODISCARD(
"Call the overload which has the point as the only parameter and returns the index")
275 index = this->TransformPhysicalPointToIndex(
point);
278 const bool isInside = this->GetLargestPossibleRegion().IsInside(index);
287 template <
typename TCoordRep,
typename TIndexRep>
292 const RegionType region = this->GetLargestPossibleRegion();
293 const double maxAzimuth = region.
GetSize(0) - 1;
294 const double maxElevation = region.
GetSize(1) - 1;
298 const TCoordRep azimuth = (index[0] - (maxAzimuth / 2.0)) * m_AzimuthAngularSeparation;
299 const TCoordRep elevation = (index[1] - (maxElevation / 2.0)) * m_ElevationAngularSeparation;
300 const TCoordRep radius = (index[2] * m_RadiusSampleSize) + m_FirstSampleDistance;
303 const TCoordRep tanOfAzimuth = std::tan(azimuth);
304 const TCoordRep tanOfElevation = std::tan(elevation);
307 static_cast<TCoordRep>(radius / std::sqrt(1 + tanOfAzimuth * tanOfAzimuth + tanOfElevation * tanOfElevation));
308 point[1] = static_cast<TCoordRep>(
point[2] * tanOfElevation);
309 point[0] = static_cast<TCoordRep>(
point[2] * tanOfAzimuth);
313 template <
typename TCoordRep,
typename TIndexRep>
318 this->TransformContinuousIndexToPhysicalPoint(index,
point);
328 template <
typename TCoordRep>
332 const RegionType region = this->GetLargestPossibleRegion();
333 const double maxAzimuth = region.
GetSize(0) - 1;
334 const double maxElevation = region.
GetSize(1) - 1;
338 const TCoordRep azimuth = (static_cast<double>(index[0]) - (maxAzimuth / 2.0)) * m_AzimuthAngularSeparation;
339 const TCoordRep elevation = (static_cast<double>(index[1]) - (maxElevation / 2.0)) * m_ElevationAngularSeparation;
340 const TCoordRep radius = (static_cast<double>(index[2]) * m_RadiusSampleSize) + m_FirstSampleDistance;
343 const TCoordRep tanOfAzimuth = std::tan(azimuth);
344 const TCoordRep tanOfElevation = std::tan(elevation);
347 static_cast<TCoordRep>(radius / std::sqrt(1.0 + tanOfAzimuth * tanOfAzimuth + tanOfElevation * tanOfElevation));
348 point[1] = static_cast<TCoordRep>(
point[2] * tanOfElevation);
349 point[0] = static_cast<TCoordRep>(
point[2] * tanOfAzimuth);
353 template <
typename TCoordRep>
358 this->TransformIndexToPhysicalPoint(index,
point);
364 itkSetMacro(AzimuthAngularSeparation,
double);
367 itkSetMacro(ElevationAngularSeparation,
double);
370 itkSetMacro(RadiusSampleSize,
double);
373 itkSetMacro(FirstSampleDistance,
double);
375 template <
typename TCoordRep>
379 template <
typename TCoordRep>
399 NeighborhoodAccessorFunctorType
406 const NeighborhoodAccessorFunctorType
415 m_RadiusSampleSize = 1;
416 m_AzimuthAngularSeparation = 1 * (2.0 *
itk::Math::pi / 360.0);
418 m_ElevationAngularSeparation = 1 * (2.0 *
itk::Math::pi / 360.0);
420 m_FirstSampleDistance = 0;
425 PrintSelf(std::ostream & os,
Indent indent)
const override;
428 double m_AzimuthAngularSeparation{};
429 double m_ElevationAngularSeparation{};
430 double m_RadiusSampleSize{};
431 double m_FirstSampleDistance{};
435 #ifndef ITK_MANUAL_INSTANTIATION
436 # include "itkPhasedArray3DSpecialCoordinatesImage.hxx"