📄 compositet.cc
字号:
//=============================================================================//// 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 + -