ITK  5.2.0
Insight Toolkit
itkPoint.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkPoint_h
19 #define itkPoint_h
20 
21 
22 #include "itkNumericTraits.h"
23 #include "itkVector.h"
24 
25 #include "vnl/vnl_vector_ref.h"
26 #include "itkMath.h"
27 
28 namespace itk
29 {
52 template <typename TCoordRep, unsigned int NPointDimension = 3>
53 class ITK_TEMPLATE_EXPORT Point : public FixedArray<TCoordRep, NPointDimension>
54 {
55 public:
56 
58  using Self = Point;
60 
63  using ValueType = TCoordRep;
64  using CoordRepType = TCoordRep;
65 
67 
69  static constexpr unsigned int PointDimension = NPointDimension;
70 
73  using Iterator = typename BaseArray::Iterator;
75 
77  static unsigned int
79  {
80  return NPointDimension;
81  }
82 
85 
87  Point() = default;
88  Point(const Point &) = default;
89  Point(Point &&) = default;
90  Point &
91  operator=(const Point &) = default;
92  Point &
93  operator=(Point &&) = default;
94  ~Point() = default;
95 
97  template <typename TPointValueType>
99  : BaseArray(r)
100  {}
101 
103  template <typename TPointValueType>
104  Point(const TPointValueType r[NPointDimension])
105  : BaseArray(r)
106  {}
107  Point(const ValueType r[NPointDimension])
108  : BaseArray(r)
109  {}
110 
112  template <typename TPointValueType>
113  Point(const TPointValueType & v)
114  : BaseArray(v)
115  {}
116  Point(const ValueType & v)
117  : BaseArray(v)
118  {}
120 
122  explicit Point(const std::array<ValueType, NPointDimension> & stdArray)
123  : BaseArray(stdArray)
124  {}
125 
127  Point &
128  operator=(const ValueType r[NPointDimension]);
129 
131  bool
132  operator==(const Self & pt) const
133  {
134  bool same = true;
135 
136  for (unsigned int i = 0; i < NPointDimension && same; ++i)
137  {
138  same = (Math::ExactlyEquals((*this)[i], pt[i]));
139  }
140  return same;
141  }
142 
144  bool
145  operator!=(const Self & pt) const
146  {
147  bool same = true;
148 
149  for (unsigned int i = 0; i < NPointDimension && same; ++i)
150  {
151  same = (Math::ExactlyEquals((*this)[i], pt[i]));
152  }
153  return !same;
154  }
155 
157  const Self &
158  operator+=(const VectorType & vec);
159 
161  const Self &
162  operator-=(const VectorType & vec);
163 
165  VectorType
166  operator-(const Self & pnt) const;
167 
169  Self
170  operator+(const VectorType & vec) const;
171 
173  Self
174  operator-(const VectorType & vec) const;
175 
177  VectorType
178  GetVectorFromOrigin() const;
179 
181  vnl_vector_ref<TCoordRep>
182  GetVnlVector();
183 
185  vnl_vector<TCoordRep>
186  GetVnlVector() const;
187 
199  void
200  SetToMidPoint(const Self &, const Self &);
201 
228  void
229  SetToBarycentricCombination(const Self & A, const Self & B, double alpha);
231 
247  void
248  SetToBarycentricCombination(const Self & A, const Self & B, const Self & C, double weightA, double weightB);
250 
263  void
264  SetToBarycentricCombination(const Self * P, const double * weights, unsigned int N);
266 
269  template <typename TCoordRepB>
270  void
272  {
273  for (unsigned int i = 0; i < NPointDimension; i++)
274  {
275  (*this)[i] = static_cast<TCoordRep>(pa[i]);
276  }
277  }
279 
284  template <typename TCoordRepB>
285  RealType
287  {
289 
290  for (unsigned int i = 0; i < NPointDimension; i++)
291  {
292  const auto component = static_cast<RealType>(pa[i]);
293  const RealType difference = static_cast<RealType>((*this)[i]) - component;
294  sum += difference * difference;
295  }
296  return sum;
297  }
298 
302  template <typename TCoordRepB>
303  RealType
305  {
306  const double distance = std::sqrt(static_cast<double>(this->SquaredEuclideanDistanceTo(pa)));
307 
308  return static_cast<RealType>(distance);
309  }
310 };
311 
312 template <typename T, unsigned int NPointDimension>
313 std::ostream &
314 operator<<(std::ostream & os, const Point<T, NPointDimension> & v);
315 
316 template <typename T, unsigned int NPointDimension>
317 std::istream &
318 operator>>(std::istream & is, Point<T, NPointDimension> & v);
319 
346 template <typename TPointContainer, typename TWeightContainer>
347 class ITK_TEMPLATE_EXPORT BarycentricCombination
348 {
349 public:
350 
352  using PointContainerType = TPointContainer;
353  using PointContainerPointer = typename PointContainerType::Pointer;
354  using PointType = typename PointContainerType::Element;
355  using WeightContainerType = TWeightContainer;
356 
357  BarycentricCombination() = default;
358  ~BarycentricCombination() = default;
359 
360  static PointType
361  Evaluate(const PointContainerPointer & points, const WeightContainerType & weights);
362 };
363 
364 
365 template <typename TCoordRep, unsigned int NPointDimension>
366 inline void
368 {
369  a.swap(b);
370 }
371 
372 } // end namespace itk
373 
374 #ifndef ITK_MANUAL_INSTANTIATION
375 # include "itkPoint.hxx"
376 #endif
377 
378 #endif
itk::Point< double, Self::ImageDimension >::CoordRepType
double CoordRepType
Definition: itkPoint.h:64
itk::BarycentricCombination
Computes the barycentric combination of an array of N points.
Definition: itkPoint.h:347
itk::BarycentricCombination::WeightContainerType
TWeightContainer WeightContainerType
Definition: itkPoint.h:355
itk::operator<<
std::ostream & operator<<(std::ostream &os, const Array< TValue > &arr)
Definition: itkArray.h:213
itk::Point::SquaredEuclideanDistanceTo
RealType SquaredEuclideanDistanceTo(const Point< TCoordRepB, NPointDimension > &pa) const
Definition: itkPoint.h:286
itk::Point::Point
Point(const std::array< ValueType, NPointDimension > &stdArray)
Definition: itkPoint.h:122
itk::GTest::TypedefsAndConstructors::Dimension2::VectorType
ImageBaseType::SpacingType VectorType
Definition: itkGTestTypedefsAndConstructors.h:53
itk::Math::ExactlyEquals
bool ExactlyEquals(const TInput1 &x1, const TInput2 &x2)
Return the result of an exact comparison between two scalar values of potentially different types.
Definition: itkMath.h:723
itk::swap
void swap(Array< T > &a, Array< T > &b)
Definition: itkArray.h:239
itk::Vector
A templated class holding a n-Dimensional vector.
Definition: itkVector.h:62
itk::operator-
ConstNeighborhoodIterator< TImage > operator-(const ConstNeighborhoodIterator< TImage > &it, const typename ConstNeighborhoodIterator< TImage >::OffsetType &ind)
Definition: itkConstNeighborhoodIterator.h:678
itk::Point::Point
Point(const TPointValueType &v)
Definition: itkPoint.h:113
itk::Point::GetPointDimension
static unsigned int GetPointDimension()
Definition: itkPoint.h:78
itk::FixedArray< double, NPointDimension >::ConstIterator
const ValueType * ConstIterator
Definition: itkFixedArray.h:71
itk::Point::Point
Point(const TPointValueType r[NPointDimension])
Definition: itkPoint.h:104
itk::Point< double, Self::ImageDimension >::RealType
typename NumericTraits< ValueType >::RealType RealType
Definition: itkPoint.h:66
itk::BarycentricCombination::PointType
typename PointContainerType::Element PointType
Definition: itkPoint.h:354
itk::Point::Point
Point(const Point< TPointValueType, NPointDimension > &r)
Definition: itkPoint.h:98
itk::FixedArray
Simulate a standard C array with copy semantics.
Definition: itkFixedArray.h:52
itk::NumericTraits::ZeroValue
static T ZeroValue()
Definition: itkNumericTraits.h:148
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itk::BarycentricCombination::PointContainerPointer
typename PointContainerType::Pointer PointContainerPointer
Definition: itkPoint.h:353
itk::Point::EuclideanDistanceTo
RealType EuclideanDistanceTo(const Point< TCoordRepB, NPointDimension > &pa) const
Definition: itkPoint.h:304
itkVector.h
itk::FixedArray< TCoordRep, NPointDimension >::swap
void swap(FixedArray &other)
Definition: itkFixedArray.h:441
itk::operator+
ConstNeighborhoodIterator< TImage > operator+(const ConstNeighborhoodIterator< TImage > &it, const typename ConstNeighborhoodIterator< TImage >::OffsetType &ind)
Definition: itkConstNeighborhoodIterator.h:660
itkNumericTraits.h
itk::Point
A templated class holding a geometric point in n-Dimensional space.
Definition: itkPoint.h:53
itk::operator>>
std::istream & operator>>(std::istream &is, Point< T, NPointDimension > &v)
itk::Point::CastFrom
void CastFrom(const Point< TCoordRepB, NPointDimension > &pa)
Definition: itkPoint.h:271
itk::Point::Point
Point(const ValueType &v)
Definition: itkPoint.h:116
itk::NumericTraits::RealType
double RealType
Definition: itkNumericTraits.h:84
itk::BarycentricCombination::PointContainerType
TPointContainer PointContainerType
Definition: itkPoint.h:352
itk::Point::operator==
bool operator==(const Self &pt) const
Definition: itkPoint.h:132
itk::Point::operator!=
bool operator!=(const Self &pt) const
Definition: itkPoint.h:145
itkMath.h
itk::Point::Point
Point(const ValueType r[NPointDimension])
Definition: itkPoint.h:107
itk::FixedArray< double, NPointDimension >::Iterator
ValueType * Iterator
Definition: itkFixedArray.h:68
itk::FixedArray< double, NPointDimension >::ValueType
double ValueType
Definition: itkFixedArray.h:62