From 1d88c993b95afeb2acc4252828c7bc7c972a0945 Mon Sep 17 00:00:00 2001 From: ccolin Date: Sat, 13 Nov 2021 13:31:57 +0100 Subject: [PATCH] optimize 2-ring traversal --- src/curvature.cpp | 48 +++++++++++++++++++++-------------------------- src/curvature.h | 11 ++++++----- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/curvature.cpp b/src/curvature.cpp index 18da97d..9f3e640 100644 --- a/src/curvature.cpp +++ b/src/curvature.cpp @@ -1,5 +1,6 @@ #include "curvature.h" #include "util.h" +#include void Courbures::normales_locales() { @@ -9,7 +10,7 @@ void Courbures::normales_locales() { MyMesh::Normal normal(0,0,0); i = 0; for (MyMesh::FaceHandle vf : _mesh.vf_range(vh)) { - i++ ; + i++; normal += _mesh.calc_face_normal(vf); } if (i != 0) { @@ -21,43 +22,36 @@ void Courbures::normales_locales() { } -std::vector Courbures::get_two_neighborhood(const MyMesh::VertexHandle vh) { - OpenMesh::VPropHandleT vprop_flag; - _mesh.add_property(vprop_flag, "vprop_flag"); +void Courbures::get_two_neighborhood(std::vector &out, + const MyMesh::VertexHandle vh) { + auto flag_prop = + OpenMesh::getOrMakeProperty(_mesh, "vprop_flag"); + flag_prop.set_range(_mesh.vertices_begin(), _mesh.vertices_end(), false); - // Initialisation - for (VertexHandle vh : _mesh.vertices()) { - _mesh.property(vprop_flag, vh) = false; - } - // Circulateur sur le premier cercle - std::vector neigh, neigh2; - - _mesh.property(vprop_flag, vh) = true; + // Parcours du 1-anneau + flag_prop[vh] = true; for(VertexHandle vv : _mesh.vv_range(vh)) { - neigh.push_back(vv); // ajout du point à la liste - _mesh.property(vprop_flag, vv) = true; + out.push_back(vv); // ajout du point à la liste + flag_prop[vv] = true; } - // Parcours du premier cercle et ajout du second cercle par circulateurs - for (size_t i = 0; i < neigh.size(); i++) { - MyMesh::VertexHandle vh = neigh.at(i) ; - for (VertexHandle vv : _mesh.vv_range(vh)) { - if (!_mesh.property(vprop_flag, vv)) { - neigh2.push_back(vv); + // Parcours du 1-anneau de chaque sommet du 1-anneau + size_t old_size = out.size(); + for (size_t i = 0; i < old_size; i++) { + for (VertexHandle vv : _mesh.vv_range(out[i])) { + if (!flag_prop[vv]) { + out.push_back(vv); + flag_prop[vv] = true; } - _mesh.property(vprop_flag, vv) = true; } } - - // Concaténation des deux cercles - neigh.insert(neigh.end(), neigh2.begin(), neigh2.end()); - _mesh.remove_property(vprop_flag); - return neigh; } QuadPatch Courbures::fit_quad(MyMesh::VertexHandle vh) { - std::vector neigh = get_two_neighborhood(vh); + static std::vector neigh; + neigh.clear(); + get_two_neighborhood(neigh, vh); if (neigh.size() < 5) throw "Quad fitting: not enough neighbors"; // Calcul de la matrice de changement de base diff --git a/src/curvature.h b/src/curvature.h index 7f93aca..84bc771 100644 --- a/src/curvature.h +++ b/src/curvature.h @@ -16,12 +16,13 @@ public: Courbures(MyMesh &mesh) : _mesh(mesh) {} - void set_fixed_colors() ; - void normales_locales() ; - std::vector get_two_neighborhood(MyMesh::VertexHandle vh); + void set_fixed_colors(); + void normales_locales(); + void get_two_neighborhood(std::vector &out, + MyMesh::VertexHandle vh); QuadPatch fit_quad(MyMesh::VertexHandle vh); - void compute_KH() ; - void set_K_colors() ; + void compute_KH(); + void set_K_colors(); };