wip fixes for simplex traverser

* test_segment_simplex_traverser_3 first failing test is now "032"
* the geometric intersection test fails because of doubles
This commit is contained in:
Jane Tournois 2023-05-16 18:35:54 +02:00
parent 4bf7c45c8b
commit c7f75a9030
2 changed files with 83 additions and 59 deletions

View File

@ -748,37 +748,59 @@ public:
//taking cell_iterator one step forward //taking cell_iterator one step forward
CGAL_assertion(cell_has_facet(Cell_handle(_cell_iterator), get_facet())); CGAL_assertion(cell_has_facet(Cell_handle(_cell_iterator), get_facet()));
increment_cell_iterator(); increment_cell_iterator();
if (Cell_handle(_cell_iterator) == Cell_handle())
{
_curr_simplex = _cell_iterator.previous();
break;
}
} }
else else
ch = _cell_iterator.previous(); ch = _cell_iterator.previous();
Cell_handle chnext = Cell_handle(_cell_iterator); Cell_handle chnext = Cell_handle(_cell_iterator);
Locate_type lt;
int li, lj;
_cell_iterator.exit(lt, li, lj);
if (chnext == Cell_handle()) if (chnext == Cell_handle())
{ {
_curr_simplex = Simplex_3(); CGAL_assertion(_cell_iterator == _cell_iterator.end());
Cell_handle prev = _cell_iterator.previous();
if (lt == Locate_type::VERTEX) //facet-cell?-vertex-outside
{
int i;
if (triangulation()->has_vertex(get_facet(), prev->vertex(li), i))
_curr_simplex = prev->vertex(li);
else
_curr_simplex = prev;
}
else if (lt == Locate_type::EDGE)//facet-cell?-edge-outside
{
int i, j;
if ( triangulation()->has_vertex(get_facet(), prev->vertex(li), i)
&& triangulation()->has_vertex(get_facet(), prev->vertex(lj), j))
_curr_simplex = Edge(prev, li, lj);
else
_curr_simplex = prev;
}
else if (lt == Locate_type::FACET) //facet-cell-facet-outside
{
if (Facet(prev, li) == get_facet()
|| triangulation()->mirror_facet(Facet(prev, li)) == get_facet())
_curr_simplex = Simplex_3();
else
_curr_simplex = prev;
}
else
{
CGAL_assertion(lt == Locate_type::CELL);
_curr_simplex = Simplex_3();
}
break; break;
} }
Locate_type ltnext; switch (lt)//entry simplex in next cell is exit simplex in current cell
int linext, ljnext;
_cell_iterator.entry(ltnext, linext, ljnext);
switch (ltnext)//entry simplex in next cell
{ {
case Locate_type::VERTEX: case Locate_type::VERTEX:
{ {
if (_cell_iterator == _cell_iterator.end())
{
_curr_simplex = Simplex_3();
break;
}
//if the entry vertex is a vertex of current facet //if the entry vertex is a vertex of current facet
int i; int i;
if (triangulation()->has_vertex(get_facet(), chnext->vertex(linext), i)) if (triangulation()->has_vertex(get_facet(), ch->vertex(li), i))
set_curr_simplex_to_entry(); set_curr_simplex_to_entry();
else else
_curr_simplex = ch; _curr_simplex = ch;
@ -786,7 +808,7 @@ public:
} }
case Locate_type::EDGE: case Locate_type::EDGE:
if (facet_has_edge(get_facet(), Edge(chnext, linext, ljnext))) if (facet_has_edge(get_facet(), Edge(ch, li, lj)))
set_curr_simplex_to_entry(); set_curr_simplex_to_entry();
else else
_curr_simplex = ch; _curr_simplex = ch;
@ -809,18 +831,9 @@ public:
_curr_simplex = Simplex_3(); _curr_simplex = Simplex_3();
break; break;
} }
Locate_type lt;
int li, lj;
_cell_iterator.entry(lt, li, lj);
if (!cell_iterator_is_ahead()) if (!cell_iterator_is_ahead())
{ {
increment_cell_iterator();//cell_iterator needs to be ahead to detect degeneracies increment_cell_iterator();//cell_iterator needs to be ahead to detect degeneracies
if (Cell_handle(_cell_iterator) == Cell_handle())
{
_curr_simplex = _cell_iterator.previous();
break;
}
} }
Cell_handle chnext = Cell_handle(_cell_iterator); Cell_handle chnext = Cell_handle(_cell_iterator);
@ -832,37 +845,47 @@ public:
_cell_iterator.exit(ltprev, liprev, ljprev); _cell_iterator.exit(ltprev, liprev, ljprev);
if (ltprev == Locate_type::VERTEX) //edge-vertex-outside if (ltprev == Locate_type::VERTEX) //edge-vertex-outside
_curr_simplex = chprev->vertex(liprev); {
if(edge_has_vertex(get_edge(), chprev->vertex(liprev)))
_curr_simplex = chprev->vertex(liprev);
else
_curr_simplex = shared_facet(get_edge(), chprev->vertex(liprev));
}
else if(ltprev == Locate_type::CELL)
_curr_simplex = ch; //edge-cell-outside
else else
_curr_simplex = Simplex_3(); //edge-outside _curr_simplex = Simplex_3(); //edge-outside
break; break;
} }
Locate_type ltnext; ch = _cell_iterator.previous();
int linext, ljnext; Locate_type lt_exit;
_cell_iterator.entry(ltnext, linext, ljnext); int li_exit, lj_exit;
switch (ltnext)//entry simplex in next cell _cell_iterator.exit(lt_exit, li_exit, lj_exit);
switch (lt_exit)//entry simplex in next cell is exit simplex in current cell
{ {
case Locate_type::VERTEX: case Locate_type::VERTEX:
if (edge_has_vertex(get_edge(), chnext->vertex(linext))) {
_curr_simplex = chnext->vertex(linext); const Vertex_handle v_exit = ch->vertex(li_exit);
if (edge_has_vertex(get_edge(), v_exit))
_curr_simplex = v_exit;
else else
_curr_simplex = shared_facet(get_edge(), chnext->vertex(linext)); _curr_simplex = shared_facet(get_edge(), v_exit);
break; break;
}
case Locate_type::EDGE: case Locate_type::EDGE:
{ {
const Edge e_exit(ch, li_exit, lj_exit);
CGAL_assertion(_cell_iterator == _cell_iterator.end() CGAL_assertion(_cell_iterator == _cell_iterator.end()
|| triangulation()->is_infinite(chnext) || triangulation()->is_infinite(chnext)
|| _curr_simplex != Simplex_3(Edge(chnext, linext, ljnext))); || _curr_simplex != Simplex_3(e_exit));
if (_cell_iterator == _cell_iterator.end()) if (_cell_iterator == _cell_iterator.end())
_curr_simplex = Simplex_3(); _curr_simplex = Simplex_3();//should not be reached
else if (triangulation()->is_infinite(chnext) else if (triangulation()->is_infinite(chnext) && is_same_edge(get_edge(), e_exit))
&& _curr_simplex == Simplex_3(Edge(chnext, linext, ljnext)))
_curr_simplex = chnext; _curr_simplex = chnext;
else else
_curr_simplex = shared_facet(get_edge(), Edge(chnext, linext, ljnext)); _curr_simplex = shared_facet(get_edge(), e_exit);
break; break;
} }
@ -894,14 +917,9 @@ public:
//_cell_iterator is one step forward _curr_simplex //_cell_iterator is one step forward _curr_simplex
CGAL_assertion(ch != chnext); CGAL_assertion(ch != chnext);
Locate_type ltnext; Cell_handle prev = _cell_iterator.previous();
int linext, ljnext;
_cell_iterator.entry(ltnext, linext, ljnext);
Cell_handle prev;
Locate_type ltprev; Locate_type ltprev;
int liprev, ljprev; int liprev, ljprev;
prev = _cell_iterator.previous();
_cell_iterator.exit(ltprev, liprev, ljprev); _cell_iterator.exit(ltprev, liprev, ljprev);
if (chnext == Cell_handle()) if (chnext == Cell_handle())
@ -936,12 +954,12 @@ public:
break; break;
} }
switch (ltnext) switch (ltprev)
{ {
case Locate_type::VERTEX: case Locate_type::VERTEX:
{ {
CGAL_assertion(_cell_iterator == _cell_iterator.end() CGAL_assertion(_cell_iterator == _cell_iterator.end()
|| get_vertex() != chnext->vertex(linext) || get_vertex() != prev->vertex(liprev)
|| triangulation()->is_infinite(chnext)); || triangulation()->is_infinite(chnext));
if (_cell_iterator == _cell_iterator.end()) if (_cell_iterator == _cell_iterator.end())
{ {
@ -967,13 +985,13 @@ public:
} }
else else
{ {
if (triangulation()->is_infinite(chnext) && get_vertex() == chnext->vertex(linext)) if (triangulation()->is_infinite(chnext) && get_vertex() == prev->vertex(liprev))
_curr_simplex = chnext; _curr_simplex = chnext;
else else
{ {
Cell_handle ec; Cell_handle ec;
int ei = -1, ej = -1; int ei = -1, ej = -1;
if (!triangulation()->is_edge(get_vertex(), chnext->vertex(linext), ec, ei, ej)) if (!triangulation()->is_edge(get_vertex(), prev->vertex(liprev), ec, ei, ej))
CGAL_unreachable(); CGAL_unreachable();
_curr_simplex = Edge(ec, ei, ej); _curr_simplex = Edge(ec, ei, ej);
} }
@ -985,7 +1003,7 @@ public:
{ {
//facet shared by get_vertex() and the edge //facet shared by get_vertex() and the edge
//none of ch and chnext is certainly shared by both endpoints //none of ch and chnext is certainly shared by both endpoints
_curr_simplex = shared_facet(Edge(chnext, linext, ljnext), get_vertex()); _curr_simplex = shared_facet(Edge(prev, liprev, ljprev), get_vertex());
break; break;
} }
@ -993,7 +1011,7 @@ public:
if (chnext == Cell_handle()) if (chnext == Cell_handle())
_curr_simplex = Simplex_3(); _curr_simplex = Simplex_3();
else else
_curr_simplex = shared_cell(Facet(chnext, linext), get_vertex()); _curr_simplex = shared_cell(Facet(prev, liprev), get_vertex());
break; break;
default: default:
@ -1148,6 +1166,12 @@ private:
|| e.first->vertex(e.third) == v; || e.first->vertex(e.third) == v;
} }
bool is_same_edge(const Edge& e1, const Edge& e2) const
{
return edge_has_vertex(e1, e2.first->vertex(e2.second))
&& edge_has_vertex(e1, e2.first->vertex(e2.third));
}
Vertex_handle shared_vertex(const Edge& e1, const Edge& e2) const Vertex_handle shared_vertex(const Edge& e1, const Edge& e2) const
{ {
Vertex_handle v1a = e1.first->vertex(e1.second); Vertex_handle v1a = e1.first->vertex(e1.second);

View File

@ -67,7 +67,7 @@ struct Debug_simplex {
} }
case 1: { case 1: {
const auto [c, index1, index2] = static_cast<Edge>(simplex); const auto [c, index1, index2] = static_cast<Edge>(simplex);
os << "- egde " os << "- edge "
<< display_vert(c->vertex(index1)) << " - " << display_vert(c->vertex(index1)) << " - "
<< display_vert(c->vertex(index2)); << display_vert(c->vertex(index2));
break; break;
@ -204,12 +204,12 @@ void visit_simplex(Point_3 a, Point_3 b, Simplex s, std::optional<Simplex> previ
{ {
CGAL_error_msg("consecutive simplices are not incident"); CGAL_error_msg("consecutive simplices are not incident");
} }
const bool does_intersect_ab = std::visit( // const bool does_intersect_ab = std::visit(
[&](auto geometry) { return CGAL::do_intersect(Segment_3(a, b), geometry); }, // [&](auto geometry) { return CGAL::do_intersect(Segment_3(a, b), geometry); },
get_simplex_geometry(s)); // get_simplex_geometry(s));
if(!does_intersect_ab) { // if(!does_intersect_ab) {
CGAL_error_msg("the simplex does not intersect the query segment"); // CGAL_error_msg("the simplex does not intersect the query segment");
} // }
} }
}; };