ITK  4.0.0
Insight Segmentation and Registration Toolkit
itkPoint.h
Go to the documentation of this file.
00001 /*=========================================================================
00002  *
00003  *  Copyright Insight Software Consortium
00004  *
00005  *  Licensed under the Apache License, Version 2.0 (the "License");
00006  *  you may not use this file except in compliance with the License.
00007  *  You may obtain a copy of the License at
00008  *
00009  *         http://www.apache.org/licenses/LICENSE-2.0.txt
00010  *
00011  *  Unless required by applicable law or agreed to in writing, software
00012  *  distributed under the License is distributed on an "AS IS" BASIS,
00013  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  *  See the License for the specific language governing permissions and
00015  *  limitations under the License.
00016  *
00017  *=========================================================================*/
00018 #ifndef __itkPoint_h
00019 #define __itkPoint_h
00020 
00021 
00022 #include "itkNumericTraits.h"
00023 #include "itkVector.h"
00024 
00025 #include "vnl/vnl_vector_ref.h"
00026 
00027 namespace itk
00028 {
00050 template< class TCoordRep, unsigned int NPointDimension = 3 >
00051 class Point:public FixedArray< TCoordRep, NPointDimension >
00052 {
00053 public:
00055   typedef Point                                    Self;
00056   typedef FixedArray< TCoordRep, NPointDimension > Superclass;
00057 
00060   typedef TCoordRep ValueType;
00061   typedef TCoordRep CoordRepType;
00062 
00063   typedef typename NumericTraits< ValueType >::RealType RealType;
00064 
00066   itkStaticConstMacro(PointDimension, unsigned int, NPointDimension);
00067 
00069   typedef FixedArray< TCoordRep, NPointDimension > BaseArray;
00070   typedef typename BaseArray::Iterator             Iterator;
00071   typedef typename BaseArray::ConstIterator        ConstIterator;
00072 
00074   static unsigned int GetPointDimension()
00075   { return NPointDimension; }
00076 
00078   typedef Vector< ValueType, NPointDimension > VectorType;
00079 
00081   Point() {}
00082 
00084   template< class TPointValueType >
00085   Point(const Point< TPointValueType, NPointDimension > & r):BaseArray(r) {}
00086   Point(const ValueType r[NPointDimension]):BaseArray(r) {}
00087   Point(const ValueType & v):BaseArray(v) {}
00089 
00091   Point & operator=(const Self & r);
00092 
00093   Point & operator=(const ValueType r[NPointDimension]);
00094 
00096   bool
00097   operator==(const Self & pt) const
00098   {
00099     bool same = true;
00100 
00101     for ( unsigned int i = 0; i < NPointDimension && same; i++ )
00102           { same = ( ( *this )[i] == pt[i] ); }
00103     return same;
00104   }
00105 
00107   bool
00108   operator!=(const Self & pt) const
00109   {
00110     bool same = true;
00111 
00112     for ( unsigned int i = 0; i < NPointDimension && same; i++ )
00113           { same = ( ( *this )[i] == pt[i] ); }
00114     return !same;
00115   }
00116 
00118   const Self & operator+=(const VectorType & vec);
00119 
00121   const Self & operator-=(const VectorType & vec);
00122 
00124   VectorType operator-(const Self & pnt) const;
00125 
00127   Self operator+(const VectorType & vec) const;
00128 
00130   Self operator-(const VectorType & vec) const;
00131 
00133   VectorType GetVectorFromOrigin() const;
00134 
00136   vnl_vector_ref< TCoordRep > GetVnlVector(void);
00137 
00139   vnl_vector< TCoordRep > GetVnlVector(void) const;
00140 
00143   vnl_vector_ref< TCoordRep > Get_vnl_vector(void);
00144 
00147   vnl_vector< TCoordRep > Get_vnl_vector(void) const;
00148 
00160   void SetToMidPoint(const Self &, const Self &);
00161 
00188   void SetToBarycentricCombination(const Self & A, const Self & B, double alpha);
00190 
00206   void SetToBarycentricCombination(const Self & A, const Self & B, const Self & C,
00207                                    double weightA,  double weightB);
00209 
00222   void SetToBarycentricCombination(const Self *P, const double *weights, unsigned int N);
00224 
00227   template< typename TCoordRepB >
00228   void CastFrom(const Point< TCoordRepB, NPointDimension > & pa)
00229   {
00230     for ( unsigned int i = 0; i < NPointDimension; i++ )
00231       {
00232       ( *this )[i] = static_cast< TCoordRep >( pa[i] );
00233       }
00234   }
00236 
00241   template< typename TCoordRepB >
00242   RealType SquaredEuclideanDistanceTo(const Point< TCoordRepB, NPointDimension > & pa) const
00243   {
00244     RealType sum = NumericTraits< RealType >::Zero;
00245 
00246     for ( unsigned int i = 0; i < NPointDimension; i++ )
00247       {
00248       const RealType component =  static_cast< RealType >( pa[i] );
00249       const RealType difference = static_cast< RealType >( ( *this )[i] ) - component;
00250       sum += difference * difference;
00251       }
00252     return sum;
00253   }
00254 
00258   template< typename TCoordRepB >
00259   RealType EuclideanDistanceTo(const Point< TCoordRepB, NPointDimension > & pa) const
00260   {
00261     const double distance = vcl_sqrt(
00262       static_cast< double >( this->SquaredEuclideanDistanceTo(pa) ) );
00263 
00264     return static_cast< RealType >( distance );
00265   }
00266 };
00267 
00268 template< class T, unsigned int NPointDimension >
00269 ITK_EXPORT std::ostream & operator<<(std::ostream & os,
00270                                      const Point< T, NPointDimension > & v);
00271 
00272 template< class T, unsigned int NPointDimension >
00273 ITK_EXPORT std::istream & operator>>(std::istream & is,
00274                                      Point< T, NPointDimension > & v);
00275 
00301 template< class TPointContainer, class TWeightContainer >
00302 ITK_EXPORT class BarycentricCombination
00303 {
00304 public:
00306   typedef TPointContainer                      PointContainerType;
00307   typedef typename PointContainerType::Pointer PointContainerPointer;
00308   typedef typename PointContainerType::Element PointType;
00309   typedef TWeightContainer                     WeightContainerType;
00310 
00311   BarycentricCombination() {}
00312   ~BarycentricCombination() {}
00313 
00314   static PointType Evaluate(
00315     const PointContainerPointer & points,
00316     const WeightContainerType & weights);
00317 };
00318 }  // end namespace itk
00319 
00320 // Define instantiation macro for this template.
00321 #define ITK_TEMPLATE_Point(_, EXPORT, TypeX, TypeY)                                  \
00322   namespace itk                                                                      \
00323   {                                                                                  \
00324   _( 2 ( class EXPORT Point< ITK_TEMPLATE_2 TypeX > ) )                              \
00325   _( 1 ( EXPORT std::ostream & operator<<(std::ostream &,                            \
00326                                           const Point< ITK_TEMPLATE_2 TypeX > &) ) ) \
00327   _( 1 ( EXPORT std::istream & operator>>(std::istream &,                            \
00328                                           Point< ITK_TEMPLATE_2 TypeX > &) ) )       \
00329   namespace Templates                                                                \
00330   {                                                                                  \
00331   typedef Point< ITK_TEMPLATE_2 TypeX > Point##TypeY;                              \
00332   }                                                                                  \
00333   }
00334 
00335 #if ITK_TEMPLATE_EXPLICIT
00336 #include "Templates/itkPoint+-.h"
00337 #endif
00338 
00339 #if ITK_TEMPLATE_TXX
00340 #include "itkPoint.hxx"
00341 #endif
00342 
00343 #endif
00344