optimize 2-ring traversal

This commit is contained in:
ccolin 2021-11-13 13:31:57 +01:00
parent 1d1f2c22f7
commit 1d88c993b9
2 changed files with 27 additions and 32 deletions

View File

@ -1,5 +1,6 @@
#include "curvature.h" #include "curvature.h"
#include "util.h" #include "util.h"
#include <OpenMesh/Core/Utils/PropertyManager.hh>
void Courbures::normales_locales() { void Courbures::normales_locales() {
@ -21,43 +22,36 @@ void Courbures::normales_locales() {
} }
std::vector<MyMesh::VertexHandle> Courbures::get_two_neighborhood(const MyMesh::VertexHandle vh) { void Courbures::get_two_neighborhood(std::vector<MyMesh::VertexHandle> &out,
OpenMesh::VPropHandleT<bool> vprop_flag; const MyMesh::VertexHandle vh) {
_mesh.add_property(vprop_flag, "vprop_flag"); auto flag_prop =
OpenMesh::getOrMakeProperty<VertexHandle, bool>(_mesh, "vprop_flag");
flag_prop.set_range(_mesh.vertices_begin(), _mesh.vertices_end(), false);
// Initialisation // Parcours du 1-anneau
for (VertexHandle vh : _mesh.vertices()) { flag_prop[vh] = true;
_mesh.property(vprop_flag, vh) = false;
}
// Circulateur sur le premier cercle
std::vector<MyMesh::VertexHandle> neigh, neigh2;
_mesh.property(vprop_flag, vh) = true;
for(VertexHandle vv : _mesh.vv_range(vh)) { for(VertexHandle vv : _mesh.vv_range(vh)) {
neigh.push_back(vv); // ajout du point à la liste out.push_back(vv); // ajout du point à la liste
_mesh.property(vprop_flag, vv) = true; flag_prop[vv] = true;
} }
// Parcours du premier cercle et ajout du second cercle par circulateurs // Parcours du 1-anneau de chaque sommet du 1-anneau
for (size_t i = 0; i < neigh.size(); i++) { size_t old_size = out.size();
MyMesh::VertexHandle vh = neigh.at(i) ; for (size_t i = 0; i < old_size; i++) {
for (VertexHandle vv : _mesh.vv_range(vh)) { for (VertexHandle vv : _mesh.vv_range(out[i])) {
if (!_mesh.property(vprop_flag, vv)) { if (!flag_prop[vv]) {
neigh2.push_back(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) { QuadPatch Courbures::fit_quad(MyMesh::VertexHandle vh) {
std::vector<MyMesh::VertexHandle> neigh = get_two_neighborhood(vh); static std::vector<MyMesh::VertexHandle> neigh;
neigh.clear();
get_two_neighborhood(neigh, vh);
if (neigh.size() < 5) throw "Quad fitting: not enough neighbors"; if (neigh.size() < 5) throw "Quad fitting: not enough neighbors";
// Calcul de la matrice de changement de base // Calcul de la matrice de changement de base

View File

@ -18,7 +18,8 @@ public:
void set_fixed_colors(); void set_fixed_colors();
void normales_locales(); void normales_locales();
std::vector<MyMesh::VertexHandle> get_two_neighborhood(MyMesh::VertexHandle vh); void get_two_neighborhood(std::vector<MyMesh::VertexHandle> &out,
MyMesh::VertexHandle vh);
QuadPatch fit_quad(MyMesh::VertexHandle vh); QuadPatch fit_quad(MyMesh::VertexHandle vh);
void compute_KH(); void compute_KH();
void set_K_colors(); void set_K_colors();