⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trimesht.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
📖 第 1 页 / 共 2 页
字号:
  // 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 + -