00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef OPENMESH_POLYCONNECTIVITY_HH
00027 #define OPENMESH_POLYCONNECTIVITY_HH
00028
00029 #include <OpenMesh/Core/Mesh/ArrayKernel.hh>
00030 #include <OpenMesh/Core/Mesh/IteratorsT.hh>
00031 #include <OpenMesh/Core/Mesh/CirculatorsT.hh>
00032
00033 namespace OpenMesh
00034 {
00035
00036 class PolyConnectivity : public ArrayKernel
00037 {
00038 public:
00040
00041
00042 static const VertexHandle InvalidVertexHandle;
00044 static const HalfedgeHandle InvalidHalfedgeHandle;
00046 static const EdgeHandle InvalidEdgeHandle;
00048 static const FaceHandle InvalidFaceHandle;
00050
00051 typedef PolyConnectivity This;
00052
00053
00054
00060
00061 typedef Iterators::VertexIterT<This> VertexIter;
00062 typedef Iterators::HalfedgeIterT<This> HalfedgeIter;
00063 typedef Iterators::EdgeIterT<This> EdgeIter;
00064 typedef Iterators::FaceIterT<This> FaceIter;
00065
00066 typedef Iterators::ConstVertexIterT<This> ConstVertexIter;
00067 typedef Iterators::ConstHalfedgeIterT<This> ConstHalfedgeIter;
00068 typedef Iterators::ConstEdgeIterT<This> ConstEdgeIter;
00069 typedef Iterators::ConstFaceIterT<This> ConstFaceIter;
00071
00072
00073
00079
00080 typedef Iterators::VertexVertexIterT<This> VertexVertexIter;
00081 typedef Iterators::VertexOHalfedgeIterT<This> VertexOHalfedgeIter;
00082 typedef Iterators::VertexIHalfedgeIterT<This> VertexIHalfedgeIter;
00083 typedef Iterators::VertexEdgeIterT<This> VertexEdgeIter;
00084 typedef Iterators::VertexFaceIterT<This> VertexFaceIter;
00085 typedef Iterators::FaceVertexIterT<This> FaceVertexIter;
00086 typedef Iterators::FaceHalfedgeIterT<This> FaceHalfedgeIter;
00087 typedef Iterators::FaceEdgeIterT<This> FaceEdgeIter;
00088 typedef Iterators::FaceFaceIterT<This> FaceFaceIter;
00089
00090 typedef Iterators::ConstVertexVertexIterT<This> ConstVertexVertexIter;
00091 typedef Iterators::ConstVertexOHalfedgeIterT<This> ConstVertexOHalfedgeIter;
00092 typedef Iterators::ConstVertexIHalfedgeIterT<This> ConstVertexIHalfedgeIter;
00093 typedef Iterators::ConstVertexEdgeIterT<This> ConstVertexEdgeIter;
00094 typedef Iterators::ConstVertexFaceIterT<This> ConstVertexFaceIter;
00095 typedef Iterators::ConstFaceVertexIterT<This> ConstFaceVertexIter;
00096 typedef Iterators::ConstFaceHalfedgeIterT<This> ConstFaceHalfedgeIter;
00097 typedef Iterators::ConstFaceEdgeIterT<This> ConstFaceEdgeIter;
00098 typedef Iterators::ConstFaceFaceIterT<This> ConstFaceFaceIter;
00100
00101
00102
00107
00108 typedef VertexHandle VHandle;
00109 typedef HalfedgeHandle HHandle;
00110 typedef EdgeHandle EHandle;
00111 typedef FaceHandle FHandle;
00112
00113 typedef VertexIter VIter;
00114 typedef HalfedgeIter HIter;
00115 typedef EdgeIter EIter;
00116 typedef FaceIter FIter;
00117
00118 typedef ConstVertexIter CVIter;
00119 typedef ConstHalfedgeIter CHIter;
00120 typedef ConstEdgeIter CEIter;
00121 typedef ConstFaceIter CFIter;
00122
00123 typedef VertexVertexIter VVIter;
00124 typedef VertexOHalfedgeIter VOHIter;
00125 typedef VertexIHalfedgeIter VIHIter;
00126 typedef VertexEdgeIter VEIter;
00127 typedef VertexFaceIter VFIter;
00128 typedef FaceVertexIter FVIter;
00129 typedef FaceHalfedgeIter FHIter;
00130 typedef FaceEdgeIter FEIter;
00131 typedef FaceFaceIter FFIter;
00132
00133 typedef ConstVertexVertexIter CVVIter;
00134 typedef ConstVertexOHalfedgeIter CVOHIter;
00135 typedef ConstVertexIHalfedgeIter CVIHIter;
00136 typedef ConstVertexEdgeIter CVEIter;
00137 typedef ConstVertexFaceIter CVFIter;
00138 typedef ConstFaceVertexIter CFVIter;
00139 typedef ConstFaceHalfedgeIter CFHIter;
00140 typedef ConstFaceEdgeIter CFEIter;
00141 typedef ConstFaceFaceIter CFFIter;
00143
00144 public:
00145
00146 PolyConnectivity() {}
00147 virtual ~PolyConnectivity() {}
00148
00149 inline static bool is_triangles()
00150 { return false; }
00151
00154 inline void assign_connectivity(const PolyConnectivity& _other)
00155 { ArrayKernel::assign_connectivity(_other); }
00156
00160
00161 inline VertexHandle add_vertex()
00162 { return new_vertex(); }
00163
00165 FaceHandle add_face(const std::vector<VertexHandle>& _vhandles)
00166 { return add_face(&_vhandles.front(), _vhandles.size()); }
00167
00168 FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2)
00169 {
00170 VertexHandle vhs[3] = { _vh0, _vh1, _vh2 };
00171 return add_face(vhs, 3);
00172 }
00173
00174 FaceHandle add_face(VertexHandle _vh0, VertexHandle _vh1, VertexHandle _vh2, VertexHandle _vh3)
00175 {
00176 VertexHandle vhs[4] = { _vh0, _vh1, _vh2, _vh3 };
00177 return add_face(vhs, 4);
00178 }
00179
00180 FaceHandle add_face(const VertexHandle* _vhandles, uint _vhs_size);
00182
00184
00185
00191 void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices = true);
00192
00201 void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true);
00202
00213 void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true);
00214
00216
00220
00222 VertexIter vertices_begin()
00223 { return VertexIter(*this, VertexHandle(0)); }
00225 ConstVertexIter vertices_begin() const
00226 { return ConstVertexIter(*this, VertexHandle(0)); }
00228 VertexIter vertices_end()
00229 { return VertexIter(*this, VertexHandle(n_vertices())); }
00231 ConstVertexIter vertices_end() const
00232 { return ConstVertexIter(*this, VertexHandle(n_vertices())); }
00233
00235 HalfedgeIter halfedges_begin()
00236 { return HalfedgeIter(*this, HalfedgeHandle(0)); }
00238 ConstHalfedgeIter halfedges_begin() const
00239 { return ConstHalfedgeIter(*this, HalfedgeHandle(0)); }
00241 HalfedgeIter halfedges_end()
00242 { return HalfedgeIter(*this, HalfedgeHandle(n_halfedges())); }
00244 ConstHalfedgeIter halfedges_end() const
00245 { return ConstHalfedgeIter(*this, HalfedgeHandle(n_halfedges())); }
00246
00248 EdgeIter edges_begin()
00249 { return EdgeIter(*this, EdgeHandle(0)); }
00251 ConstEdgeIter edges_begin() const
00252 { return ConstEdgeIter(*this, EdgeHandle(0)); }
00254 EdgeIter edges_end()
00255 { return EdgeIter(*this, EdgeHandle(n_edges())); }
00257 ConstEdgeIter edges_end() const
00258 { return ConstEdgeIter(*this, EdgeHandle(n_edges())); }
00259
00261 FaceIter faces_begin()
00262 { return FaceIter(*this, FaceHandle(0)); }
00264 ConstFaceIter faces_begin() const
00265 { return ConstFaceIter(*this, FaceHandle(0)); }
00267 FaceIter faces_end()
00268 { return FaceIter(*this, FaceHandle(n_faces())); }
00270 ConstFaceIter faces_end() const
00271 { return ConstFaceIter(*this, FaceHandle(n_faces())); }
00272
00274
00275
00276
00280
00282 VertexIter vertices_sbegin()
00283 { return VertexIter(*this, VertexHandle(0), true); }
00285 ConstVertexIter vertices_sbegin() const
00286 { return ConstVertexIter(*this, VertexHandle(0), true); }
00287
00289 HalfedgeIter halfedges_sbegin()
00290 { return HalfedgeIter(*this, HalfedgeHandle(0), true); }
00292 ConstHalfedgeIter halfedges_sbegin() const
00293 { return ConstHalfedgeIter(*this, HalfedgeHandle(0), true); }
00294
00296 EdgeIter edges_sbegin()
00297 { return EdgeIter(*this, EdgeHandle(0), true); }
00299 ConstEdgeIter edges_sbegin() const
00300 { return ConstEdgeIter(*this, EdgeHandle(0), true); }
00301
00303 FaceIter faces_sbegin()
00304 { return FaceIter(*this, FaceHandle(0), true); }
00306 ConstFaceIter faces_sbegin() const
00307 { return ConstFaceIter(*this, FaceHandle(0), true); }
00308
00310
00311
00312
00316
00318 VertexVertexIter vv_iter(VertexHandle _vh) {
00319 return VertexVertexIter(*this, _vh); }
00321 VertexIHalfedgeIter vih_iter(VertexHandle _vh)
00322 { return VertexIHalfedgeIter(*this, _vh); }
00324 VertexOHalfedgeIter voh_iter(VertexHandle _vh)
00325 { return VertexOHalfedgeIter(*this, _vh); }
00327 VertexEdgeIter ve_iter(VertexHandle _vh)
00328 { return VertexEdgeIter(*this, _vh); }
00330 VertexFaceIter vf_iter(VertexHandle _vh)
00331 { return VertexFaceIter(*this, _vh); }
00332
00334 ConstVertexVertexIter cvv_iter(VertexHandle _vh) const
00335 { return ConstVertexVertexIter(*this, _vh); }
00337 ConstVertexIHalfedgeIter cvih_iter(VertexHandle _vh) const
00338 { return ConstVertexIHalfedgeIter(*this, _vh); }
00340 ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const
00341 { return ConstVertexOHalfedgeIter(*this, _vh); }
00343 ConstVertexEdgeIter cve_iter(VertexHandle _vh) const
00344 { return ConstVertexEdgeIter(*this, _vh); }
00346 ConstVertexFaceIter cvf_iter(VertexHandle _vh) const
00347 { return ConstVertexFaceIter(*this, _vh); }
00348
00350 FaceVertexIter fv_iter(FaceHandle _fh)
00351 { return FaceVertexIter(*this, _fh); }
00353 FaceHalfedgeIter fh_iter(FaceHandle _fh)
00354 { return FaceHalfedgeIter(*this, _fh); }
00356 FaceEdgeIter fe_iter(FaceHandle _fh)
00357 { return FaceEdgeIter(*this, _fh); }
00359 FaceFaceIter ff_iter(FaceHandle _fh)
00360 { return FaceFaceIter(*this, _fh); }
00361
00363 ConstFaceVertexIter cfv_iter(FaceHandle _fh) const
00364 { return ConstFaceVertexIter(*this, _fh); }
00366 ConstFaceHalfedgeIter cfh_iter(FaceHandle _fh) const
00367 { return ConstFaceHalfedgeIter(*this, _fh); }
00369 ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const
00370 { return ConstFaceEdgeIter(*this, _fh); }
00372 ConstFaceFaceIter cff_iter(FaceHandle _fh) const
00373 { return ConstFaceFaceIter(*this, _fh); }
00375
00379 bool is_boundary(HalfedgeHandle _heh) const
00380 { return ArrayKernel::is_boundary(_heh); }
00381
00384 bool is_boundary(EdgeHandle _eh) const
00385 {
00386 return (is_boundary(halfedge_handle(_eh, 0)) ||
00387 is_boundary(halfedge_handle(_eh, 1)));
00388 }
00390 bool is_boundary(VertexHandle _vh) const
00391 {
00392 HalfedgeHandle heh(halfedge_handle(_vh));
00393 return (!(heh.is_valid() && face_handle(heh).is_valid()));
00394 }
00395
00402 bool is_boundary(FaceHandle _fh, bool _check_vertex=false) const;
00404 bool is_manifold(VertexHandle _vh) const;
00406
00407
00408
00410 inline FaceHandle opposite_face_handle(HalfedgeHandle _heh) const
00411 { return face_handle(opposite_halfedge_handle(_heh)); }
00412
00413
00414
00418 void adjust_outgoing_halfedge(VertexHandle _vh);
00420 HalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const;
00422 uint valence(VertexHandle _vh) const;
00424 uint valence(FaceHandle _fh) const;
00425
00426
00427
00441 void collapse(HalfedgeHandle _heh);
00446 bool is_simple_link(EdgeHandle _eh) const;
00451 bool is_simply_connected(FaceHandle _fh) const;
00464 FaceHandle remove_edge(EdgeHandle _eh);
00468 void reinsert_edge(EdgeHandle _eh);
00478 HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh);
00479
00481 void split(FaceHandle _fh, VertexHandle _vh);
00483 void triangulate(FaceHandle _fh);
00485 void triangulate();
00486
00487
00493
00494 const Vertex& deref(VertexHandle _h) const { return vertex(_h); }
00495 Vertex& deref(VertexHandle _h) { return vertex(_h); }
00496 const Halfedge& deref(HalfedgeHandle _h) const { return halfedge(_h); }
00497 Halfedge& deref(HalfedgeHandle _h) { return halfedge(_h); }
00498 const Edge& deref(EdgeHandle _h) const { return edge(_h); }
00499 Edge& deref(EdgeHandle _h) { return edge(_h); }
00500 const Face& deref(FaceHandle _h) const { return face(_h); }
00501 Face& deref(FaceHandle _h) { return face(_h); }
00503
00504 protected:
00506 void collapse_edge(HalfedgeHandle _hh);
00508 void collapse_loop(HalfedgeHandle _hh);
00509 };
00510
00511 }
00512
00513 #endif//OPENMESH_POLYCONNECTIVITY_HH