Ticket #8695: 8695.patch

File 8695.patch, 2.8 KB (added by Andrii Sydorchuk, 8 years ago)
  • include/boost/polygon/polygon_set_data.hpp

    diff --git include/boost/polygon/polygon_set_data.hpp include/boost/polygon/polygon_set_data.hpp
    index 41a1b59..3c761d3 100644
    namespace boost { namespace polygon {  
    197197
    198198    template <class iT>
    199199    inline void insert_vertex_sequence(iT begin_vertex, iT end_vertex, direction_1d winding, bool is_hole) {
    200       bool first_iteration = true;
    201       point_type first_point;
    202       point_type previous_point;
    203       point_type current_point;
    204       direction_1d winding_dir = winding;
    205       int multiplier = winding_dir == COUNTERCLOCKWISE ? 1 : -1;
    206       if(is_hole) multiplier *= -1;
    207       for( ; begin_vertex != end_vertex; ++begin_vertex) {
    208         assign(current_point, *begin_vertex);
    209         if(first_iteration) {
    210           first_iteration = false;
    211           first_point = previous_point = current_point;
    212         } else {
    213           if(previous_point != current_point) {
    214             element_type elem(edge_type(previous_point, current_point),
    215                               ( previous_point.get(HORIZONTAL) == current_point.get(HORIZONTAL) ? -1 : 1) * multiplier);
    216             insert_clean(elem);
    217           }
    218         }
    219         previous_point = current_point;
     200      if (begin_vertex == end_vertex) {
     201        // No edges to insert.
     202        return;
     203      }
     204      // Current edge endpoints.
     205      iT vertex0 = begin_vertex;
     206      iT vertex1 = begin_vertex;
     207      if (++vertex1 == end_vertex) {
     208        // No edges to insert.
     209        return;
    220210      }
    221       current_point = first_point;
    222       if(!first_iteration) {
    223         if(previous_point != current_point) {
    224           element_type elem(edge_type(previous_point, current_point),
    225                             ( previous_point.get(HORIZONTAL) == current_point.get(HORIZONTAL) ? -1 : 1) * multiplier);
     211      int wmultiplier = (winding == COUNTERCLOCKWISE) ? 1 : -1;
     212      dirty_ = true;
     213      unsorted_ = true;
     214      while (vertex0 != end_vertex) {
     215        point_type p0, p1;
     216        assign(p0, *vertex0);
     217        assign(p1, *vertex1);
     218        if (p0 != p1) {
     219          int hmultiplier = (p0.get(HORIZONTAL) == p1.get(HORIZONTAL)) ? -1 : 1;
     220          element_type elem(edge_type(p0, p1), hmultiplier * wmultiplier);
    226221          insert_clean(elem);
    227222        }
    228         dirty_ = true;
    229         unsorted_ = true;
     223        ++vertex0;
     224        ++vertex1;
     225        if (vertex1 == end_vertex) {
     226          vertex1 = begin_vertex;
     227        }
    230228      }
    231229    }
    232230
    namespace boost { namespace polygon {  
    271269
    272270    // equivalence operator
    273271    inline bool operator==(const polygon_set_data& p) const;
    274    
     272
    275273    // inequivalence operator
    276274    inline bool operator!=(const polygon_set_data& p) const {
    277275      return !((*this) == p);