📄 trimesht.cc
字号:
// handle boundary cases if (!vl.is_valid()) vlv1 = prev_halfedge_handle(halfedge_handle(v1)); if (!vr.is_valid()) vrv1 = prev_halfedge_handle(halfedge_handle(v1)); // split vertex v1 into edge v0v1 v0v1 = insert_edge(v0, vlv1, vrv1); return v0v1;}//-----------------------------------------------------------------------------template <class Kernel>typename TriMeshT<Kernel>::HalfedgeHandleTriMeshT<Kernel>::insert_loop(HalfedgeHandle _hh){ HalfedgeHandle h0(_hh); HalfedgeHandle o0(opposite_halfedge_handle(h0)); VertexHandle v0(to_vertex_handle(o0)); VertexHandle v1(to_vertex_handle(h0)); HalfedgeHandle h1 = new_edge(v1, v0); HalfedgeHandle o1 = opposite_halfedge_handle(h1); FaceHandle f0 = face_handle(h0); FaceHandle f1 = This::new_face(); // halfedge -> halfedge set_next_halfedge_handle(prev_halfedge_handle(h0), o1); set_next_halfedge_handle(o1, next_halfedge_handle(h0)); set_next_halfedge_handle(h1, h0); set_next_halfedge_handle(h0, h1); // halfedge -> face set_face_handle(o1, f0); set_face_handle(h0, f1); set_face_handle(h1, f1); // face -> halfedge set_halfedge_handle(f1, h0); if (f0.is_valid()) set_halfedge_handle(f0, o1); // vertex -> halfedge adjust_outgoing_halfedge(v0); adjust_outgoing_halfedge(v1); return h1;}//-----------------------------------------------------------------------------template <class Kernel>typename TriMeshT<Kernel>::HalfedgeHandleTriMeshT<Kernel>::insert_edge(VertexHandle _vh, HalfedgeHandle _h0, HalfedgeHandle _h1){ assert(_h0.is_valid() && _h1.is_valid()); VertexHandle v0 = _vh; VertexHandle v1 = to_vertex_handle(_h0); assert( v1 == to_vertex_handle(_h1)); HalfedgeHandle v0v1 = new_edge(v0, v1); HalfedgeHandle v1v0 = opposite_halfedge_handle(v0v1); // vertex -> halfedge set_halfedge_handle(v0, v0v1); set_halfedge_handle(v1, v1v0); // halfedge -> halfedge set_next_halfedge_handle(v0v1, next_halfedge_handle(_h0)); set_next_halfedge_handle(_h0, v0v1); set_next_halfedge_handle(v1v0, next_halfedge_handle(_h1)); set_next_halfedge_handle(_h1, v1v0); // halfedge -> vertex for (VertexIHalfedgeIter vih_it(vih_iter(v0)); vih_it; ++vih_it) set_vertex_handle(vih_it.handle(), v0); // halfedge -> face set_face_handle(v0v1, face_handle(_h0)); set_face_handle(v1v0, face_handle(_h1)); // face -> halfedge if (face_handle(v0v1).is_valid()) set_halfedge_handle(face_handle(v0v1), v0v1); if (face_handle(v1v0).is_valid()) set_halfedge_handle(face_handle(v1v0), v1v0); // vertex -> halfedge adjust_outgoing_halfedge(v0); adjust_outgoing_halfedge(v1); return v0v1;}//-----------------------------------------------------------------------------template <class Impl>boolTriMeshT<Impl>::is_flip_ok(EdgeHandle _eh) const{ // boundary edges cannot be flipped if (is_boundary(_eh)) return false; HalfedgeHandle hh = halfedge_handle(_eh, 0); HalfedgeHandle oh = halfedge_handle(_eh, 1); // check if the flipped edge is already present // in the mesh VertexHandle ah = to_vertex_handle(next_halfedge_handle(hh)); VertexHandle bh = to_vertex_handle(next_halfedge_handle(oh)); if (ah == bh) // this is generally a bad sign !!! return false; for (ConstVertexVertexIter vvi(*this, ah); vvi; ++vvi) if (vvi.handle() == bh) return false; return true;}//-----------------------------------------------------------------------------template <class Impl>voidTriMeshT<Impl>::flip(EdgeHandle _eh){ // CAUTION : Flipping a halfedge may result in // a non-manifold mesh, hence check for yourself // whether this operation is allowed or not! assert(is_flip_ok(_eh));//let's make it sure it is actually checked assert(!is_boundary(_eh)); HalfedgeHandle a0 = halfedge_handle(_eh, 0); HalfedgeHandle b0 = halfedge_handle(_eh, 1); HalfedgeHandle a1 = next_halfedge_handle(a0); HalfedgeHandle a2 = next_halfedge_handle(a1); HalfedgeHandle b1 = next_halfedge_handle(b0); HalfedgeHandle b2 = next_halfedge_handle(b1); VertexHandle va0 = to_vertex_handle(a0); VertexHandle va1 = to_vertex_handle(a1); VertexHandle vb0 = to_vertex_handle(b0); VertexHandle vb1 = to_vertex_handle(b1); FaceHandle fa = face_handle(a0); FaceHandle fb = face_handle(b0); set_vertex_handle(a0, va1); set_vertex_handle(b0, vb1); set_next_halfedge_handle(a0, a2); set_next_halfedge_handle(a2, b1); set_next_halfedge_handle(b1, a0); set_next_halfedge_handle(b0, b2); set_next_halfedge_handle(b2, a1); set_next_halfedge_handle(a1, b0); set_face_handle(a1, fb); set_face_handle(b1, fa); set_halfedge_handle(fa, a0); set_halfedge_handle(fb, b0); if (halfedge_handle(va0) == b0) set_halfedge_handle(va0, a1); if (halfedge_handle(vb0) == a0) set_halfedge_handle(vb0, b1);}//-----------------------------------------------------------------------------template <class Impl>voidTriMeshT<Impl>::split(EdgeHandle _eh, VertexHandle _vh){ HalfedgeHandle h0 = halfedge_handle(_eh, 0); HalfedgeHandle o0 = halfedge_handle(_eh, 1); VertexHandle v2 = to_vertex_handle(o0); HalfedgeHandle e1 = new_edge(_vh, v2); HalfedgeHandle t1 = opposite_halfedge_handle(e1); FaceHandle f0 = face_handle(h0); FaceHandle f3 = face_handle(o0); set_halfedge_handle(_vh, h0); set_vertex_handle(o0, _vh); if (!is_boundary(h0)) { HalfedgeHandle h1 = next_halfedge_handle(h0); HalfedgeHandle h2 = next_halfedge_handle(h1); VertexHandle v1 = to_vertex_handle(h1); HalfedgeHandle e0 = new_edge(_vh, v1); HalfedgeHandle t0 = opposite_halfedge_handle(e0); FaceHandle f1 = This::new_face(); set_halfedge_handle(f0, h0); set_halfedge_handle(f1, h2); set_face_handle(h1, f0); set_face_handle(t0, f0); set_face_handle(h0, f0); set_face_handle(h2, f1); set_face_handle(t1, f1); set_face_handle(e0, f1); set_next_halfedge_handle(h0, h1); set_next_halfedge_handle(h1, t0); set_next_halfedge_handle(t0, h0); set_next_halfedge_handle(e0, h2); set_next_halfedge_handle(h2, t1); set_next_halfedge_handle(t1, e0); } else { set_next_halfedge_handle(prev_halfedge_handle(h0), t1); set_next_halfedge_handle(t1, h0); // halfedge handle of _vh already is h0 } if (!is_boundary(o0)) { HalfedgeHandle o1 = next_halfedge_handle(o0); HalfedgeHandle o2 = next_halfedge_handle(o1); VertexHandle v3 = to_vertex_handle(o1); HalfedgeHandle e2 = new_edge(_vh, v3); HalfedgeHandle t2 = opposite_halfedge_handle(e2); FaceHandle f2 = This::new_face(); set_halfedge_handle(f2, o1); set_halfedge_handle(f3, o0); set_face_handle(o1, f2); set_face_handle(t2, f2); set_face_handle(e1, f2); set_face_handle(o2, f3); set_face_handle(o0, f3); set_face_handle(e2, f3); set_next_halfedge_handle(e1, o1); set_next_halfedge_handle(o1, t2); set_next_halfedge_handle(t2, e1); set_next_halfedge_handle(o0, e2); set_next_halfedge_handle(e2, o2); set_next_halfedge_handle(o2, o0); } else { set_next_halfedge_handle(e1, next_halfedge_handle(o0)); set_next_halfedge_handle(o0, e1); set_halfedge_handle(_vh, e1); } if (halfedge_handle(v2) == h0) set_halfedge_handle(v2, t1);}//-----------------------------------------------------------------------------#if OM_OUT_OF_CLASS_TEMPLATEtemplate <typename Kernel_>template <typename OtherMesh>TriMeshT<Kernel_>&TriMeshT<Kernel_>::assign(const OtherMesh& _rhs)# include "PolyMeshT_assign.hh"#endif//=============================================================================} // namespace OpenMesh//=============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -