vtf-logo

Edge.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00008 #if !defined(__cpt_Edge_h__)
00009 #define __cpt_Edge_h__
00010 
00011 #include "defs.h"
00012 
00013 #include "../ads/array/FixedArray.h"
00014 
00015 #include "../geom/grid/RegularGrid.h"
00016 #include "../geom/kernel/BBox.h"
00017 #include "../geom/kernel/SegmentMath.h"
00018 #include "../geom/polytope/IndexedEdgePolyhedron.h"
00019 
00020 #include <vector>
00021 
00022 #include <cmath>
00023 
00024 BEGIN_NAMESPACE_CPT
00025 
00026 template<int N, typename T = double>
00027 class Edge;
00028 
00030 template<typename T>
00031 class Edge<3,T> {
00032 public:
00033         
00034   //
00035   // Public types.
00036   //
00037         
00039   typedef T Number;
00040         
00042   typedef ads::FixedArray<3,T> Point;
00043         
00045   typedef geom::BBox<3,Number> BBox;
00046         
00048   typedef geom::RegularGrid<3,Number> Grid;
00049         
00051   typedef geom::IndexedEdgePolyhedron<Number> Polyhedron;
00052 
00053 private:
00054                 
00055   //
00056   // Private types.
00057   //
00058                 
00060   typedef geom::SegmentMath<3,Number> Segment;
00061         
00062 private:
00063                 
00064   //
00065   // Data
00066   //
00067                 
00069   Segment _segment;
00070         
00072   Point _leftFaceNormal, _rightFaceNormal;
00073         
00075 
00076   Point _leftSideNormal, _rightSideNormal;
00077         
00079   int _adjacentFaceIndex;
00080         
00082   int _signOfDistance;
00083         
00085   Number _epsilon;
00086         
00087 public:
00088                 
00089   //-------------------------------------------------------------------------
00091 
00092                 
00094   Edge() :
00095     _segment(),
00096     _leftFaceNormal(),
00097     _rightFaceNormal(),
00098     _leftSideNormal(),
00099     _rightSideNormal(),
00100     _adjacentFaceIndex(),
00101     _signOfDistance(),
00102     _epsilon()
00103   {}
00104         
00106   Edge(const Point& source, const Point& target, 
00107        const Point& leftNormal, const Point& rightNormal, 
00108        const int adjacentFaceIndex);
00109         
00111   void
00112   make(const Point& source, const Point& target, 
00113        const Point& leftNormal, const Point& rightNormal, 
00114        const int adjacentFaceIndex);
00115         
00117   Edge(const Edge& other);
00118         
00120   Edge& 
00121   operator=(const Edge& other);
00122         
00124   ~Edge()
00125   {}
00126         
00128   //-------------------------------------------------------------------------
00130 
00131         
00132   const Point& 
00133   getSource() const { 
00134     return _segment.getSource(); 
00135   }
00136         
00137   const Point& 
00138   getTarget() const { 
00139     return _segment.getTarget(); 
00140   }
00141         
00142   const Point& 
00143   getTangent() const { 
00144     return _segment.getTangent(); 
00145   }
00146         
00147   Number
00148   getLength() const { 
00149     return _segment.getLength(); 
00150   }
00151         
00152   const Point& 
00153   getLeftFaceNormal() const { 
00154     return _leftFaceNormal; 
00155   }
00156         
00157   const Point& 
00158   getRightFaceNormal() const { 
00159     return _rightFaceNormal; 
00160   }
00161         
00162   const Point& 
00163   getLeftSideNormal() const { 
00164     return _leftSideNormal; 
00165   }
00166         
00167   const Point& 
00168   getRightSideNormal() const { 
00169     return _rightSideNormal; 
00170   }
00171         
00172   int 
00173   getFaceIndex() const { 
00174     return _adjacentFaceIndex; 
00175   }
00176         
00177   int 
00178   getSignOfDistance() const
00179   { 
00180     return _signOfDistance; 
00181   }
00182         
00184   //-------------------------------------------------------------------------
00186 
00187         
00189   bool 
00190   isValid() const;
00191         
00193   Number 
00194   computeDistance(const Point& p) const;
00195         
00197   Number
00198   computeDistanceChecked(const Point& p) const;
00199         
00201   Number 
00202   computeDistanceUnsigned(const Point& p) const;
00203         
00205   Number 
00206   computeDistanceUnsignedChecked(const Point& p) const;
00207         
00208         
00209         
00211   Number 
00212   computeClosestPoint(const Point& p, Point* cp) const;
00213         
00215   Number 
00216   computeClosestPointChecked(const Point& p, Point* cp) const;
00217         
00219   Number 
00220   computeClosestPointUnsigned(const Point& p, Point* cp) const;
00221         
00223   Number 
00224   computeClosestPointUnsignedChecked(const Point& p, Point* cp) const;
00225         
00226         
00227         
00229   Number 
00230   computeGradient(const Point& p, Point* grad) const;
00231         
00233   Number 
00234   computeGradientChecked(const Point& p, Point* grad) const;
00235         
00237   Number 
00238   computeGradientUnsigned(const Point& p, Point* grad) const;
00239         
00241   Number 
00242   computeGradientUnsignedChecked(const Point& p, Point* grad) const;
00243         
00244         
00245         
00247   Number 
00248   computeClosestPointAndGradient(const Point& p, Point* cp, 
00249                                  Point* grad) const;
00250         
00252   Number 
00253   computeClosestPointAndGradientChecked(const Point& p, Point* cp, 
00254                                         Point* grad) const;
00255         
00257   Number 
00258   computeClosestPointAndGradientUnsigned(const Point& p, Point* cp, 
00259                                          Point* grad) const;
00260         
00262   Number 
00263   computeClosestPointAndGradientUnsignedChecked(const Point& p, Point* cp,
00264                                                 Point* grad) const;
00265         
00266         
00268   void 
00269   buildCharacteristicPolyhedron(Polyhedron* polyhedron, 
00270                                 Number height) const;
00271         
00273   void 
00274   buildCharacteristicPolyhedronUnsigned(Polyhedron* polyhedron, 
00275                                         Number height) const;
00276         
00278         
00279 private:
00280                 
00282   bool 
00283   isInside(const Point& pt, Number delta) const;
00284         
00286   bool 
00287   isInside(const Point& p) const { 
00288     return isInside(p, _epsilon);
00289   }
00290         
00291         
00292 };
00293 
00295 
00296 template<typename T>
00297 bool 
00298 operator==(const Edge<3,T>& a, const Edge<3,T>& b);
00299 
00301 
00302 template<typename T>
00303 bool 
00304 operator!=(const Edge<3,T>& a, const Edge<3,T>& b);
00305 
00307 
00308 template<typename T>
00309 std::ostream& 
00310 operator<<(std::ostream& out, const Edge<3,T>& edge);
00311 
00312 END_NAMESPACE_CPT
00313 
00314 #define __cpt_Edge_ipp__
00315 #include "Edge.ipp"
00316 #undef __cpt_Edge_ipp__
00317 
00318 #endif

Generated on Fri Aug 24 12:55:43 2007 for Closest Point Transform by  doxygen 1.4.7