18#ifndef itkPhasedArray3DSpecialCoordinatesImage_h
19#define itkPhasedArray3DSpecialCoordinatesImage_h
94template <
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;
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"
A templated class holding a point in n-Dimensional image space.
Base class for all data objects in ITK.
Provides a common API for pixel accessors for Image and VectorImage.
Give access to partial aspects a type.
typename IndexType::IndexValueType IndexValueType
An image region represents a structured region of data.
const SizeType & GetSize() const
Defines an itk::Image front-end to a standard C-array.
Control indentation during Print() invocation.
Provides accessor interfaces to Get pixels and is meant to be used on pointers contained within Neigh...
Base class for most ITK classes.
Templated 3D nonrectilinear-coordinate image class for phased-array "range" images.
typename PixelContainer::ConstPointer PixelContainerConstPointer
IndexType TransformPhysicalPointToIndex(const Point< TCoordRep, 3 > &point) const
const NeighborhoodAccessorFunctorType GetNeighborhoodAccessor() const
NeighborhoodAccessorFunctorType GetNeighborhoodAccessor()
~PhasedArray3DSpecialCoordinatesImage() override=default
typename PixelContainer::Pointer PixelContainerPointer
void TransformPhysicalVectorToLocalVector(const FixedArray< TCoordRep, 3 > &, FixedArray< TCoordRep, 3 > &) const
void TransformLocalVectorToPhysicalVector(FixedArray< TCoordRep, 3 > &) const
void TransformContinuousIndexToPhysicalPoint(const ContinuousIndex< TIndexRep, 3 > &index, Point< TCoordRep, 3 > &point) const
AccessorType GetPixelAccessor()
void TransformIndexToPhysicalPoint(const IndexType &index, Point< TCoordRep, 3 > &point) const
ContinuousIndex< TIndexRep, 3 > TransformPhysicalPointToContinuousIndex(const Point< TCoordRep, 3 > &point) const
Point< TCoordRep, 3 > TransformIndexToPhysicalPoint(const IndexType &index) const
PhasedArray3DSpecialCoordinatesImage()
const AccessorType GetPixelAccessor() const
void PrintSelf(std::ostream &os, Indent indent) const override
Point< TCoordRep, 3 > TransformContinuousIndexToPhysicalPoint(const ContinuousIndex< TIndexRep, 3 > &index) const
A templated class holding a geometric point in n-Dimensional space.
Templated n-dimensional nonrectilinear-coordinate image base class.
Implements a weak reference to an object.
SmartPointer< const Self > ConstPointer
SmartPointer< Self > Pointer
ImageBaseType::RegionType RegionType
ImageBaseType::IndexType IndexType
ImageBaseType::PointType PointType
ImageBaseType::SizeType SizeType
static constexpr double pi_over_2
static constexpr double pi
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
*par Constraints *The filter image with at least two dimensions and a vector *length of at least The theory supports extension to scalar but *the implementation of the itk vector classes do not **The template parameter TRealType must be floating point(float or double) or *a user-defined "real" numerical type with arithmetic operations defined *sufficient to compute derivatives. **\par Performance *This filter will automatically multithread if run with *SetUsePrincipleComponents
unsigned long SizeValueType