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

📄 compositet.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
📖 第 1 页 / 共 3 页
字号:
      ++valence;    }    c = _coeff(valence);    for (voh_it = mesh_.voh_iter(v_it.handle()); voh_it; ++voh_it) {      cog += mesh_.deref(mesh_.edge_handle(voh_it.handle())).position() * c;      cog += mesh_.deref(mesh_.edge_handle(mesh_.next_halfedge_handle(voh_it.handle()))).position() * (1.0 - c);    }    cog /= valence;    v_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::EVc(scalar_t _c){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::VertexIter           v_it;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  unsigned int                        valence;  typename MeshType::VertexOHalfedgeIter  voh_it;  for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {    valence = 0;    cog = zero_point;    for (voh_it = mesh_.voh_iter(v_it.handle()); voh_it; ++voh_it) {      ++valence;    }    for (voh_it = mesh_.voh_iter(v_it.handle()); voh_it; ++voh_it) {      cog += mesh_.deref(mesh_.edge_handle(voh_it.handle())).position() * _c;      cog += mesh_.deref(mesh_.edge_handle(mesh_.next_halfedge_handle(voh_it.handle()))).position() * (1.0 - _c);    }    cog /= valence;    v_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::EF(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::FaceIter         f_it;  typename MeshType::FaceEdgeIter     fe_it;  unsigned int                    valence;  typename MeshType::Point            cog,                                  zero_point(0.0, 0.0, 0.0);  for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {    valence = 0;    cog = zero_point;    for (fe_it = mesh_.fe_iter(f_it.handle()); fe_it; ++fe_it) {      ++valence;      cog += fe_it->position();    }    cog /= valence;    f_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::FE(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::EdgeIter       e_it;  unsigned int                  valence;  typename MeshType::Point          cog,                                zero_point(0.0, 0.0, 0.0);  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {    valence = 0;    cog = zero_point;    if (mesh_.face_handle(mesh_.halfedge_handle(e_it.handle(), 0)).is_valid()) {      cog += mesh_.deref(mesh_.face_handle(mesh_.halfedge_handle(e_it.handle(), 0))).position();      ++valence;    }    if (mesh_.face_handle(mesh_.halfedge_handle(e_it.handle(), 1)).is_valid()) {      cog += mesh_.deref(mesh_.face_handle(mesh_.halfedge_handle(e_it.handle(), 1))).position();      ++valence;    }    cog /= valence;    e_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VE(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::EdgeIter      e_it;  typename MeshType::Point         cog;  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {      cog = mesh_.deref(mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it.handle(), 0))).position();      cog += mesh_.deref(mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it.handle(), 1))).position();    cog /= 2.0;    e_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VV(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                        valence;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  typename MeshType::VertexVertexIter     vv_it;  typename MeshType::VertexIter           v_it;  std::vector<typename MeshType::Point>   point_vector;  point_vector.clear();  for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {    valence = 0;    cog = zero_point;    for (vv_it = mesh_.vv_iter(v_it.handle()); vv_it; ++vv_it) {      cog += vv_it->position();      ++valence;    }    cog /= valence;    point_vector.push_back(cog);  }  for (v_it = mesh_.vertices_end(); v_it != mesh_.vertices_begin(); ) {    --v_it;    v_it->set_position(point_vector.back());    point_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VVc(Coeff& _coeff){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                      valence;  typename MeshType::Point              cog,                                    zero_point(0.0, 0.0, 0.0);  typename MeshType::VertexVertexIter   vv_it;  typename MeshType::VertexIter         v_it;  scalar_t             c;  std::vector<typename MeshType::Point> point_vector;  for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {    valence = 0;    cog = zero_point;    for (vv_it = mesh_.vv_iter(v_it.handle()); vv_it; ++vv_it) {      cog += vv_it->position();      ++valence;    }    cog /= valence;    c = _coeff(valence);    cog = cog * (1 - c) + v_it->position() * c;    point_vector.push_back(cog);  }  for (v_it = mesh_.vertices_end(); v_it != mesh_.vertices_begin(); ) {    --v_it;    v_it->set_position(point_vector.back());    point_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VVc(scalar_t _c){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                      valence;  typename MeshType::Point              cog,                                    zero_point(0.0, 0.0, 0.0);  typename MeshType::VertexVertexIter   vv_it;  typename MeshType::VertexIter         v_it;  std::vector<typename MeshType::Point> point_vector;  for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {    valence = 0;    cog = zero_point;    for (vv_it = mesh_.vv_iter(v_it.handle()); vv_it; ++vv_it) {      cog += vv_it->position();      ++valence;    }    cog /= valence;    cog = cog * (1.0 - _c) + v_it->position() * _c;    point_vector.push_back(cog);  }  for (v_it = mesh_.vertices_end(); v_it != mesh_.vertices_begin(); ) {    --v_it;    v_it->set_position(point_vector.back());    point_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::EdE(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                      valence;  typename MeshType::Point              cog,                                    zero_point(0.0, 0.0, 0.0);  typename MeshType::EdgeIter           e_it;  typename MeshType::HalfedgeHandle     heh;  std::vector<typename MeshType::Point> point_vector;  point_vector.clear();  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {    valence = 0;    cog = zero_point;    for (int i = 0; i <= 1; ++i) {      heh = mesh_.halfedge_handle(e_it.handle(), i);      if (mesh_.face_handle(heh).is_valid()) {  cog += mesh_.deref(mesh_.edge_handle(mesh_.next_halfedge_handle(heh))).position();  cog += mesh_.deref(mesh_.edge_handle(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh)))).position();  ++valence;  ++valence;      }    }    cog /= valence;    point_vector.push_back(cog);  }  for (e_it = mesh_.edges_end(); e_it != mesh_.edges_begin(); ) {    --e_it;    e_it->set_position(point_vector.back());    point_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::EdEc(scalar_t _c){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                         valence;  typename MeshType::Point                 cog,                                       zero_point(0.0, 0.0, 0.0);  typename MeshType::EdgeIter              e_it;  typename MeshType::HalfedgeHandle        heh;  std::vector<typename MeshType::Point>    point_vector;  point_vector.clear();  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {    valence = 0;    cog = zero_point;    for (int i = 0; i <= 1; ++i) {      heh = mesh_.halfedge_handle(e_it.handle(), i);      if (mesh_.face_handle(heh).is_valid()) {  cog += mesh_.deref(mesh_.edge_handle(mesh_.next_halfedge_handle(heh))).position() * (1.0 - _c);  cog += mesh_.deref(mesh_.edge_handle(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh)))).position() * (1.0 - _c);  ++valence;  ++valence;      }    }    cog /= valence;    cog += e_it->position() * _c;    point_vector.push_back(cog);  }  for (e_it = mesh_.edges_end(); e_it != mesh_.edges_begin(); ) {    --e_it;    e_it->set_position(point_vector.back());    point_vector.pop_back();  }}/// Corner Cuttingtemplate<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::corner_cutting(HalfedgeHandle _heh){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  // Define Halfedge Handles  typename MeshType::HalfedgeHandle heh5(_heh);  typename MeshType::HalfedgeHandle heh6(mesh_.next_halfedge_handle(_heh));  // Cycle around the polygon to find correct Halfedge  for (; mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh5)) != _heh;       heh5 = mesh_.next_halfedge_handle(heh5));  typename MeshType::HalfedgeHandle heh2(mesh_.next_halfedge_handle(heh5));  typename MeshType::HalfedgeHandle    heh3(mesh_.new_edge(mesh_.to_vertex_handle(_heh),      mesh_.to_vertex_handle(heh5)));  typename MeshType::HalfedgeHandle heh4(mesh_.opposite_halfedge_handle(heh3));  // Old and new Face  typename MeshType::FaceHandle     fh_old(mesh_.face_handle(heh6));  typename MeshType::FaceHandle     fh_new(mesh_.new_face());  // Init new face  mesh_.deref(fh_new).set_position(mesh_.deref(fh_old).position());  // Re-Set Handles around old Face  mesh_.set_next_halfedge_handle(heh4, heh6);  mesh_.set_next_halfedge_handle(heh5, heh4);  mesh_.set_face_handle(heh4, fh_old);  mesh_.set_face_handle(heh5, fh_old);  mesh_.set_face_handle(heh6, fh_old);  mesh_.set_halfedge_handle(fh_old, heh4);  // Re-Set Handles around new Face  mesh_.set_next_halfedge_handle(_heh, heh3);  mesh_.set_next_halfedge_handle(heh3, heh2);  mesh_.set_face_handle(_heh, fh_new);  mesh_.set_face_handle(heh2, fh_new);  mesh_.set_face_handle(heh3, fh_new);  mesh_.set_halfedge_handle(fh_new, _heh);}/// Split Edgetemplate<typename MeshType, typename RealType>typename MeshType::VertexHandleCompositeT<MeshType,RealType>::split_edge(HalfedgeHandle _heh){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  HalfedgeHandle heh1;  HalfedgeHandle heh2;  HalfedgeHandle heh3;  HalfedgeHandle temp_heh;  VertexHandle    vh,    vh1(mesh_.to_vertex_handle(_heh)),    vh2(mesh_.from_vertex_handle(_heh));  // Calculate and Insert Midpoint of Edge  vh = mesh_.add_vertex((mesh_.point(vh2) + mesh_.point(vh1)) / 2.0);  // Re-Set Handles  heh2 = mesh_.opposite_halfedge_handle(_heh);  if (!mesh_.is_boundary(mesh_.edge_handle(_heh))) {    for (temp_heh = mesh_.next_halfedge_handle(heh2);   mesh_.next_halfedge_handle(temp_heh) != heh2;   temp_heh = mesh_.next_halfedge_handle(temp_heh) ) {}  } else {    for (temp_heh = _heh;   mesh_.next_halfedge_handle(temp_heh) != heh2;   temp_heh = mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(temp_heh))) {}  }  heh1 = mesh_.new_edge(vh, vh1);  heh3 = mesh_.opposite_halfedge_handle(heh1);  mesh_.set_vertex_handle(_heh, vh);  mesh_.set_next_halfedge_handle(temp_heh, heh3);  mesh_.set_next_halfedge_handle(heh1, mesh_.next_halfedge_handle(_heh));  mesh_.set_next_halfedge_handle(_heh, heh1);  mesh_.set_next_halfedge_handle(heh3, heh2);  if (mesh_.face_handle(heh2).is_valid()) {    mesh_.set_face_handle(heh3, mesh_.face_handle(heh2));    mesh_.set_halfedge_handle(mesh_.face_handle(heh3), heh3);  }  mesh_.set_face_handle(heh1, mesh_.face_handle(_heh));  mesh_.set_halfedge_handle(vh, heh1);  mesh_.set_halfedge_handle(mesh_.face_handle(_heh), _heh);  mesh_.set_halfedge_handle(vh1, heh3);  return vh;}//=============================================================================} // END_NS_UNIFORM} // END_NS_SUBDIVIDER} // END_NS_OPENMESH//=============================================================================#endif // OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITE_CC defined//=============================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -