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