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

Method compute_edge_connectivity

tools/Wires/Misc/SymmetryOperators.cpp:172–219  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

170//}
171
172SymmetryOperators::SymmetryConnectivity SymmetryOperators::compute_edge_connectivity(
173 const MatrixFr& vertices,
174 const MatrixIr& edges,
175 SymmetryOperators::Operators& ops) {
176 const Float tol = 1e-12;
177 const size_t num_edges = edges.rows();
178 const Float cell_size = 1e-6;
179 HashGrid::Ptr grid = compute_vertex_lookup_grid(vertices, cell_size);
180 auto edge_map = create_edge_lookup_map(edges);
181
182 SymmetryConnectivity connectivity(num_edges);
183 for (auto& op : ops) {
184 for (size_t i=0; i<num_edges; i++) {
185 const VectorI& curr_e = edges.row(i);
186 const VectorF& e0 = vertices.row(curr_e[0]);
187 const VectorF& e1 = vertices.row(curr_e[1]);
188 VectorF mapped_e0 = op(e0);
189 VectorF mapped_e1 = op(e1);
190
191 VectorI candidate_e0 = grid->get_items_near_point(mapped_e0);
192 VectorI candidate_e1 = grid->get_items_near_point(mapped_e1);
193 const size_t num_candidates_e0 = candidate_e0.size();
194 const size_t num_candidates_e1 = candidate_e1.size();
195
196 for (size_t j=0; j<num_candidates_e0; j++) {
197 const size_t e0_idx = candidate_e0[j];
198 const VectorF& other_e0 = vertices.row(e0_idx);
199 if ((mapped_e0 - other_e0).squaredNorm() > tol) continue;
200
201 for (size_t k=0; k<num_candidates_e1; k++) {
202 const size_t e1_idx = candidate_e1[k];
203 const VectorF& other_e1 = vertices.row(e1_idx);
204 if ((mapped_e1 - other_e1).squaredNorm() > tol) continue;
205
206 Duplet key(e0_idx, e1_idx);
207 auto itr = edge_map.find(key);
208 if (itr != edge_map.end()) {
209 assert(itr->second.size() == 1);
210 const size_t mapped_edge_index = itr->second.front();
211 connectivity[i].insert(mapped_edge_index);
212 connectivity[mapped_edge_index].insert(i);
213 }
214 }
215 }
216 }
217 }
218 return connectivity;
219}
220
221//SymmetryOperators::SymmetryConnectivity SymmetryOperators::compute_edge_connectivity(
222// const MatrixFr& vertices,

Callers

nothing calls this directly

Calls 7

create_edge_lookup_mapFunction · 0.85
get_items_near_pointMethod · 0.80
findMethod · 0.80
sizeMethod · 0.45
endMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected