00001
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
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
00057
00058
00060 typedef geom::SegmentMath<3,Number> Segment;
00061
00062 private:
00063
00064
00065
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