00001
00002
00008 #if !defined(__geom_IndexedEdgePolyhedron_h__)
00009 #define __geom_IndexedEdgePolyhedron_h__
00010
00011
00012 #if defined(DEBUG_geom) && !defined(DEBUG_IndexedEdgePolyhedron)
00013 #define DEBUG_IndexedEdgePolyhedron
00014 #endif
00015
00016 #include "../kernel/BBox.h"
00017
00018 #include <vector>
00019
00020 BEGIN_NAMESPACE_GEOM
00021
00023
00030 template<typename T = double>
00031 class IndexedEdgePolyhedron {
00032
00033
00034
00035
00036 public:
00037
00039 typedef T Number;
00041 typedef int SizeType;
00043 typedef ads::FixedArray<3,Number> Point;
00045 typedef ads::FixedArray<2,int> IndexedEdge;
00046
00047
00048
00049
00050
00051 private:
00052
00054 typedef std::vector<Point> VertexContainer;
00055
00057 typedef std::vector<IndexedEdge> EdgeContainer;
00058
00059
00060
00061
00062
00063 public:
00064
00066 typedef typename VertexContainer::const_iterator VertexConstIterator;
00068 typedef typename VertexContainer::iterator VertexIterator;
00070 typedef typename EdgeContainer::const_iterator EdgeConstIterator;
00072 typedef typename EdgeContainer::iterator EdgeIterator;
00073
00074
00075
00076
00077
00078 private:
00079
00081 VertexContainer _vertices;
00082
00084 EdgeContainer _edges;
00085
00086 public:
00087
00088
00090
00091
00093 IndexedEdgePolyhedron() :
00094 _vertices(),
00095 _edges()
00096 {}
00097
00099 IndexedEdgePolyhedron(const IndexedEdgePolyhedron& other) :
00100 _vertices(other._vertices),
00101 _edges(other._edges)
00102 {}
00103
00105 IndexedEdgePolyhedron&
00106 operator=(const IndexedEdgePolyhedron& other);
00107
00109 ~IndexedEdgePolyhedron()
00110 {}
00111
00113
00115
00116
00118 void
00119 computeBBox(BBox<3,Number>* bb) const;
00120
00122
00124
00125
00127 SizeType
00128 getVerticesSize() const {
00129 return SizeType(_vertices.size());
00130 }
00131
00133 SizeType
00134 getEdgesSize() const {
00135 return SizeType(_edges.size());
00136 }
00137
00139 const Point&
00140 getVertex(const int n) const {
00141 return _vertices[n];
00142 }
00143
00145 const IndexedEdge&
00146 getEdge(const int n) const {
00147 return _edges[n];
00148 }
00149
00151 const Point&
00152 getEdgeSource(const int n) const {
00153 return _vertices[_edges[n][0]];
00154 }
00155
00157 const Point&
00158 getEdgeTarget(const int n) const {
00159 return _vertices[_edges[n][1]];
00160 }
00161
00163
00165
00166
00167
00168 VertexIterator
00169 getVerticesBeginning() {
00170 return _vertices.begin();
00171 }
00172
00173
00174 VertexIterator
00175 getVerticesEnd() {
00176 return _vertices.end();
00177 }
00178
00179
00180 EdgeIterator
00181 getEdgesBeginning() {
00182 return _edges.begin();
00183 }
00184
00185
00186 EdgeIterator
00187 getEdgesEnd() {
00188 return _edges.end();
00189 }
00190
00191
00192 #if 0
00193
00194 std::vector<Point>&
00195 vertices() {
00196 return _vertices;
00197 }
00198
00200 std::vector<IndexedEdge>&
00201 edges() {
00202 return _edges;
00203 }
00204 #endif
00205
00207 void
00208 insertVertex(const Point& x) {
00209 _vertices.push_back(x);
00210 }
00211
00213 void
00214 insertEdge(const int i, const int j) {
00215 #ifdef DEBUG_IndexedEdgePolyhedron
00216 assert(0 <= i && i < getVerticesSize() &&
00217 0 <= j && j < getVerticesSize());
00218 #endif
00219 _edges.push_back(IndexedEdge(i, j));
00220 }
00221
00223 void
00224 clear() {
00225 _vertices.clear();
00226 _edges.clear();
00227 }
00228
00230
00232
00233 bool
00234 isEqualTo(const IndexedEdgePolyhedron& x) const {
00235 return _vertices == x._vertices && _edges == x._edges;
00236 }
00237
00239
00240 };
00241
00242
00243
00244
00245
00246
00247
00249
00250 template<typename T>
00251 inline
00252 bool
00253 operator==(const IndexedEdgePolyhedron<T>& a,
00254 const IndexedEdgePolyhedron<T>& b) {
00255 return a.isEqualTo(b);
00256 }
00257
00259
00260 template<typename T>
00261 inline
00262 bool
00263 operator!=(const IndexedEdgePolyhedron<T>& a,
00264 const IndexedEdgePolyhedron<T>& b) {
00265 return !(a == b);
00266 }
00267
00268 END_NAMESPACE_GEOM
00269
00270 #define __geom_IndexedEdgePolyhedron_ipp__
00271 #include "IndexedEdgePolyhedron.ipp"
00272 #undef __geom_IndexedEdgePolyhedron_ipp__
00273
00274 #endif