29 #ifndef itkCurvilinearArraySpecialCoordinatesImage_h 30 #define itkCurvilinearArraySpecialCoordinatesImage_h 32 #include "itkSpecialCoordinatesImage.h" 34 #include "vnl/vnl_math.h" 35 #include "itkNeighborhoodAccessorFunctor.h" 98 template<
typename TPixel,
unsigned int VDimension >
100 public SpecialCoordinatesImage< TPixel, VDimension >
105 typedef SpecialCoordinatesImage< TPixel, VDimension >
Superclass;
197 virtual void Graft(
const DataObject *data) ITK_OVERRIDE;
203 template<
typename TCoordRep >
205 const Point< TCoordRep, VDimension > & point,
206 ContinuousIndex< TCoordRep, VDimension > & index)
const 208 const RegionType & region = this->GetLargestPossibleRegion();
209 const double maxLateral = region.GetSize(1) - 1;
212 const TCoordRep lateral = std::atan(point[0] / point[1]);
213 const TCoordRep radius = std::sqrt(point[0] * point[0] + point[1] * point[1] );
216 index[0] =
static_cast< TCoordRep
>( ( ( radius - m_FirstSampleDistance )
217 / m_RadiusSampleSize ) );
218 index[1] =
static_cast< TCoordRep
>( ( lateral / m_LateralAngularSeparation )
219 + ( maxLateral / 2.0 ) );
222 const bool isInside = region.IsInside(index);
231 template<
typename TCoordRep >
233 const Point< TCoordRep, VDimension > & point,
234 IndexType & index)
const 236 const RegionType & region = this->GetLargestPossibleRegion();
237 const double maxLateral = region.GetSize(1) - 1;
240 const TCoordRep lateral = std::atan(point[0] / point[1]);
241 const TCoordRep radius = std::sqrt(point[0] * point[0] + point[1] * point[1] );
244 index[0] =
static_cast< IndexValueType
>( ( ( radius - m_FirstSampleDistance )
245 / m_RadiusSampleSize ) );
246 index[1] =
static_cast< IndexValueType
>( ( lateral / m_LateralAngularSeparation )
247 + ( maxLateral / 2.0 ) );
250 const bool isInside = region.IsInside(index);
259 template<
typename TCoordRep >
261 const ContinuousIndex< TCoordRep, VDimension > & index,
262 Point< TCoordRep, VDimension > & point)
const 264 const RegionType & region = this->GetLargestPossibleRegion();
265 const double maxLateral = region.GetSize(1) - 1;
268 const TCoordRep radius = ( index[0] * m_RadiusSampleSize ) + m_FirstSampleDistance;
269 const TCoordRep lateral = ( index[1] - ( maxLateral / 2.0 ) ) * m_LateralAngularSeparation;
272 point[0] =
static_cast< TCoordRep
>( radius * std::sin(lateral) );
273 point[1] =
static_cast< TCoordRep
>( radius * std::cos(lateral) );
281 template<
typename TCoordRep >
283 const IndexType & index,
284 Point< TCoordRep, VDimension > & point)
const 286 const RegionType & region = this->GetLargestPossibleRegion();
287 const double maxLateral = region.GetSize(1) - 1;
290 const TCoordRep radius = ( index[0] * m_RadiusSampleSize ) + m_FirstSampleDistance;
291 const TCoordRep lateral = ( index[1] - ( maxLateral / 2.0 ) ) * m_LateralAngularSeparation;
294 point[0] =
static_cast< TCoordRep
>( radius * std::sin(lateral) );
295 point[1] =
static_cast< TCoordRep
>( radius * std::cos(lateral) );
299 itkSetMacro(LateralAngularSeparation,
double);
300 itkGetConstMacro(LateralAngularSeparation,
double);
303 itkSetMacro(RadiusSampleSize,
double);
304 itkGetConstMacro(RadiusSampleSize,
double);
307 itkSetMacro(FirstSampleDistance,
double);
308 itkGetConstMacro(FirstSampleDistance,
double);
310 template<
typename TCoordRep >
312 FixedArray< TCoordRep, VDimension > & )
const 315 template<
typename TCoordRep >
317 const FixedArray< TCoordRep, VDimension > & ,
318 FixedArray< TCoordRep, VDimension > & )
const 324 m_RadiusSampleSize = 1;
325 m_LateralAngularSeparation = 1 * ( 2.0 * vnl_math::pi / 360.0 );
327 m_FirstSampleDistance = 0;
331 virtual void PrintSelf(std::ostream & os, Indent indent)
const ITK_OVERRIDE;
335 void operator=(
const Self &);
337 double m_LateralAngularSeparation;
338 double m_RadiusSampleSize;
339 double m_FirstSampleDistance;
343 #ifndef ITK_MANUAL_INSTANTIATION 344 #include "itkCurvilinearArraySpecialCoordinatesImage.hxx" void TransformPhysicalVectorToLocalVector(const FixedArray< TCoordRep, VDimension > &, FixedArray< TCoordRep, VDimension > &) const
Superclass::RegionType RegionType
PixelContainer::Pointer PixelContainerPointer
DefaultPixelAccessor< PixelType > AccessorType
WeakPointer< const Self > ConstWeakPointer
virtual void Graft(const DataObject *data) ITK_OVERRIDE
CurvilinearArraySpecialCoordinatesImage()
Superclass::IOPixelType IOPixelType
Superclass::IndexValueType IndexValueType
Superclass::OffsetType OffsetType
CurvilinearArraySpecialCoordinatesImage Self
Templated 2D nonrectilinear-coordinate image class for curvilinear/phased-array "range" images...
Superclass::SizeValueType SizeValueType
void TransformIndexToPhysicalPoint(const IndexType &index, Point< TCoordRep, VDimension > &point) const
Superclass::SizeType SizeType
virtual void PrintSelf(std::ostream &os, Indent indent) const ITK_OVERRIDE
SpecialCoordinatesImage< TPixel, VDimension > Superclass
ImportImageContainer< SizeValueType, PixelType > PixelContainer
Superclass::IndexType IndexType
SmartPointer< const Self > ConstPointer
bool TransformPhysicalPointToContinuousIndex(const Point< TCoordRep, VDimension > &point, ContinuousIndex< TCoordRep, VDimension > &index) const
Get the continuous index from a physical point.
DefaultPixelAccessorFunctor< Self > AccessorFunctorType
bool TransformPhysicalPointToIndex(const Point< TCoordRep, VDimension > &point, IndexType &index) const
Superclass::PointType PointType
PixelContainer::ConstPointer PixelContainerConstPointer
Superclass::SpacingType SpacingType
SmartPointer< Self > Pointer
void TransformLocalVectorToPhysicalVector(FixedArray< TCoordRep, VDimension > &) const
virtual ~CurvilinearArraySpecialCoordinatesImage()
void TransformContinuousIndexToPhysicalPoint(const ContinuousIndex< TCoordRep, VDimension > &index, Point< TCoordRep, VDimension > &point) const
NeighborhoodAccessorFunctor< Self > NeighborhoodAccessorFunctorType
itkStaticConstMacro(ImageDimension, unsigned int, VDimension)