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

📄 compositet.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
📖 第 1 页 / 共 3 页
字号:
    cog /= valence;    point_vector.push_back(cog);  }  for (f_it = mesh_.faces_end(); f_it != mesh_.faces_begin(); ) {    --f_it;    f_it->set_position(point_vector.back());    point_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::FFc(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::FaceFaceIter    ff_it;  typename MeshType::FaceIter        f_it;  typename MeshType::Scalar          c;  std::vector<typename MeshType::Point> point_vector;  for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {    valence = 0;    cog = zero_point;    for (ff_it = mesh_.ff_iter(f_it.handle()); ff_it; ++ff_it) {      cog += ff_it->position();      ++valence;    }    cog /= valence;    c = _coeff(valence);    cog = cog * (1.0 - c) + f_it->position() * c;    point_vector.push_back(cog);  }  for (f_it = mesh_.faces_end(); f_it != mesh_.faces_begin(); ) {    --f_it;    f_it->set_position(point_vector.back());    point_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::FFc(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::FaceFaceIter    ff_it;  typename MeshType::FaceIter        f_it;  std::vector<typename MeshType::Point> point_vector;  for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {    valence = 0;    cog = zero_point;    for (ff_it = mesh_.ff_iter(f_it.handle()); ff_it; ++ff_it) {      cog += ff_it->position();      ++valence;    }    cog /= valence;    cog = cog * (1.0 - _c) + f_it->position() * _c;    point_vector.push_back(cog);  }  for (f_it = mesh_.faces_end(); f_it != mesh_.faces_begin(); ) {    --f_it;    f_it->set_position(point_vector.back());    point_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::FV(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                  valence;  typename MeshType::Point          cog,                                zero_point(0.0, 0.0, 0.0);  typename MeshType::VertexFaceIter vf_it;  typename MeshType::VertexIter     v_it;  for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {    valence = 0;    cog = zero_point;    for (vf_it = mesh_.vf_iter(v_it.handle()); vf_it; ++vf_it) {      cog += vf_it->position();      ++valence;    }    cog /= valence;    v_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::FVc(Coeff& _coeff){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                        valence;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  scalar_t               c;  typename MeshType::VertexOHalfedgeIter  voh_it;  typename MeshType::VertexIter           v_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;    }    c = _coeff(valence);    for (voh_it = mesh_.voh_iter(v_it.handle()); voh_it; ++voh_it) {      if (mesh_.face_handle(voh_it.handle()).is_valid()) {  if (mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(voh_it.handle()))).is_valid()) {    cog += mesh_.deref(mesh_.face_handle(voh_it.handle())).position() * c;    cog += mesh_.deref(mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(voh_it.handle())))).position() * (1.0 - c);  } else {    cog += mesh_.deref(mesh_.face_handle(voh_it.handle())).position();  }      } else {  --valence;      }    }    if (valence > 0)      cog /= valence;    v_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::FVc(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::VertexOHalfedgeIter voh_it;  typename MeshType::VertexIter          v_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) {      if (mesh_.face_handle(voh_it.handle()).is_valid()) {  if (mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(voh_it.handle()))).is_valid()) {    cog += mesh_.deref(mesh_.face_handle(voh_it.handle())).position() * _c;    cog += mesh_.deref(mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(voh_it.handle())))).position() * (1.0 - _c);  } else {    cog += mesh_.deref(mesh_.face_handle(voh_it.handle())).position();  }      } else {  --valence;      }    }    if (valence > 0)      cog /= valence;    v_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VdE(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::EdgeIter             e_it;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  typename MeshType::HalfedgeHandle       heh1, heh2;  unsigned int                        valence;  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {    cog = zero_point;    valence = 2;    heh1 = mesh_.halfedge_handle(e_it.handle(), 0);    heh2 = mesh_.opposite_halfedge_handle(heh1);    cog += mesh_.deref(mesh_.to_vertex_handle(heh1)).position();    cog += mesh_.deref(mesh_.to_vertex_handle(heh2)).position();    if (!mesh_.is_boundary(heh1)) {      cog += mesh_.deref(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh1))).position();      ++valence;    }    if (!mesh_.is_boundary(heh2)) {      cog += mesh_.deref(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh2))).position();      ++valence;    }    cog /= valence;    e_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VdEc(scalar_t _c){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::EdgeIter           e_it;  typename MeshType::Point              cog,                                    zero_point(0.0, 0.0, 0.0);  typename MeshType::HalfedgeHandle     heh;  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {    cog = zero_point;    for (int i = 0; i <= 1; ++i) {      heh = mesh_.halfedge_handle(e_it.handle(), i);      if (!mesh_.is_boundary(heh)) {  cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (0.5 - _c);  cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * _c;      } else {  cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position();      }    }    e_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VdEg(scalar_t _gamma){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::EdgeIter             e_it;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  typename MeshType::HalfedgeHandle       heh;  typename MeshType::VertexOHalfedgeIter  voh_it;  unsigned int                        valence[2], i;  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {    cog = zero_point;    for (i = 0; i <= 1; ++i) {      heh = mesh_.halfedge_handle(e_it.handle(), i);      valence[i] = 0;      // look for lowest valence vertex      for (voh_it = mesh_.voh_iter(mesh_.to_vertex_handle(heh)); voh_it; ++voh_it) {  ++valence[i];      }    }    if (valence[0] < valence[1])      i = 0;    else      i = 1;    heh = mesh_.halfedge_handle(e_it.handle(), i);    if (!mesh_.is_boundary(heh)) {      cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (_gamma);      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * (1.0 - 3.0 * _gamma);    } else {      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * (1.0 - 2.0 * _gamma);    }    heh = mesh_.halfedge_handle(e_it.handle(), 1-i);    if (!mesh_.is_boundary(heh)) {      cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (_gamma);      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * _gamma;    } else {      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * 2.0 * _gamma;    }    e_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VdEg(Coeff& _coeff){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::EdgeIter             e_it;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  typename MeshType::HalfedgeHandle       heh;  typename MeshType::VertexOHalfedgeIter  voh_it;  unsigned int                        valence[2], i;  scalar_t               gamma;  for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {    cog = zero_point;    for (i = 0; i <= 1; ++i) {      heh = mesh_.halfedge_handle(e_it.handle(), i);      valence[i] = 0;      // look for lowest valence vertex      for (voh_it = mesh_.voh_iter(mesh_.to_vertex_handle(heh)); voh_it; ++voh_it) {  ++valence[i];      }    }    if (valence[0] < valence[1])      i = 0;    else      i = 1;    gamma = _coeff(valence[i]);    heh = mesh_.halfedge_handle(e_it.handle(), i);    if (!mesh_.is_boundary(heh)) {      cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (gamma);      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * (1.0 - 3.0 * gamma);    } else {      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * (1.0 - 2.0 * gamma);    }    heh = mesh_.halfedge_handle(e_it.handle(), 1-i);    if (!mesh_.is_boundary(heh)) {      cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (gamma);      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * gamma;    } else {      cog += mesh_.deref(mesh_.to_vertex_handle(heh)).position() * 2.0 * gamma;    }    e_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::EV(){  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::VertexEdgeIter   ve_it;  for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {    valence = 0;    cog = zero_point;    for (ve_it = mesh_.ve_iter(v_it.handle()); ve_it; ++ve_it) {      cog += ve_it->position();      ++valence;    }    cog /= valence;    v_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::EVc(Coeff& _coeff){  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;  scalar_t                c;  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) {

⌨️ 快捷键说明

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