45#include <OpenMesh/Core/Mesh/PolyConnectivity.hh>
62 if (to_vertex_handle(*voh_it) == _end_vh)
94 for (++vh_it; vh_it.is_valid(); ++vh_it)
108 set_halfedge_handle(_vh, *vh_it);
120 size_t i, ii, n(_vhs_size);
122 outer_next, outer_prev,
123 boundary_next, boundary_prev,
124 patch_start, patch_end;
134 size_t next_cache_count = 0;
140 for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)
144 omerr() <<
"PolyMeshT::add_face: complex vertex\n";
150 _vertex_handles[ii]);
156 omerr() <<
"PolyMeshT::add_face: complex edge\n";
162 for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)
166 inner_prev =
edgeData_[i].halfedge_handle;
167 inner_next =
edgeData_[ii].halfedge_handle;
178 boundary_prev = outer_prev;
186 if (boundary_prev == inner_prev)
188 omerr() <<
"PolyMeshT::add_face: patch re-linking failed\n";
207 next_cache_[next_cache_count++] = std::make_pair(boundary_prev, patch_start);
208 next_cache_[next_cache_count++] = std::make_pair(patch_end, boundary_next);
209 next_cache_[next_cache_count++] = std::make_pair(inner_prev, inner_next);
215 for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)
217 edgeData_[i].halfedge_handle = new_edge(_vertex_handles[i], _vertex_handles[ii]);
224 for (i=0, ii=1; i<n; ++i, ++ii, ii%=n)
226 vh = _vertex_handles[ii];
228 inner_prev =
edgeData_[i].halfedge_handle;
229 inner_next =
edgeData_[ii].halfedge_handle;
251 next_cache_[next_cache_count++] = std::make_pair(boundary_prev, outer_next);
252 set_halfedge_handle(vh, outer_next);
258 next_cache_[next_cache_count++] = std::make_pair(outer_prev, boundary_next);
259 set_halfedge_handle(vh, boundary_next);
265 set_halfedge_handle(vh, outer_next);
266 next_cache_[next_cache_count++] = std::make_pair(outer_prev, outer_next);
274 next_cache_[next_cache_count++] = std::make_pair(boundary_prev, outer_next);
275 next_cache_[next_cache_count++] = std::make_pair(outer_prev, boundary_next);
281 next_cache_[next_cache_count++] = std::make_pair(inner_prev, inner_next);
291 for (i = 0; i < next_cache_count; ++i)
335{
return add_face(&_vhandles.front(), _vhandles.size()); }
341 std::vector<VertexHandle> vhandles(_vhandles.begin(), _vhandles.end());
342 return add_face(&vhandles.front(), vhandles.size());
359 bool v0v1_triangle =
false;
360 bool v1v0_triangle =
false;
391 vl = to_vertex_handle(h1);
408 vr = to_vertex_handle(h1);
416 if ( vl.
is_valid() && (vl == vr))
return false;
424 for (vv_it =
vv_iter(v0); vv_it.is_valid(); ++vv_it)
429 for (vv_it =
vv_iter(v1); vv_it.is_valid(); ++vv_it)
434 for (vv_it =
vv_iter(v0); vv_it.is_valid(); ++vv_it)
437 !(*vv_it == v_01_n && v0v1_triangle) &&
438 !(*vv_it == v_10_n && v1v0_triangle)
476 if (
status(*vv_it).
tagged() && v_01_n == v_10_n && v0v1_triangle && v1v0_triangle)
490 std::vector<FaceHandle> face_handles;
491 face_handles.reserve(8);
493 face_handles.push_back(*vf_it);
497 for (
auto delete_fh_it : face_handles)
498 delete_face(delete_fh_it, _delete_isolated_vertices);
517 if ( has_edge_status() )
523 if ( has_halfedge_status() ) {
542 std::vector<EdgeHandle> deleted_edges;
543 deleted_edges.reserve(3);
548 std::vector<VertexHandle> vhandles;
566 vhandles.push_back(to_vertex_handle(hh));
573 if (!deleted_edges.empty())
575 std::vector<EdgeHandle>::iterator del_it(deleted_edges.begin()),
576 del_end(deleted_edges.end());
580 for (; del_it!=del_end; ++del_it)
583 v0 = to_vertex_handle(h0);
588 v1 = to_vertex_handle(h1);
593 set_next_halfedge_handle(prev0, next1);
594 set_next_halfedge_handle(prev1, next0);
597 if ( has_edge_status() )
604 if ( has_halfedge_status() ) {
615 if (_delete_isolated_vertices)
619 else set_halfedge_handle(v0, next0);
628 if (_delete_isolated_vertices)
632 else set_halfedge_handle(v1, next1);
638 std::vector<VertexHandle>::iterator v_it(vhandles.begin()),
639 v_end(vhandles.end());
640 for (; v_it!=v_end; ++v_it)
684 set_vertex_handle(*vih_it, vh);
688 set_next_halfedge_handle(hp, hn);
689 set_next_halfedge_handle(op, on);
693 if (fh.
is_valid()) set_halfedge_handle(fh, hn);
694 if (fo.
is_valid()) set_halfedge_handle(fo, on);
705 if (has_halfedge_status())
739 set_face_handle(h1, fo);
750 set_halfedge_handle(fo, h1);
760 if (has_halfedge_status())
777 while (next_heh != heh0)
791 std::set<FaceHandle> nb_fhs;
794 if (nb_fhs.find(*cff_it) == nb_fhs.end())
796 nb_fhs.insert(*cff_it);
818 if (!del_fh.is_valid())
820 std::swap(del_fh, rem_fh);
822 assert(del_fh.is_valid());
834 set_next_halfedge_handle(prev_heh0, next_heh1);
835 set_next_halfedge_handle(prev_heh1, next_heh0);
842 set_halfedge_handle(vh0, next_heh0);
846 set_halfedge_handle(vh1, next_heh1);
852 set_halfedge_handle(rem_fh, prev_heh1);
856 set_halfedge_handle(rem_fh, prev_heh0);
860 set_face_handle(*fh_it, rem_fh);
872 assert_compile(
sizeof(Halfedge) ==
sizeof(Halfedge_with_prev));
874 assert(
status(_eh).deleted());
880 if (!del_fh.is_valid())
882 std::swap(del_fh, rem_fh);
884 assert(
status(del_fh).deleted());
894 set_next_halfedge_handle(prev_heh0, heh0);
895 set_prev_halfedge_handle(next_heh0, heh0);
897 set_next_halfedge_handle(prev_heh1, heh1);
898 set_prev_halfedge_handle(next_heh1, heh1);
902 set_face_handle(*fh_it, del_fh);
909 set_halfedge_handle(rem_fh, heh1);
914 set_halfedge_handle(rem_fh, heh0);
932 set_next_halfedge_handle(_prev_heh, heh0);
933 set_next_halfedge_handle(heh0, _next_heh);
934 set_next_halfedge_handle(prev_next_heh, heh1);
935 set_next_halfedge_handle(heh1, next_prev_heh);
939 set_halfedge_handle(new_fh, heh0);
942 set_face_handle(*fh_it, new_fh);
945 set_face_handle(heh1, old_fh);
948 set_halfedge_handle(old_fh, heh1);
978 set_halfedge_handle(new_fh, base_heh);
980 HalfedgeHandle new_heh = new_edge(to_vertex_handle(next_heh), start_vh);
982 set_next_halfedge_handle(base_heh, next_heh);
983 set_next_halfedge_handle(next_heh, new_heh);
984 set_next_halfedge_handle(new_heh, base_heh);
986 set_face_handle(base_heh, new_fh);
987 set_face_handle(next_heh, new_fh);
988 set_face_handle(new_heh, new_fh);
995 next_heh = next_next_heh;
997 set_halfedge_handle(_fh, base_heh);
999 set_next_halfedge_handle(base_heh, next_heh);
1002 set_face_handle(base_heh, _fh);
1013 for (; f_it!=f_end; ++f_it)
1025 set_next_halfedge_handle(hend, hold);
1026 set_face_handle(hold, fh);
1030 while (hh != hend) {
1035 set_halfedge_handle(fnew, hh);
1039 set_next_halfedge_handle(hnew, hold);
1040 set_next_halfedge_handle(hold, hh);
1041 set_next_halfedge_handle(hh, hnew);
1043 set_face_handle(hnew, fnew);
1044 set_face_handle(hold, fnew);
1045 set_face_handle(hh, fnew);
1052 set_next_halfedge_handle(hold, hend);
1055 set_face_handle(hold, fh);
1057 set_halfedge_handle(vh, hold);
1110 set_vertex_handle(h1, _vh);
1113 set_next_halfedge_handle(new_e, h0);
1116 set_next_halfedge_handle(ph0, new_e);
1131 set_boundary(new_e);
1143 set_halfedge_handle( _vh, h0 );
1148 set_halfedge_handle(vfrom, new_e);
const StatusInfo & status(VertexHandle _vh) const
Status Query API.
bool tagged() const
is tagged ?
void set_deleted(bool _b)
set deleted
void set_tagged(bool _b)
set tagged
bool is_valid() const
The handle is valid iff the index is not negative.
void copy_all_properties(VertexHandle _vh_from, VertexHandle _vh_to, bool _copyBuildIn=false)
uint valence(VertexHandle _vh) const
Vertex valence.
ConstVertexVertexIter cvv_iter(VertexHandle _vh) const
const vertex circulator
bool is_manifold(VertexHandle _vh) const
Is (the mesh at) vertex _vh two-manifold ?
void split_copy(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-n split).
void adjust_outgoing_halfedge(VertexHandle _vh)
static const HalfedgeHandle InvalidHalfedgeHandle
Invalid handle.
SmartHalfedgeHandle opposite_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
HalfedgeHandle insert_edge(HalfedgeHandle _prev_heh, HalfedgeHandle _next_heh)
SmartHalfedgeHandle find_halfedge(VertexHandle _start_vh, VertexHandle _end_vh) const
Find halfedge from _vh0 to _vh1. Returns invalid handle if not found.
SmartHalfedgeHandle prev_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
void collapse_edge(HalfedgeHandle _hh)
Helper for halfedge collapse.
ConstFaceVertexIter cfv_iter(FaceHandle _fh) const
const face - vertex circulator
void reinsert_edge(EdgeHandle _eh)
ConstFaceFaceIter cff_iter(FaceHandle _fh) const
const face - face circulator
void collapse(HalfedgeHandle _heh)
FaceHandle remove_edge(EdgeHandle _eh)
VertexVertexIter vv_iter(VertexHandle _vh)
vertex - vertex circulator
static const FaceHandle InvalidFaceHandle
Invalid handle.
SmartHalfedgeHandle next_halfedge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
ConstFaceEdgeIter cfe_iter(FaceHandle _fh) const
const face - edge circulator
void triangulate()
triangulate the entire mesh
void delete_edge(EdgeHandle _eh, bool _delete_isolated_vertices=true)
void collapse_loop(HalfedgeHandle _hh)
Helper for halfedge collapse.
SmartFaceHandle face_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
std::vector< std::pair< HalfedgeHandle, HalfedgeHandle > > next_cache_
Get item from handle.
static const VertexHandle InvalidVertexHandle
Invalid handle.
static const EdgeHandle InvalidEdgeHandle
Invalid handle.
void delete_vertex(VertexHandle _vh, bool _delete_isolated_vertices=true)
FaceIter faces_end()
End iterator for faces.
void split_edge(EdgeHandle _eh, VertexHandle _vh)
ConstVertexOHalfedgeIter cvoh_iter(VertexHandle _vh) const
const vertex - outgoing halfedge circulator
SmartFaceHandle add_face(const std::vector< VertexHandle > &_vhandles)
Add and connect a new face.
void split_edge_copy(EdgeHandle _eh, VertexHandle _vh)
bool is_boundary(HalfedgeHandle _heh) const
Check if the halfedge is at the boundary.
SmartEdgeHandle edge_handle(SmartHalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
SmartFaceHandle opposite_face_handle(HalfedgeHandle _heh) const
returns the face handle of the opposite halfedge
bool is_simply_connected(FaceHandle _fh) const
VertexIHalfedgeIter vih_iter(VertexHandle _vh)
vertex - incoming halfedge circulator
void split(FaceHandle _fh, VertexHandle _vh)
Face split (= 1-to-n split).
void delete_face(FaceHandle _fh, bool _delete_isolated_vertices=true)
FaceHalfedgeIter fh_iter(FaceHandle _fh)
face - halfedge circulator
FaceIter faces_begin()
Begin iterator for faces.
bool is_collapse_ok(HalfedgeHandle _he)
SmartHalfedgeHandle halfedge_handle(SmartEdgeHandle _eh, unsigned int _i=0) const
returns the face handle of the opposite halfedge
VertexFaceIter vf_iter(VertexHandle _vh)
vertex - face circulator
std::vector< AddFaceEdgeInfo > edgeData_
Get item from handle.
bool is_simple_link(EdgeHandle _eh) const
SmartVertexHandle make_smart(VertexHandle _vh, const PolyConnectivity *_mesh)
Creats a SmartVertexHandle from a VertexHandle and a Mesh.
Handle for a edge entity.
Handle for a face entity.
Handle for a halfedge entity.
Handle for a vertex entity.