From 30ffeb03374b4dd05ed1ee2fcc6669a91ce954da Mon Sep 17 00:00:00 2001 From: Iordan Iordanov Date: Mon, 13 Jun 2016 11:37:41 +0200 Subject: [PATCH] Update of offsets during point insertion in the periodic hyperbolic triangulation. Preliminary tests look good. --- .../triangulation.cpp | 11 +-- .../include/CGAL/Hyperbolic_word_4.h | 6 ++ ...ic_4_hyperbolic_Delaunay_triangulation_2.h | 68 ++++++++++++++++++- ..._hyperbolic_triangulation_ds_face_base_2.h | 17 ++++- 4 files changed, 88 insertions(+), 14 deletions(-) diff --git a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/triangulation.cpp b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/triangulation.cpp index d07a52fbcd3..2c6c98fa24d 100644 --- a/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/triangulation.cpp +++ b/Periodic_4_hyperbolic_triangulation_2/demo/Periodic_4_hyperbolic_triangulation_2/triangulation.cpp @@ -26,7 +26,7 @@ typedef Triangulation::Vertex_handle Vertex_handle; typedef Triangulation::Locate_type Locate_type; typedef Triangulation::Edge Edge; typedef Traits::FT FT; -typedef std::set::iterator face_iterator; +typedef Triangulation::Face_iterator Face_iterator; using namespace CGAL; @@ -47,20 +47,13 @@ int main(void) { cout << "Point " << query << " is located in face " << fh->get_number(); cout << (lt == Triangulation::EDGE ? " [EDGE]" : (lt == Triangulation::VERTEX ? " [VERTEX]" : " [FACE]")) << endl; - std::set faces_in_conflict; - tr.find_in_conflict(query, fh, faces_in_conflict); - cout << "Faces in conflict: "; - for (face_iterator it = faces_in_conflict.begin(); it != faces_in_conflict.end(); it++) { - cout << (*it)->get_number() << ", "; - } - cout << endl; - cout << "Number of faces before: " << tr.number_of_faces() << endl; tr.insert(query, fh); cout << "Number of faces after: " << tr.number_of_faces() << endl; + /* cout << endl; faces_in_conflict.clear(); diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_word_4.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_word_4.h index c8fb07edd39..86abdbf4846 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_word_4.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Hyperbolic_word_4.h @@ -277,6 +277,12 @@ public: template ostream& operator<<(ostream& s, const Hyperbolic_word_4& o) { + + if (o.is_identity()) { + s << "_"; + return s; + } + for (Int i = 0; i < 4; i++) { if (o.b(i)) { s << o(i); diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h index 74ce1fa1f8c..3babaf7f895 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_Delaunay_triangulation_2.h @@ -175,12 +175,76 @@ insert(const Point &p, Face_handle start) { typedef typename Gt::Side_of_fundamental_octagon Side_of_fundamental_octagon; - + Side_of_fundamental_octagon check = Side_of_fundamental_octagon(); CGAL::Bounded_side side = check(p); if (side != CGAL::ON_UNBOUNDED_SIDE) { - return this->insert_in_face(p, start); + + cout << "Point inserted in face " << start->get_number() << ", vertices: "; + for (int i = 0; i < 3; i++) + cout << start->vertex(i)->idx() << " with offset " << start->offset(i) << ", "; + cout << endl; + cout << "Neighbor offsets: " << start->neighbor_offset(0) << ", " << start->neighbor_offset(1) << ", " << start->neighbor_offset(2) << endl; + + int next_number = this->number_of_faces(); + Vertex_handle ov[] = { start->vertex(0), + start->vertex(1), + start->vertex(2) }; + Offset oo[] = { start->offset(0), + start->offset(1), + start->offset(2) }; + Offset ono[] = { start->neighbor_offset(0), + start->neighbor_offset(1), + start->neighbor_offset(2) }; + + Vertex_handle new_vertex = this->insert_in_face(p, start); + new_vertex->set_point( p ); + new_vertex->set_idx( this->number_of_vertices() ); + cout << "New vertex has id " << new_vertex->idx() << endl; + + // Assign offsets + Face_circulator iface = _tds.incident_faces(new_vertex), end(iface); + if (iface != 0) { + do { + + // Null all offsets + iface->set_offsets(); + + if (iface->get_number() == -1) { + iface->set_number(next_number++); + } + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (iface->vertex(i) == ov[j]) { + iface->set_offset(i, oo[j]); + if (iface->vertex(Triangulation_cw_ccw_2::cw(i)) == ov[Triangulation_cw_ccw_2::cw(j)]) { + iface->set_neighbor_face_offset(Triangulation_cw_ccw_2::ccw(i), ono[Triangulation_cw_ccw_2::ccw(j)]); + } + else if (iface->vertex(Triangulation_cw_ccw_2::ccw(i)) == ov[Triangulation_cw_ccw_2::ccw(j)]) { + iface->set_neighbor_face_offset(Triangulation_cw_ccw_2::cw(i), ono[Triangulation_cw_ccw_2::cw(j)]); + } + } + } + } + + } while (++iface != end); + + cout << "New faces created: " << endl << "------------------------" << endl; + do { + cout << "Face " << iface->get_number() << ", vertices: "; + for (int i = 0; i < 3; i++) { + cout << iface->vertex(i)->idx() << " with offset " << iface->offset(i) << ", "; + } + cout << endl; + cout << "Neighbor offsets: " << iface->neighbor_offset(0) << ", " << iface->neighbor_offset(1) << ", " << iface->neighbor_offset(2) << endl; + } while (++iface != end); + cout << "--------- end ----------" << endl << endl; + } + + + + return new_vertex; } else { return Vertex_handle(); } diff --git a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h index c44c13b48bf..85143d4e6d4 100644 --- a/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h +++ b/Periodic_4_hyperbolic_triangulation_2/include/CGAL/Periodic_4_hyperbolic_triangulation_ds_face_base_2.h @@ -57,11 +57,12 @@ public: Periodic_4_hyperbolic_triangulation_ds_face_base_2() #ifndef CGAL_CFG_NO_CPP0X_UNIFIED_INITIALIZATION_SYNTAX - : o{Offset(), Offset(), Offset()}, no{Offset(), Offset(), Offset()} + : o{Offset(), Offset(), Offset()}, no{Offset(), Offset(), Offset()}, face_number(-1) {} #else { set_offsets(); + face_number = -1; } #endif @@ -70,7 +71,7 @@ public: const Vertex_handle& v2) #ifndef CGAL_CFG_NO_CPP0X_UNIFIED_INITIALIZATION_SYNTAX : V{v0, v1, v2}, - o{Offset(), Offset(), Offset()}, no{Offset(), Offset(), Offset()} + o{Offset(), Offset(), Offset()}, no{Offset(), Offset(), Offset()}, face_number(-1) { set_neighbors(); } @@ -79,6 +80,7 @@ public: set_offsets(); set_vertices(v0, v1, v2); set_neighbors(); + face_number = -1; } #endif @@ -91,7 +93,7 @@ public: #ifndef CGAL_CFG_NO_CPP0X_UNIFIED_INITIALIZATION_SYNTAX : V{v0, v1, v2}, N{n0, n1, n2}, - o{Offset(), Offset(), Offset()}, no{Offset(), Offset(), Offset()} + o{Offset(), Offset(), Offset()}, no{Offset(), Offset(), Offset()}, face_number(-1) { set_neighbors(); } @@ -100,6 +102,7 @@ public: set_offsets(); set_vertices(v0, v1, v2); set_neighbors(n0, n1, n2); + face_number = -1; } #endif @@ -200,6 +203,10 @@ public: no[2] = no2; } + void set_neighbor_face_offset(int k, Offset new_o) { + no[k] = new_o; + } + void set_offsets( const Offset& o0, const Offset& o1, const Offset& o2, const Offset& no0, @@ -213,6 +220,10 @@ public: no[2] = no2; } + void set_offset(int k, Offset new_o) { + o[k] = new_o; + } + void set_vertices() { V[0] = V[1] = V[2] = Vertex_handle(); }