From 0913a811a6b290eb450d191b5ba1e34cdc3d2a9a Mon Sep 17 00:00:00 2001 From: Claudia Werner Date: Mon, 3 Dec 2012 09:35:09 +0100 Subject: [PATCH] some cleaning ups in Delaunay_triangulation_sphere --- .../demo/Triangulation_on_sphere_2/main.cpp | 5 +- .../CGAL/Delaunay_triangulation_sphere_2.h | 292 ++++++++---------- 2 files changed, 137 insertions(+), 160 deletions(-) diff --git a/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/main.cpp b/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/main.cpp index 8b7efb77f70..3aa1f60cf44 100644 --- a/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/main.cpp +++ b/Triangulation_on_sphere_2/demo/Triangulation_on_sphere_2/main.cpp @@ -69,8 +69,9 @@ public slots: RTOS tr; tr.insert(lst_pt.begin(),lst_pt.end()); + - + Point_3 center(0,0,0); double scale=1; @@ -80,7 +81,7 @@ public slots: // Instantiate the viewer. viewer->open(lst_pt.begin(),lst_pt.end(),tr,center,scale); - } + } void on_action_Quit_triggered() { close(); diff --git a/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_sphere_2.h b/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_sphere_2.h index f33dad9da68..763571661e8 100644 --- a/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_sphere_2.h +++ b/Triangulation_on_sphere_2/include/CGAL/Delaunay_triangulation_sphere_2.h @@ -49,16 +49,9 @@ public: typedef typename Base::Solid_faces_iterator Solid_faces_iterator; typedef typename Base::Solid_edges_iterator Solid_edges_iterator; typedef typename Base::Contour_edges_iterator Contour_edges_iterator; - - - typedef typename Base::Face::Vertex_list Vertex_list; typedef typename Vertex_list::iterator Vertex_list_iterator; - - - - #ifndef CGAL_CFG_USING_BASE_MEMBER_BUG_2 using Base::cw; using Base::ccw; @@ -97,9 +90,11 @@ public: using Base::circumcenter; #endif + + class Perturbation_order { - const Self *t; -public: + const Self *t; + public: Perturbation_order(const Self *tr) : t(tr) {} @@ -108,14 +103,14 @@ public: } }; - public: +public: //CONSTRUCTORS Delaunay_triangulation_sphere_2(const Gt& gt=Gt()) :Base(Gt(gt)) {} - //CHECK +//CHECK bool is_valid(bool verbose = false, int level = 0) const; bool is_valid_face(Face_handle fh,bool verbose = false, int level = 0 ) const; bool is_valid_vertex(Vertex_handle fh, bool verbose = false, int level = 0) const; @@ -153,7 +148,7 @@ public: Vertex_handle insert_first(const Point &p); Vertex_handle insert_second(const Point &p); Vertex_handle insert_outside_affine_hull_regular(const Point& p); - Vertex_handle insert_in_plane_triangulation(const Point &p, Locate_type lt, Face_handle loc); + Vertex_handle insert_cocircular(const Point &p, Locate_type lt, Face_handle loc); bool test_conflict(const Point &p, Face_handle fh) const; bool update_ghost_faces(Vertex_handle v=Vertex_handle(), bool first = false); @@ -174,7 +169,7 @@ public: Oriented_side power_test(const Face_handle &f,const Point &p, bool perturb = false) const; Oriented_side power_test(const Face_handle& f, int i, const Point &p) const; -//dual + //dual Point dual (Face_handle f) const; Object dual(const Edge &e) const ; Object dual(const Edge_circulator& ec) const; @@ -199,7 +194,8 @@ Stream &write_vertices(Stream &out,std::vector &t) } template - Stream &write_triangulation_to_off_2(Stream &out,Stream &out2){ + Stream &write_triangulation_to_off_2(Stream &out,Stream &out2) +{ // Points of triangulation for (All_faces_iterator it = this->_tds.face_iterator_base_begin(); it !=all_faces_end(); it++) { @@ -232,7 +228,8 @@ template } template -Stream &write_triangulation_to_off(Stream &out) { +Stream &write_triangulation_to_off(Stream &out) +{ std::vector faces; // Points of triangulation @@ -249,7 +246,8 @@ Stream &write_triangulation_to_off(Stream &out) { } template -Stream &write_face_to_off(Stream &out,Face_handle f){ +Stream &write_face_to_off(Stream &out,Face_handle f) +{ for (int i=0 ; i<3 ; i++) { Point p = f->vertex(i)->point(); @@ -264,7 +262,8 @@ Stream &write_face_to_off(Stream &out,Face_handle f){ template -Stream &write_faces_to_off(Stream &out,FaceIt face_begin, FaceIt face_end){ +Stream &write_faces_to_off(Stream &out,FaceIt face_begin, FaceIt face_end) +{ FaceIt fit=face_begin; for(;fit!=face_end;++fit) @@ -281,7 +280,8 @@ Stream &write_faces_to_off(Stream &out,FaceIt face_begin, FaceIt face_end){ } template -Stream &write_edges_to_off(Stream &out,FaceIt face_begin, FaceIt face_end){ +Stream &write_edges_to_off(Stream &out,FaceIt face_begin, FaceIt face_end) +{ FaceIt fit=face_begin; for(;fit!=face_end;++fit) @@ -311,7 +311,6 @@ int insert(InputIterator first, InputIterator last) std::vector points (first, last); std::random_shuffle (points.begin(), points.end()); - //~ spatial_sort (points.begin(), points.end(), geom_traits()); spatial_sort (points.begin(), points.end()); Face_handle hint; @@ -323,36 +322,35 @@ int insert(InputIterator first, InputIterator last) template std::pair get_conflicts_and_boundary(const Point &p, OutputItFaces fit, OutputItBoundaryEdges eit, - Face_handle fh ) const { - CGAL_triangulation_precondition( dimension() == 2); - CGAL_triangulation_precondition(test_conflict(p,fh)); + Face_handle fh ) const +{ + CGAL_triangulation_precondition( dimension() == 2); + CGAL_triangulation_precondition(test_conflict(p,fh)); - *fit++ = fh; //put fh in OutputItFaces - fh->set_in_conflict_flag(1); - std::pair - pit = std::make_pair(fit,eit); - pit = propagate_conflicts(p,fh,0,pit); - pit = propagate_conflicts(p,fh,1,pit); - pit = propagate_conflicts(p,fh,2,pit); + *fit++ = fh; //put fh in OutputItFaces + fh->set_in_conflict_flag(1); + std::pair + pit = std::make_pair(fit,eit); + pit = propagate_conflicts(p,fh,0,pit); + pit = propagate_conflicts(p,fh,1,pit); + pit = propagate_conflicts(p,fh,2,pit); - return std::make_pair(fit,eit); - } - - + return std::make_pair(fit,eit); +} + private: template std::pair propagate_conflicts (const Point &p, Face_handle fh, int i, - std::pair pit) const { - Face_handle fn = fh->neighbor(i); - if (fn->get_in_conflict_flag() ==1){ - return pit; - } - - if (! test_conflict(p,fn)) { + std::pair pit) const +{ + Face_handle fn = fh->neighbor(i); + if (fn->get_in_conflict_flag() ==1) + return pit; + if (! test_conflict(p,fn)) *(pit.second)++ = Edge(fn, fn->index(fh)); - } else { + else { *(pit.first)++ = fn; fn->set_in_conflict_flag(1); int j = fn->index(fh); @@ -360,7 +358,7 @@ propagate_conflicts (const Point &p, Face_handle fh, int i, pit = propagate_conflicts(p,fn,cw(j), pit); } return pit; - } + } }; @@ -384,7 +382,7 @@ power_test(const Face_handle& f, int i, const Point &p) const f->vertex( cw(i))->point(), p) == COLLINEAR); - return power_test(f->vertex(ccw(i))->point(), f->vertex( cw(i))->point(), p); + return power_test(f->vertex(ccw(i))->point(), f->vertex( cw(i))->point(), p); } template < class Gt, class Tds > @@ -411,63 +409,58 @@ power_test(const Point &p0, const Point &p1, const Point &p2, const Point &p, bo if(coplanar_orientation(p0,p2,p,p1)==ON_NEGATIVE_SIDE) return ON_NEGATIVE_SIDE; - return ON_POSITIVE_SIDE; - } + return ON_POSITIVE_SIDE; + } - if(points[0] == &p1){ - if(compare_xyz(p, p1)==SMALLER) - return ON_POSITIVE_SIDE; - if(coplanar_orientation(p1,p0,p,p2)==ON_NEGATIVE_SIDE) - return ON_NEGATIVE_SIDE; - if(coplanar_orientation(p1,p2,p,p0)==ON_NEGATIVE_SIDE) - return ON_NEGATIVE_SIDE; - + if(points[0] == &p1){ + if(compare_xyz(p, p1)==SMALLER) return ON_POSITIVE_SIDE; - } + if(coplanar_orientation(p1,p0,p,p2)==ON_NEGATIVE_SIDE) + return ON_NEGATIVE_SIDE; + if(coplanar_orientation(p1,p2,p,p0)==ON_NEGATIVE_SIDE) + return ON_NEGATIVE_SIDE; + + return ON_POSITIVE_SIDE; + } - if(points[0] == &p2){ - if(compare_xyz(p, p2)==SMALLER) - return ON_POSITIVE_SIDE; - if(coplanar_orientation(p2,p1,p,p0)==ON_NEGATIVE_SIDE) - return ON_NEGATIVE_SIDE; - if(coplanar_orientation(p2,p0,p1,p)==ON_NEGATIVE_SIDE) - return ON_NEGATIVE_SIDE; + if(points[0] == &p2){ + if(compare_xyz(p, p2)==SMALLER) + return ON_POSITIVE_SIDE; + if(coplanar_orientation(p2,p1,p,p0)==ON_NEGATIVE_SIDE) + return ON_NEGATIVE_SIDE; + if(coplanar_orientation(p2,p0,p1,p)==ON_NEGATIVE_SIDE) + return ON_NEGATIVE_SIDE; - return ON_POSITIVE_SIDE; - } + return ON_POSITIVE_SIDE; + } - CGAL_assertion(false); - return ON_NEGATIVE_SIDE; + CGAL_assertion(false); + return ON_NEGATIVE_SIDE; - } +} + - - - template < class Gt, class Tds > - inline - Oriented_side - Delaunay_triangulation_sphere_2:: - power_test(const Point &p, const Point &q, const Point &r) const - { - if(number_of_vertices()==2) - if(orientation_1(p,q)==COLLINEAR) - return ON_POSITIVE_SIDE; - return geom_traits().power_test_2_object()(p,q,r); - } - - - +template < class Gt, class Tds > +inline +Oriented_side +Delaunay_triangulation_sphere_2:: +power_test(const Point &p, const Point &q, const Point &r) const +{ + if(number_of_vertices()==2) + if(orientation_1(p,q)==COLLINEAR) + return ON_POSITIVE_SIDE; + return geom_traits().power_test_2_object()(p,q,r); +} //----------------------------------------------------------------------CHECK---------------------------------------------------------------// template bool Delaunay_triangulation_sphere_2:: is_plane()const{ - bool plane = true; + bool plane = true; + if(dimension()==2) + return false; - if(dimension()==2) - return false; - - if(number_of_vertices() > 3){ + if(number_of_vertices() > 3){ All_vertices_iterator it1 = vertices_begin(), it2(it1), it3(it1), it4(it1); ++it2; @@ -480,13 +473,12 @@ is_plane()const{ if (!plane) return plane; }return true; - } + } - - if(number_of_vertices()==3) + if(number_of_vertices()==3) return true; - return plane; + return plane; } template < class Gt, class Tds > @@ -519,10 +511,9 @@ is_valid(bool verbose, int level ) const //int level case 2 : for(All_faces_iterator it=all_faces_begin(); it!=all_faces_end(); it++) { Orientation s = orientation(it->vertex(0)->point(), it->vertex(1)->point(), it->vertex(2)->point()); - //result = result && ( s == LEFT_TURN || it->is_ghost()); - result = result && (s != NEGATIVE || it->is_ghost()); - CGAL_triangulation_assertion(result); - } + result = result && (s != NEGATIVE || it->is_ghost()); + CGAL_triangulation_assertion(result); + } result = result && (number_of_faces() == 2*(number_of_vertices()) - 4 ); CGAL_triangulation_assertion( result); @@ -589,9 +580,6 @@ test_conflict(const Point &p, Face_handle fh) const //----------------------------------------------------------------------INSERTION-------------------------------------------------------------// - - - template < class Gt, class Tds > typename Delaunay_triangulation_sphere_2::Vertex_handle Delaunay_triangulation_sphere_2:: @@ -612,14 +600,15 @@ insert(const Point &p, Face_handle start) } default: return insert(p, lt, loc, li); - } + } } template < class Gt, class Tds> typename Delaunay_triangulation_sphere_2::Vertex_handle Delaunay_triangulation_sphere_2:: -insert_in_plane_triangulation(const Point &p, Locate_type lt, Face_handle loc){ +insert_cocircular(const Point &p, Locate_type lt, Face_handle loc) +{ CGAL_triangulation_precondition(!test_dim_up(p)); CGAL_triangulation_precondition(dimension()==1); @@ -676,48 +665,42 @@ insert_second(const Point& p) template < class Gt, class Tds > typename Delaunay_triangulation_sphere_2::Vertex_handle Delaunay_triangulation_sphere_2:: -insert(const Point &p, Locate_type lt, Face_handle loc, int li) { - - Vertex_handle v; - - switch (dimension()){ - case -2 : - return insert_first(p); - - case -1: - return insert_second(p); - - case 0: - return insert_outside_affine_hull_regular(p); - - - case 1:{ - if(test_dim_up(p)){ - Face_handle f=all_edges_begin()->first; - Vertex_handle v1=f->vertex(0); - Vertex_handle v2=f->vertex(1); - Vertex_handle v3=f->neighbor(0)->vertex(1); - return insert_outside_affine_hull_regular(p); - } - else - return insert_in_plane_triangulation(p,lt,loc); - } - - case 2:{ - std::vector faces; - std::vector edges; - faces.reserve(32); - edges.reserve(32); - - get_conflicts_and_boundary(p, std::back_inserter(faces), std::back_inserter(edges), loc); - v =this->_tds.star_hole(edges.begin(), edges.end()); - v->set_point(p); - delete_faces(faces.begin(), faces.end()); +insert(const Point &p, Locate_type lt, Face_handle loc, int li) +{ + Vertex_handle v; + switch (dimension()){ + case -2 : + return insert_first(p); + case -1: + return insert_second(p); + case 0: + return insert_outside_affine_hull_regular(p); + case 1:{ + if(test_dim_up(p)){ + Face_handle f=all_edges_begin()->first; + Vertex_handle v1=f->vertex(0); + Vertex_handle v2=f->vertex(1); + Vertex_handle v3=f->neighbor(0)->vertex(1); + return insert_outside_affine_hull_regular(p); + } + else + return insert_cocircular(p,lt,loc); + } + case 2:{ + std::vector faces; + std::vector edges; + faces.reserve(32); + edges.reserve(32); + + get_conflicts_and_boundary(p, std::back_inserter(faces), std::back_inserter(edges), loc); + v =this->_tds.star_hole(edges.begin(), edges.end()); + v->set_point(p); + delete_faces(faces.begin(), faces.end()); - if( lt != FACE ) - update_ghost_faces(v); + if( lt != FACE ) + update_ghost_faces(v); - return v; + return v; } } CGAL_assertion(false); @@ -772,12 +755,8 @@ insert_outside_affine_hull_regular(const Point& p) w=vi; show_vertex(w); } - - } - - - + Vertex_handle v = this->_tds.insert_dim_up( w, conform); v->set_point(p); this->_ghost=all_faces_begin(); @@ -793,13 +772,13 @@ bool Delaunay_triangulation_sphere_2:: update_ghost_faces(Vertex_handle v, bool first) { - bool neg_found=false; + bool neg_found=false; if(dimension()==1){ All_edges_iterator eit=all_edges_begin(); - for (; eit!=all_edges_end(); eit++){ - Face_handle f=eit->first; - Face_handle fn=f->neighbor(0); - Point q=fn->vertex(1)->point(); + for (; eit!=all_edges_end(); eit++){ + Face_handle f=eit->first; + Face_handle fn=f->neighbor(0); + Point q=fn->vertex(1)->point(); if(collinear_between(f->vertex(0)->point(),f->vertex(1)->point(),q)){ f->ghost()=true; neg_found = true; @@ -810,7 +789,7 @@ update_ghost_faces(Vertex_handle v, bool first) } else{//dimension==2 if (first){ //first time dimension 2 - All_faces_iterator fi = all_faces_begin(); + All_faces_iterator fi = all_faces_begin(); for(;fi!=all_faces_end();fi++){ if(orientation(fi)!=POSITIVE){ fi->ghost()=true; @@ -934,7 +913,8 @@ test_dim_down(Vertex_handle v) template bool Delaunay_triangulation_sphere_2:: -test_dim_up(const Point &p) const{ +test_dim_up(const Point &p) const +{ Face_handle f=all_edges_begin()->first; Vertex_handle v1=f->vertex(0); Vertex_handle v2=f->vertex(1); @@ -1099,7 +1079,8 @@ template inline typename Delaunay_triangulation_sphere_2:: Point Delaunay_triangulation_sphere_2:: -dual (Face_handle f)const { +dual (Face_handle f)const +{ CGAL_triangulation_precondition(this->_tds.is_face(f)); CGAL_triangulation_precondition (this->dimension()==2); return circumcenter(f); @@ -1133,11 +1114,6 @@ dual(const All_edges_iterator& ei) const return dual(*ei); } - - - - - } //namespace CGAL #endif // CGAL_Delaunay_triangulation_sphere_2_H