diff --git a/Packages/Polygon/changes.txt b/Packages/Polygon/changes.txt index 42ded95ef41..a08b2687629 100644 --- a/Packages/Polygon/changes.txt +++ b/Packages/Polygon/changes.txt @@ -1,3 +1,10 @@ +4.5 (30 October 2001) ++ Susan made a base class for Vertex_data so it can be shared with the + Vertex_data used in generating random polygons (Generator package) ++ Susan changed template parameters of some internal class to make + code sharing easier ++ Susan made traits classes passed by const-ref + 4.4 (21 September 2001) + Fixed a bug in the simplicity test. diff --git a/Packages/Polygon/include/CGAL/Polygon_2_simplicity.h b/Packages/Polygon/include/CGAL/Polygon_2_simplicity.h index 176a7c5f404..3045a3988d1 100644 --- a/Packages/Polygon/include/CGAL/Polygon_2_simplicity.h +++ b/Packages/Polygon/include/CGAL/Polygon_2_simplicity.h @@ -8,7 +8,7 @@ // // ---------------------------------------------------------------------- // -// release : +// release : // release_date : // // file : include/CGAL/Polygon_2_simplicity.h @@ -91,13 +91,13 @@ private: template class Vertex_data ; -template +template class Less_segments { - Vertex_data *m_vertex_data; + typedef VertexData Vertex_data; + Vertex_data *m_vertex_data; bool less_than_in_tree(Vertex_index i, Vertex_index j); public: - Less_segments(Vertex_data *vertex_data) - : m_vertex_data(vertex_data) {} + Less_segments(Vertex_data *vertex_data) : m_vertex_data(vertex_data) {} bool operator()(Vertex_index i, Vertex_index j); }; @@ -106,10 +106,9 @@ class Less_segments { // Although conceptually this data belongs in the tree, it is stored with // the vertices in the Vertex_data structure. -template +template struct Edge_data { - typedef std::set > Tree; + typedef std::set Tree; Edge_data() : is_in_tree(false) {} typename Tree::iterator tree_it; // The iterator of the edge in the tree. // Needed for cross reference. If edge j @@ -121,23 +120,22 @@ struct Edge_data { }; template -class Vertex_data { +class Vertex_data_base { public: - typedef std::set > Tree; + typedef typename PolygonTraits::Point_2 Point_2; - typedef typename PolygonTraits::Point_2 Point_2; - Vertex_data(ForwardIterator begin, ForwardIterator end,PolygonTraits pgnt); // ForwardIterator points_start; std::vector iterators; std::vector m_order_of; std::vector m_idx_at_rank; - std::vector > edges; std::vector::size_type m_size; typename PolygonTraits::Orientation_2 orientation_2; typename PolygonTraits::Less_xy_2 less_xy_2; bool is_simple_result; + Vertex_data_base(ForwardIterator begin, ForwardIterator end, + const PolygonTraits& pgnt); + bool ordered_left_to_right(Vertex_index v1, Vertex_index v2) { return m_order_of[v1.as_int()].as_int() < m_order_of[v2.as_int()].as_int();} @@ -150,13 +148,28 @@ public: ? Vertex_index(m_size-1) : Vertex_index(k.as_int()-1); } + Point_2 point(Vertex_index i) + { return *iterators[i.as_int()];} +// { return points_start[i.as_int()];} +}; + +template +class Vertex_data : public Vertex_data_base { +public: + typedef Less_segments Less_segs; + typedef std::set Tree; + typedef Vertex_data_base Base_class; + + std::vector > edges; + + Vertex_data(ForwardIterator begin, ForwardIterator end, + const PolygonTraits& pgnt); + void left_and_right_index(Vertex_index &left, Vertex_index &right, Vertex_index edge); Vertex_index left_index(Vertex_index edge) { return edges[edge.as_int()].is_left_to_right ? edge : next(edge); } - Point_2 point(Vertex_index i) -// { return points_start[i.as_int()];} - { return *iterators[i.as_int()];} + void sweep(Tree *tree); bool insertion_event(Tree *tree, Vertex_index i, Vertex_index j, Vertex_index k); @@ -166,11 +179,11 @@ public: bool on_right_side(Vertex_index vt, Vertex_index edge, bool above); }; -template +template class Less_vertex_data { - Vertex_data *m_vertex_data; + VertexData *m_vertex_data; public: - Less_vertex_data(Vertex_data *vd) + Less_vertex_data(VertexData *vd) : m_vertex_data(vd) {} bool operator()(Vertex_index i, Vertex_index j); }; @@ -180,8 +193,8 @@ public: // ----- implementation of i_polygon functions. ----- namespace i_polygon { -template -bool Less_segments:: +template +bool Less_segments:: operator()(Vertex_index i, Vertex_index j) { if (m_vertex_data->edges[j.as_int()].is_in_tree) { @@ -191,8 +204,8 @@ operator()(Vertex_index i, Vertex_index j) } } -template -bool Less_segments:: +template +bool Less_segments:: less_than_in_tree(Vertex_index new_edge, Vertex_index tree_edge) { CGAL_polygon_precondition( @@ -215,8 +228,8 @@ less_than_in_tree(Vertex_index new_edge, Vertex_index tree_edge) return true; } -template -bool Less_vertex_data:: +template +bool Less_vertex_data:: operator()(Vertex_index i, Vertex_index j) { return m_vertex_data->less_xy_2( @@ -224,11 +237,10 @@ operator()(Vertex_index i, Vertex_index j) } template -Vertex_data:: -Vertex_data(ForwardIterator begin, ForwardIterator end, - PolygonTraits pgn_traits) -: // points_start(begin), - orientation_2(pgn_traits.orientation_2_object()), +Vertex_data_base:: +Vertex_data_base(ForwardIterator begin, ForwardIterator end, + const PolygonTraits& pgn_traits) +: orientation_2(pgn_traits.orientation_2_object()), less_xy_2(pgn_traits.less_xy_2_object()) { m_size = std::distance(begin, end); @@ -236,14 +248,12 @@ Vertex_data(ForwardIterator begin, ForwardIterator end, m_idx_at_rank.reserve(m_size); iterators.reserve(m_size); m_order_of.insert(m_order_of.end(), m_size, Vertex_order(0)); - edges.insert(edges.end(), m_size, - Edge_data()); for (Index_t i = 0; i< m_size; ++i, ++begin) { m_idx_at_rank.push_back(Vertex_index(i)); iterators.push_back(begin); } std::sort(m_idx_at_rank.begin(), m_idx_at_rank.end(), - Less_vertex_data(this)); + Less_vertex_data(this)); for (Index_t j = 0; j < m_size; ++j) { Vertex_order vo(j); m_order_of[index_at_rank(vo).as_int()] = vo; @@ -262,6 +272,16 @@ left_and_right_index(Vertex_index &left, Vertex_index &right, } } +template +Vertex_data:: +Vertex_data(ForwardIterator begin, ForwardIterator end, + const PolygonTraits& pgn_traits) +: Base_class(begin, end, pgn_traits) +{ + edges.insert(edges.end(), m_size, Edge_data()); +} + + template bool Vertex_data:: insertion_event(Tree *tree, Vertex_index prev_vt, @@ -275,7 +295,7 @@ insertion_event(Tree *tree, Vertex_index prev_vt, case COLLINEAR: return false; } - Edge_data + Edge_data &td_prev = edges[prev_vt.as_int()], &td_mid = edges[mid_vt.as_int()]; td_prev.is_in_tree = false; @@ -331,7 +351,7 @@ replacement_event(Tree *tree, Vertex_index cur_edge, Vertex_index next_edge) { // check if continuation point is on the right side of neighbor segments typedef typename Tree::iterator It; - Edge_data &td = edges[cur_edge.as_int()]; + Edge_data &td = edges[cur_edge.as_int()]; CGAL_polygon_assertion(td.is_in_tree); It cur_seg = td.tree_it; Vertex_index cur_vt = (td.is_left_to_right) ? next_edge : cur_edge; @@ -350,7 +370,7 @@ replacement_event(Tree *tree, Vertex_index cur_edge, Vertex_index next_edge) } } // replace the segment - Edge_data &new_td = + Edge_data &new_td = edges[next_edge.as_int()]; new_td.is_left_to_right = td.is_left_to_right; new_td.is_in_tree = false; @@ -367,7 +387,7 @@ deletion_event(Tree *tree, Vertex_index prev_vt, Vertex_index mid_vt) { // check if continuation point is on the right side of neighbor segments typedef typename Tree::iterator It; - Edge_data + Edge_data &td_prev = edges[prev_vt.as_int()], &td_mid = edges[mid_vt.as_int()]; It prev_seg = td_prev.tree_it, mid_seg = td_mid.tree_it; @@ -434,13 +454,13 @@ sweep(Tree *tree) template bool is_simple_polygon(Iterator points_begin, Iterator points_end, - PolygonTraits polygon_traits) + const PolygonTraits& polygon_traits) { typedef Iterator ForwardIterator; + typedef i_polygon::Vertex_data Vertex_data; typedef std::set > Tree; - i_polygon::Vertex_data - vertex_data(points_begin, points_end, polygon_traits); + i_polygon::Less_segments > Tree; + Vertex_data vertex_data(points_begin, points_end, polygon_traits); Tree tree(&vertex_data); vertex_data.sweep(&tree); return vertex_data.is_simple_result;