Browse Source

a little improve of pair_faces

V2-integral-fix
Zhicheng Wang 2 days ago
parent
commit
0810b6400b
  1. 24
      network_process/src/connect_by_topo/pair_faces.cpp

24
network_process/src/connect_by_topo/pair_faces.cpp

@ -1,4 +1,3 @@
#include <functional>
#include <numeric> #include <numeric>
#include <connect_by_topo.hpp> #include <connect_by_topo.hpp>
@ -254,18 +253,23 @@ void pair_patches_in_tets(const stl_vector_mp<uint32_t> &containi
uint32_t vId1 = containing_simplex[0]; uint32_t vId1 = containing_simplex[0];
uint32_t vId2 = containing_simplex[1]; uint32_t vId2 = containing_simplex[1];
flat_hash_map_mp<pod_key_t<3>, face_header_t> tet_plane_of_tri{}; flat_hash_map_mp<pod_key_t<3>, face_header_t> tet_plane_of_tri{};
uint32_t vId; static const std::array triangle_indices = {
pod_key_t<3> tri; std::array{1u, 2u, 3u}, // 0
std::array{0u, 2u, 3u}, // 1
std::array{0u, 1u, 3u}, // 2
std::array{0u, 1u, 2u} // 3
};
for (const auto tId : containing_tetIds) { for (const auto tId : containing_tetIds) {
const auto &tet_vertices = tetrahedrons[tId];
for (uint32_t i = 0; i < 4; ++i) { for (uint32_t i = 0; i < 4; ++i) {
vId = tetrahedrons[tId][i]; uint32_t vId = tet_vertices[i];
if (vId != vId1 && vId != vId2) { if (vId != vId1 && vId != vId2) {
tri = {tetrahedrons[tId][(i + 1) % 4], tetrahedrons[tId][(i + 2) % 4], tetrahedrons[tId][(i + 3) % 4]}; face_header_t triangle_header{tId, i};
std::sort(tri.begin(), tri.end()); auto [iter, is_new] = tet_plane_of_tri.try_emplace(triangle_indices[i], triangle_header);
auto iter_inserted = tet_plane_of_tri.try_emplace(tri, face_header_t{tId, i}); const auto &other_triangle_header = iter->second;
if (!iter_inserted.second) { if (!is_new) {
identical_tet_planes[{tId, i}] = iter_inserted.first->second; identical_tet_planes[triangle_header] = other_triangle_header;
identical_tet_planes[iter_inserted.first->second] = {tId, i}; identical_tet_planes[other_triangle_header] = triangle_header;
} }
} }
} }

Loading…
Cancel
Save