mirror of https://github.com/CGAL/cgal
Merge fd178ca9e0 into 26a5fc70e4
This commit is contained in:
commit
797eb4f2c7
|
|
@ -4804,23 +4804,77 @@ auto get_remeshing_triangulation(Conforming_constrained_Delaunay_triangulation_3
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for(auto ch : tr.all_cell_handles()) {
|
for(auto ch : tr.all_cell_handles()) {
|
||||||
ch->set_subdomain_index(1);
|
ch->set_subdomain_index(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::stack<decltype(tr.infinite_cell())> stack;
|
// Use a flood algorithm to mark constrained connected components.
|
||||||
stack.push(tr.infinite_cell());
|
// The connected component containing the infinite vertex is marked with index 0.
|
||||||
while(!stack.empty()) {
|
// Nested components are marked with increasing indices.
|
||||||
auto ch = stack.top();
|
// Disconnected components that have the same nesting level get the same index parity:
|
||||||
stack.pop();
|
// for example two cubes within a larger bounding box will be index 2 and 4.
|
||||||
ch->set_subdomain_index(0);
|
std::list<typename Tr::Facet> border;
|
||||||
for(int i = 0; i < 4; ++i) {
|
int next_even_subdomain = 0;
|
||||||
if(ch->ccdt_3_data().is_facet_constrained(i))
|
int next_odd_subdomain = 1;
|
||||||
continue;
|
|
||||||
auto n = ch->neighbor(i);
|
// Function to flood-fill a connected component with a given subdomain index
|
||||||
if(n->subdomain_index() == 1) {
|
auto flood_component = [&tr, &border](typename Tr::Cell_handle start, int subdomain_index) {
|
||||||
stack.push(n);
|
if(start->subdomain_index() != -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::list<typename Tr::Cell_handle> queue;
|
||||||
|
queue.push_back(start);
|
||||||
|
|
||||||
|
while(!queue.empty()) {
|
||||||
|
auto ch = queue.front();
|
||||||
|
queue.pop_front();
|
||||||
|
if(ch->subdomain_index() == -1) {
|
||||||
|
ch->set_subdomain_index(subdomain_index);
|
||||||
|
for(int i = 0; i < 4; i++) {
|
||||||
|
typename Tr::Facet f(ch, i);
|
||||||
|
auto n = ch->neighbor(i);
|
||||||
|
if(n->subdomain_index() == -1) {
|
||||||
|
if(ch->ccdt_3_data().is_facet_constrained(i))
|
||||||
|
border.push_back(f);
|
||||||
|
else
|
||||||
|
queue.push_back(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Start with the infinite cell's component using index 0
|
||||||
|
flood_component(tr.infinite_cell(), next_even_subdomain);
|
||||||
|
next_even_subdomain += 2;
|
||||||
|
|
||||||
|
for (;;) { // while there are unvisited cells
|
||||||
|
while(!border.empty()) {
|
||||||
|
auto f = border.front();
|
||||||
|
border.pop_front();
|
||||||
|
auto n = f.first->neighbor(f.second);
|
||||||
|
if(n->subdomain_index() == -1) {
|
||||||
|
// If we are coming from an even subdomain, use next odd, and vice versa
|
||||||
|
bool from_even = (f.first->subdomain_index() % 2 == 0);
|
||||||
|
int next_index = from_even ? next_odd_subdomain : next_even_subdomain;
|
||||||
|
flood_component(n, next_index);
|
||||||
|
if(from_even)
|
||||||
|
next_odd_subdomain += 2;
|
||||||
|
else
|
||||||
|
next_even_subdomain += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found_unvisited = false;
|
||||||
|
for(auto ch : tr.finite_cell_handles()) {
|
||||||
|
if(ch->subdomain_index() == -1) {
|
||||||
|
flood_component(ch, next_even_subdomain);
|
||||||
|
next_even_subdomain += 2;
|
||||||
|
found_unvisited = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found_unvisited)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto f : tr.finite_facets())
|
for(auto f : tr.finite_facets())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue