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

📄 compositet.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
📖 第 1 页 / 共 3 页
字号:
//=============================================================================////                               OpenMesh//      Copyright (C) 2001-2005 by Computer Graphics Group, RWTH Aachen//                           www.openmesh.org////-----------------------------------------------------------------------------////                                License////   This library is free software; you can redistribute it and/or modify it//   under the terms of the GNU Library General Public License as published//   by the Free Software Foundation, version 2.////   This library is distributed in the hope that it will be useful, but//   WITHOUT ANY WARRANTY; without even the implied warranty of//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU//   Library General Public License for more details.////   You should have received a copy of the GNU Library General Public//   License along with this library; if not, write to the Free Software//   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.////-----------------------------------------------------------------------------////   $Revision: 1.2 $//   $Date: 2005-12-21 13:58:55 $////=============================================================================/** \file Uniform/Composite/CompositeT.cc *///=============================================================================////  CLASS CompositeT - IMPLEMENTATION////=============================================================================#ifndef OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITE_CC#define OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITE_CC//== INCLUDES =================================================================#include <vector>#include <OpenMesh/Tools/Subdivider/Uniform/Composite/CompositeT.hh>//== NAMESPACE ================================================================namespace OpenMesh   { // BEGIN_NS_OPENMESHnamespace Subdivider { // BEGIN_NS_DECIMATERnamespace Uniform    { // BEGIN_NS_UNIFORM//== IMPLEMENTATION ==========================================================template <typename MeshType, typename RealType>bool CompositeT<MeshType,RealType>::prepare( MeshType& _m ){  // store mesh for later usage in subdivide(), cleanup() and all rules.  p_mesh_ = &_m;  typename MeshType::VertexIter v_it(_m.vertices_begin());  for (; v_it != _m.vertices_end(); ++v_it)    v_it->set_position(_m.point(v_it.handle()));  return true;}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::Tvv3(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::VertexHandle vh;  typename MeshType::FaceIter     f_it;  typename MeshType::EdgeIter     e_it;  typename MeshType::VertexIter   v_it;  typename MeshType::Point        zero_point(0.0, 0.0, 0.0);  size_t                          n_edges, n_faces, n_vertices, j;  // Store number of original edges  n_faces    = mesh_.n_faces();  n_edges    = mesh_.n_edges();  n_vertices = mesh_.n_vertices();  // reserve enough memory for iterator  mesh_.reserve(n_vertices + n_faces, n_edges + 3 * n_faces, 3 * n_faces);  // set new positions for vertices  v_it = mesh_.vertices_begin();  for (j = 0; j < n_vertices; ++j) {    v_it->set_position(v_it->position() * 3.0);    ++v_it;  }  // Split each face  f_it = mesh_.faces_begin();  for (j = 0; j < n_faces; ++j) {    vh = mesh_.add_vertex(zero_point);    mesh_.deref(vh).set_position(zero_point);    mesh_.split(f_it.handle(), vh);    ++f_it;  }  // Flip each old edge  std::vector<typename MeshType::EdgeHandle> edge_vector;  edge_vector.clear();  e_it = mesh_.edges_begin();  for (j = 0; j < n_edges; ++j) {    if (mesh_.is_flip_ok(e_it.handle())) {      mesh_.flip(e_it.handle());    } else {      edge_vector.push_back(e_it.handle());    }    ++e_it;  }  // split all boundary edges  while (!edge_vector.empty()) {    vh = mesh_.add_vertex(zero_point);    mesh_.deref(vh).set_position(zero_point);    mesh_.split(edge_vector.back(), vh);    edge_vector.pop_back();  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::Tvv4(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::VertexHandle     vh;  typename MeshType::FaceIter         f_it;  typename MeshType::EdgeIter         e_it;  typename MeshType::VertexIter       v_it;  typename MeshType::Point            zero_point(0.0, 0.0, 0.0);  unsigned int                    n_edges, n_faces, n_vertices, j;  // Store number of original edges  n_faces    = mesh_.n_faces();  n_edges    = mesh_.n_edges();  n_vertices = mesh_.n_vertices();  // reserve memory ahead for the succeeding operations  mesh_.reserve(n_vertices + n_edges, 2 * n_edges + 3 * n_faces, 4 * n_faces);  // set new positions for vertices  v_it = mesh_.vertices_begin();  for (j = 0; j < n_vertices; ++j) {    v_it->set_position(v_it->position() * 4.0);    ++v_it;  }  // Split each edge  e_it = mesh_.edges_begin();  for (j = 0; j < n_edges; ++j) {    vh = split_edge(mesh_.halfedge_handle(e_it.handle(), 0));    mesh_.deref(vh).set_position(zero_point);    ++e_it;  }  // Corner Cutting of Each Face  f_it = mesh_.faces_begin();  for (j = 0; j < n_faces; ++j) {    typename MeshType::HalfedgeHandle heh1(mesh_.halfedge_handle(f_it.handle()));    typename MeshType::HalfedgeHandle heh2(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh1)));    typename MeshType::HalfedgeHandle heh3(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh2)));    // Cutting off every corner of the 6_gon    corner_cutting(heh1);    corner_cutting(heh2);    corner_cutting(heh3);    ++f_it;  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::Tfv(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  typename MeshType::VertexHandle     vh;  typename MeshType::FaceIter         f_it;  typename MeshType::EdgeIter         e_it;  typename MeshType::VertexIter       v_it;  typename MeshType::VertexFaceIter   vf_it;  typename MeshType::FaceFaceIter     ff_it;  typename MeshType::Point            cog;  const typename MeshType::Point      zero_point(0.0, 0.0, 0.0);  unsigned int                    n_edges, n_faces, n_vertices, j, valence;  // Store number of original edges  n_faces = mesh_.n_faces();  n_edges = mesh_.n_edges();  n_vertices = mesh_.n_vertices();  // reserve enough space for iterator  mesh_.reserve(n_vertices + n_faces, n_edges + 3 * n_faces, 3 * n_faces);  // set new positions for vertices  v_it = mesh_.vertices_begin();  for (j = 0; j < n_vertices; ++j) {    valence = 0;    cog = zero_point;    for (vf_it = mesh_.vf_iter(v_it.handle()); vf_it; ++vf_it) {      ++valence;      cog += vf_it->position();    }    cog /= valence;    v_it->set_position(cog);    ++v_it;  }  // Split each face, insert new vertex and calculate position  f_it = mesh_.faces_begin();  for (j = 0; j < n_faces; ++j) {    vh = mesh_.add_vertex();    valence = 0;    cog = zero_point;    for (ff_it = mesh_.ff_iter(f_it.handle()); ff_it; ++ff_it) {      ++valence;      cog += ff_it->position();    }    cog /= valence;    mesh_.split(f_it.handle(), vh);    for (vf_it = mesh_.vf_iter(vh); vf_it; ++vf_it) {      vf_it->set_position(f_it->position());    }    mesh_.deref(vh).set_position(cog);    mesh_.set_point(vh, cog);    ++f_it;  }  // Flip each old edge  e_it = mesh_.edges_begin();  for (j = 0; j < n_edges; ++j) {    if (mesh_.is_flip_ok(e_it.handle()))      mesh_.flip(e_it.handle());    ++e_it;  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VF(){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                  valence;  typename MeshType::Point          cog,                                zero_point(0.0, 0.0, 0.0);  typename MeshType::FaceVertexIter fv_it;  typename MeshType::FaceIter       f_it;  for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {    valence = 0;    cog = zero_point;    for (fv_it = mesh_.fv_iter(f_it.handle()); fv_it; ++fv_it) {      cog += fv_it->position();      ++valence;    }    cog /= valence;    f_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VFa(Coeff& _coeff){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                        valence[3], i;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  typename MeshType::Scalar               alpha;  typename MeshType::FaceIter             f_it;  typename MeshType::HalfedgeHandle       heh;  typename MeshType::VertexHandle         vh[3];  typename MeshType::VertexOHalfedgeIter  voh_it;  typename MeshType::FaceVertexIter       fv_it;  for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {    heh = mesh_.halfedge_handle(f_it.handle());    for (i = 0; i <= 2; ++i) {      valence[i] = 0;      vh[i] = mesh_.to_vertex_handle(heh);      for (voh_it = mesh_.voh_iter(vh[i]); voh_it; ++voh_it) {  ++valence[i];      }      heh = mesh_.next_halfedge_handle(heh);    }    if (valence[0] <= valence[1])      if (valence[0] <= valence[2])  i = 0;      else  i = 2;    else      if (valence[1] <= valence[2])  i = 1;      else  i = 2;    alpha = _coeff(valence[i]);    cog = zero_point;    for (fv_it = mesh_.fv_iter(f_it.handle()); fv_it; ++fv_it) {      if (fv_it.handle() == vh[i]) {  cog += fv_it->position() * alpha;      } else {  cog += fv_it->position() * (1.0 - alpha) / 2.0;      }    }    f_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::VFa(scalar_t _alpha){  assert(p_mesh_); MeshType& mesh_ = *p_mesh_;  unsigned int                        valence[3], i;  typename MeshType::Point                cog,                                      zero_point(0.0, 0.0, 0.0);  typename MeshType::FaceIter             f_it;  typename MeshType::HalfedgeHandle       heh;  typename MeshType::VertexHandle         vh[3];  typename MeshType::VertexOHalfedgeIter  voh_it;  typename MeshType::FaceVertexIter       fv_it;  for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {    heh = mesh_.halfedge_handle(f_it.handle());    for (i = 0; i <= 2; ++i) {      valence[i] = 0;      vh[i] = mesh_.to_vertex_handle(heh);      for (voh_it = mesh_.voh_iter(vh[i]); voh_it; ++voh_it) {  ++valence[i];      }      heh = mesh_.next_halfedge_handle(heh);    }    if (valence[0] <= valence[1])      if (valence[0] <= valence[2])  i = 0;      else  i = 2;    else      if (valence[1] <= valence[2])  i = 1;      else  i = 2;    cog = zero_point;    for (fv_it = mesh_.fv_iter(f_it.handle()); fv_it; ++fv_it) {      if (fv_it.handle() == vh[i]) {  cog += fv_it->position() * _alpha;      } else {  cog += fv_it->position() * (1.0 - _alpha) / 2.0;      }    }    f_it->set_position(cog);  }}template<typename MeshType, typename RealType>void CompositeT<MeshType,RealType>::FF(){  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;  point_vector.clear();  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;    }

⌨️ 快捷键说明

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