MCPcopy Create free account
hub / github.com/PyMesh/PyMesh / run

Method run

tools/MeshUtils/DuplicatedVertexRemoval.cpp:17–84  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

15 }
16
17size_t DuplicatedVertexRemoval::run(Float tol) {
18 const size_t dim = m_vertices.cols();
19 HashGrid::Ptr grid = HashGrid::create(tol, dim);
20 const size_t num_vertices = m_vertices.rows();
21 const size_t num_faces = m_faces.rows();
22 const size_t vertex_per_face = m_faces.cols();
23 m_index_map.resize(num_vertices);
24 std::vector<size_t> source_index;
25
26 size_t count = 0;
27 size_t num_duplications = 0;
28 for (size_t i=0; i<num_vertices; i++) {
29 int curr_importance_level = m_importance_level[i];
30 if (curr_importance_level < 0) {
31 m_index_map[i] = count;
32 source_index.push_back(i);
33 count++;
34 continue;
35 }
36 const VectorF& v = m_vertices.row(i);
37 VectorI candidates = grid->get_items_near_point(v);
38 const size_t num_candidates = candidates.size();
39 if (num_candidates > 0) {
40 VectorF dists(num_candidates);
41 for (size_t j=0; j<num_candidates; j++) {
42 dists[j] = (m_vertices.row(candidates[j]) - v.transpose()).norm();
43 }
44 size_t min_idx;
45 Float min_dist = dists.minCoeff(&min_idx);
46 if (min_dist < tol) {
47 size_t best_match_idx = candidates[min_idx];
48 size_t output_idx = m_index_map[best_match_idx];
49 m_index_map[i] = output_idx;
50
51 int matched_importance_level =
52 m_importance_level[source_index[output_idx]];
53 if (curr_importance_level > matched_importance_level) {
54 source_index[output_idx] = i;
55 }
56
57 num_duplications++;
58 continue;
59 }
60 }
61
62 // No match, add this vertex in the book.
63 grid->insert(i, v);
64 m_index_map[i] = count;
65 source_index.push_back(i);
66 count++;
67 }
68
69 assert(source_index.size() == count);
70 MatrixFr vertices(count, dim);
71 for (size_t i=0; i<count; i++) {
72 assert(m_index_map[source_index[i]] == i);
73 vertices.row(i) = m_vertices.row(source_index[i]);
74 }

Callers 1

Calls 4

get_items_near_pointMethod · 0.80
normMethod · 0.80
sizeMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected