mirror of https://github.com/CGAL/cgal
[flip] check vertices_subdomain_indices[v] == 2 at both endpoints!
and re-write collection of subdomains on boundary
This commit is contained in:
parent
302f8e8b2e
commit
83d99a507a
|
|
@ -1215,10 +1215,26 @@ std::size_t flip_all_edges(const std::vector<VertexPair>& edges,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename C3t3>
|
||||||
|
void collect_subdomains_on_boundary(const C3t3& c3t3,
|
||||||
|
boost::unordered_map<typename C3t3::Vertex_handle,
|
||||||
|
std::unordered_set<typename C3t3::Subdomain_index> >& vertices_subdomain_indices)
|
||||||
|
{
|
||||||
|
for (auto c : c3t3.triangulation().all_cell_handles())
|
||||||
|
{
|
||||||
|
for (auto v : c3t3.triangulation().vertices(c))
|
||||||
|
{
|
||||||
|
const int dim = v->in_dimension();
|
||||||
|
if(dim >= 0 && dim < 3)
|
||||||
|
vertices_subdomain_indices[v].insert(c->subdomain_index());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<typename C3T3, typename CellSelector>
|
template<typename C3T3, typename CellSelector>
|
||||||
void collectBoundaryEdgesAndComputeVerticesValences(
|
void collectBoundaryEdgesAndComputeVerticesValences(
|
||||||
const C3T3& c3t3,
|
const C3T3& c3t3,
|
||||||
CellSelector cell_selector,
|
const CellSelector& cell_selector,
|
||||||
std::vector<typename C3T3::Edge>& boundary_edges,
|
std::vector<typename C3T3::Edge>& boundary_edges,
|
||||||
boost::unordered_map<typename C3T3::Vertex_handle,
|
boost::unordered_map<typename C3T3::Vertex_handle,
|
||||||
boost::unordered_map<typename C3T3::Surface_patch_index, unsigned int> >&
|
boost::unordered_map<typename C3T3::Surface_patch_index, unsigned int> >&
|
||||||
|
|
@ -1247,18 +1263,14 @@ void collectBoundaryEdgesAndComputeVerticesValences(
|
||||||
"boundary_edges.polylines.txt");
|
"boundary_edges.polylines.txt");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// collect incident subdomain indices at vertices
|
||||||
|
collect_subdomains_on_boundary(c3t3, vertices_subdomain_indices);
|
||||||
|
|
||||||
for (const Edge& e : boundary_edges)
|
for (const Edge& e : boundary_edges)
|
||||||
{
|
{
|
||||||
const Vertex_handle v0 = e.first->vertex(e.second);
|
const Vertex_handle v0 = e.first->vertex(e.second);
|
||||||
const Vertex_handle v1 = e.first->vertex(e.third);
|
const Vertex_handle v1 = e.first->vertex(e.third);
|
||||||
|
|
||||||
if (vertices_subdomain_indices.find(v0) == vertices_subdomain_indices.end())
|
|
||||||
incident_subdomains(v0, c3t3,
|
|
||||||
std::inserter(vertices_subdomain_indices[v0], vertices_subdomain_indices[v0].end()));
|
|
||||||
if (vertices_subdomain_indices.find(v1) == vertices_subdomain_indices.end())
|
|
||||||
incident_subdomains(v1, c3t3,
|
|
||||||
std::inserter(vertices_subdomain_indices[v1], vertices_subdomain_indices[v1].end()));
|
|
||||||
|
|
||||||
//In case of feature edge
|
//In case of feature edge
|
||||||
if (vertices_subdomain_indices[v0].size() > 2
|
if (vertices_subdomain_indices[v0].size() > 2
|
||||||
&& vertices_subdomain_indices[v1].size() > 2)
|
&& vertices_subdomain_indices[v1].size() > 2)
|
||||||
|
|
@ -1275,7 +1287,8 @@ void collectBoundaryEdgesAndComputeVerticesValences(
|
||||||
}
|
}
|
||||||
} while (++facet_circulator != done);
|
} while (++facet_circulator != done);
|
||||||
}
|
}
|
||||||
else if (vertices_subdomain_indices[v0].size() == 2)
|
else if (vertices_subdomain_indices[v0].size() == 2
|
||||||
|
|| vertices_subdomain_indices[v1].size() == 2)
|
||||||
{
|
{
|
||||||
Facet_circulator facet_circulator = tr.incident_facets(e);
|
Facet_circulator facet_circulator = tr.incident_facets(e);
|
||||||
Facet_circulator done(facet_circulator);
|
Facet_circulator done(facet_circulator);
|
||||||
|
|
@ -2110,7 +2123,7 @@ void flip_edges(C3T3& c3t3,
|
||||||
//}
|
//}
|
||||||
|
|
||||||
#ifdef CGAL_TETRAHEDRAL_REMESHING_VERBOSE
|
#ifdef CGAL_TETRAHEDRAL_REMESHING_VERBOSE
|
||||||
std::cout << "Flip edges... done ("
|
std::cout << "\rFlip edges... done ("
|
||||||
<< nb_flips_on_surface << "/"
|
<< nb_flips_on_surface << "/"
|
||||||
<< nb_flips_in_volume << " surface/volume flips done)." << std::endl;
|
<< nb_flips_in_volume << " surface/volume flips done)." << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue