$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78346 - in trunk: boost/polygon libs/polygon/test
From: sydorchuk.andriy_at_[hidden]
Date: 2012-05-06 08:25:01
Author: asydorchuk
Date: 2012-05-06 08:24:59 EDT (Sun, 06 May 2012)
New Revision: 78346
URL: http://svn.boost.org/trac/boost/changeset/78346
Log:
Polygon: Fixed segment concept intersects method. Updating tests. Fixing test targets failing on trunk.
Text files modified: 
   trunk/boost/polygon/polygon.hpp                  |     2                                         
   trunk/boost/polygon/polygon_90_set_data.hpp      |    84 ++++++++++++++++++++--------------------
   trunk/boost/polygon/polygon_90_set_traits.hpp    |     2                                         
   trunk/boost/polygon/segment_concept.hpp          |    79 +++++++++++++++++++------------------   
   trunk/libs/polygon/test/polygon_segment_test.cpp |    64 ++++++++++++++++++++++-------           
   5 files changed, 133 insertions(+), 98 deletions(-)
Modified: trunk/boost/polygon/polygon.hpp
==============================================================================
--- trunk/boost/polygon/polygon.hpp	(original)
+++ trunk/boost/polygon/polygon.hpp	2012-05-06 08:24:59 EDT (Sun, 06 May 2012)
@@ -1,6 +1,6 @@
 /*
   Copyright 2008 Intel Corporation
- 
+  
   Use, modification and distribution are subject to the Boost Software License,
   Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
   http://www.boost.org/LICENSE_1_0.txt).
Modified: trunk/boost/polygon/polygon_90_set_data.hpp
==============================================================================
--- trunk/boost/polygon/polygon_90_set_data.hpp	(original)
+++ trunk/boost/polygon/polygon_90_set_data.hpp	2012-05-06 08:24:59 EDT (Sun, 06 May 2012)
@@ -1,6 +1,6 @@
 /*
   Copyright 2008 Intel Corporation
- 
+  
   Use, modification and distribution are subject to the Boost Software License,
   Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
   http://www.boost.org/LICENSE_1_0.txt).
@@ -13,6 +13,7 @@
 #include "transform.hpp"
 #include "interval_concept.hpp"
 #include "rectangle_concept.hpp"
+#include "segment_concept.hpp"
 #include "detail/iterator_points_to_compact.hpp"
 #include "detail/iterator_compact_to_points.hpp"
 #include "polygon_traits.hpp"
@@ -46,7 +47,7 @@
 
     // constructor from an iterator pair over vertex data
     template <typename iT>
-    inline polygon_90_set_data(orientation_2d orient, iT input_begin, iT input_end) : 
+    inline polygon_90_set_data(orientation_2d orient, iT input_begin, iT input_end) :  
       orient_(HORIZONTAL), data_(), dirty_(false), unsorted_(false) {
       dirty_ = true;
       unsorted_ = true;
@@ -54,14 +55,14 @@
     }
 
     // copy constructor
-    inline polygon_90_set_data(const polygon_90_set_data& that) : 
+    inline polygon_90_set_data(const polygon_90_set_data& that) :  
       orient_(that.orient_), data_(that.data_), dirty_(that.dirty_), unsorted_(that.unsorted_) {}
 
     template <typename ltype, typename rtype, typename op_type>
     inline polygon_90_set_data(const polygon_90_set_view<ltype, rtype, op_type>& that);
 
     // copy with orientation change constructor
-    inline polygon_90_set_data(orientation_2d orient, const polygon_90_set_data& that) : 
+    inline polygon_90_set_data(orientation_2d orient, const polygon_90_set_data& that) :  
       orient_(orient), data_(), dirty_(false), unsorted_(false) {
       insert(that, false, that.orient_);
     }
@@ -138,7 +139,7 @@
       insert(begin_input, end_input, orient_);
     }
 
-    inline void insert(const std::pair<coordinate_type, std::pair<coordinate_type, int> >& vertex, bool is_hole = false, 
+    inline void insert(const std::pair<coordinate_type, std::pair<coordinate_type, int> >& vertex, bool is_hole = false,  
                        orientation_2d orient = HORIZONTAL) {
       data_.push_back(vertex);
       if(orient != orient_) std::swap(data_.back().first, data_.back().second.first);
@@ -190,7 +191,7 @@
       }
     }
 
-    // equivalence operator 
+    // equivalence operator  
     inline bool operator==(const polygon_90_set_data& p) const {
       if(orient_ == p.orient()) {
         clean();
@@ -201,7 +202,7 @@
       }
     }
 
-    // inequivalence operator 
+    // inequivalence operator  
     inline bool operator!=(const polygon_90_set_data& p) const {
       return !((*this) == p);
     }
@@ -260,7 +261,7 @@
     //   value_type data;
     //   std::swap(data, data_);
     //   applyBooleanBinaryOp(data.begin(), data.end(),
-    //                        that.begin(), that.end(), boolean_op::BinaryCount<boolean_op::BinaryNot>()); 
+    //                        that.begin(), that.end(), boolean_op::BinaryCount<boolean_op::BinaryNot>());  
     //   return *this;
     // }
     // polygon_90_set_data<coordinate_type>& operator^=(const polygon_90_set_data& that) {
@@ -269,7 +270,7 @@
     //   value_type data;
     //   std::swap(data, data_);
     //   applyBooleanBinaryOp(data.begin(), data.end(),
-    //                        that.begin(), that.end(),  boolean_op::BinaryCount<boolean_op::BinaryXor>()); 
+    //                        that.begin(), that.end(),  boolean_op::BinaryCount<boolean_op::BinaryXor>());  
     //   return *this;
     // }
     // polygon_90_set_data<coordinate_type>& operator&=(const polygon_90_set_data& that) {
@@ -278,7 +279,7 @@
     //   value_type data;
     //   std::swap(data, data_);
     //   applyBooleanBinaryOp(data.begin(), data.end(),
-    //                        that.begin(), that.end(), boolean_op::BinaryCount<boolean_op::BinaryAnd>()); 
+    //                        that.begin(), that.end(), boolean_op::BinaryCount<boolean_op::BinaryAnd>());  
     //   return *this;
     // }
     // polygon_90_set_data<coordinate_type>& operator|=(const polygon_90_set_data& that) {
@@ -312,7 +313,7 @@
     }
 
     void set(const value_type& value, orientation_2d orient) {
-      data_ = value; 
+      data_ = value;  
       orient_ = orient;
       dirty_ = true;
       unsorted_ = true;
@@ -346,11 +347,11 @@
           typename coordinate_traits<coordinate_type>::unsigned_area_type north_bloating) {
       std::vector<rectangle_data<coordinate_type> > rects;
       clean();
-      rects.reserve(data_.size() / 2); 
+      rects.reserve(data_.size() / 2);  
       get(rects);
-      rectangle_data<coordinate_type> convolutionRectangle(interval_data<coordinate_type>(-((coordinate_type)west_bloating), 
+      rectangle_data<coordinate_type> convolutionRectangle(interval_data<coordinate_type>(-((coordinate_type)west_bloating),  
                                                                                           (coordinate_type)east_bloating),
-                                                           interval_data<coordinate_type>(-((coordinate_type)south_bloating), 
+                                                           interval_data<coordinate_type>(-((coordinate_type)south_bloating),  
                                                                                           (coordinate_type)north_bloating));
       for(typename std::vector<rectangle_data<coordinate_type> >::iterator itr = rects.begin();
           itr != rects.end(); ++itr) {
@@ -393,7 +394,7 @@
       if(nyg)
         pt.x(current_pt.x() + east_bloating);
     }
-    static void resize_poly_up(std::vector<point_data<coordinate_type> >& poly, 
+    static void resize_poly_up(std::vector<point_data<coordinate_type> >& poly,  
                                coordinate_type west_bloating,
                                coordinate_type east_bloating,
                                coordinate_type south_bloating,
@@ -416,7 +417,7 @@
       modify_pt(poly[0], prev_pt, current_pt, next_pt, west_bloating, east_bloating, south_bloating, north_bloating);
       remove_colinear_pts(poly);
     }
-    static bool resize_poly_down(std::vector<point_data<coordinate_type> >& poly, 
+    static bool resize_poly_down(std::vector<point_data<coordinate_type> >& poly,  
                                  coordinate_type west_shrinking,
                                  coordinate_type east_shrinking,
                                  coordinate_type south_shrinking,
@@ -452,7 +453,7 @@
       bool found_colinear = true;
       while(found_colinear && poly.size() >= 4) {
         found_colinear = false;
-        typename std::vector<point_data<coordinate_type> >::iterator itr = poly.begin(); 
+        typename std::vector<point_data<coordinate_type> >::iterator itr = poly.begin();  
         itr += poly.size() - 1; //get last element position
         typename std::vector<point_data<coordinate_type> >::iterator itr2 = poly.begin();
         typename std::vector<point_data<coordinate_type> >::iterator itr3 = itr2;
@@ -478,7 +479,7 @@
         poly.erase(poly.end() - count, poly.end());
       }
       return poly.size() >= 4;
-    }    
+    }  
 
     polygon_90_set_data&
     bloat(typename coordinate_traits<coordinate_type>::unsigned_area_type west_bloating,
@@ -496,7 +497,7 @@
         //psref.extents(prerect);
         resize_poly_up((*itr).self_.coords_, west_bloating, east_bloating, south_bloating, north_bloating);
         iterator_geometry_to_set<polygon_90_concept, view_of<polygon_90_concept, polygon_45_data<coordinate_type> > >
-          begin_input(view_as<polygon_90_concept>((*itr).self_), LOW, orient_, false, true, COUNTERCLOCKWISE), 
+          begin_input(view_as<polygon_90_concept>((*itr).self_), LOW, orient_, false, true, COUNTERCLOCKWISE),  
           end_input(view_as<polygon_90_concept>((*itr).self_), HIGH, orient_, false, true, COUNTERCLOCKWISE);
         insert(begin_input, end_input, orient_);
         //polygon_90_set_data<coordinate_type> pstest;
@@ -515,13 +516,13 @@
           //polygon_45_data<coordinate_type> testpoly(*itrh);
           if(resize_poly_down((*itrh).coords_, west_bloating, east_bloating, south_bloating, north_bloating)) {
             iterator_geometry_to_set<polygon_90_concept, view_of<polygon_90_concept, polygon_45_data<coordinate_type> > >
-              begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true), 
+              begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true),  
               end_input2(view_as<polygon_90_concept>(*itrh), HIGH, orient_, true, true);
             insert(begin_input2, end_input2, orient_);
             //polygon_90_set_data<coordinate_type> pstesthole;
             //pstesthole.insert(rect);
             //iterator_geometry_to_set<polygon_90_concept, view_of<polygon_90_concept, polygon_45_data<coordinate_type> > >
-            // begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true); 
+            // begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true);  
             //pstesthole.insert(begin_input2, end_input, orient_);
             //psrefhole.bloat2(west_bloating, east_bloating, south_bloating, north_bloating);
             //if(!equivalence(psrefhole, pstesthole)) {
@@ -559,11 +560,11 @@
         //polygon_45_data<coordinate_type> testpoly((*itr).self_);
         if(resize_poly_down((*itr).self_.coords_, -west_shrinking, -east_shrinking, -south_shrinking, -north_shrinking)) {
           iterator_geometry_to_set<polygon_90_concept, view_of<polygon_90_concept, polygon_45_data<coordinate_type> > >
-            begin_input(view_as<polygon_90_concept>((*itr).self_), LOW, orient_, false, true, COUNTERCLOCKWISE), 
+            begin_input(view_as<polygon_90_concept>((*itr).self_), LOW, orient_, false, true, COUNTERCLOCKWISE),  
             end_input(view_as<polygon_90_concept>((*itr).self_), HIGH, orient_, false, true, COUNTERCLOCKWISE);
           insert(begin_input, end_input, orient_);
           //iterator_geometry_to_set<polygon_90_concept, view_of<polygon_90_concept, polygon_45_data<coordinate_type> > >
-          //  begin_input2(view_as<polygon_90_concept>((*itr).self_), LOW, orient_, false, true, COUNTERCLOCKWISE); 
+          //  begin_input2(view_as<polygon_90_concept>((*itr).self_), LOW, orient_, false, true, COUNTERCLOCKWISE);  
           //polygon_90_set_data<coordinate_type> pstest;
           //pstest.insert(begin_input2, end_input, orient_);
           //psref.shrink2(west_shrinking, east_shrinking, south_shrinking, north_shrinking);
@@ -580,13 +581,13 @@
             //polygon_45_data<coordinate_type> testpoly(*itrh);
             resize_poly_up((*itrh).coords_, -west_shrinking, -east_shrinking, -south_shrinking, -north_shrinking);
             iterator_geometry_to_set<polygon_90_concept, view_of<polygon_90_concept, polygon_45_data<coordinate_type> > >
-              begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true), 
+              begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true),  
               end_input2(view_as<polygon_90_concept>(*itrh), HIGH, orient_, true, true);
             insert(begin_input2, end_input2, orient_);
             //polygon_90_set_data<coordinate_type> pstesthole;
             //pstesthole.insert(rect);
             //iterator_geometry_to_set<polygon_90_concept, view_of<polygon_90_concept, polygon_45_data<coordinate_type> > >
-            //  begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true); 
+            //  begin_input2(view_as<polygon_90_concept>(*itrh), LOW, orient_, true, true);  
             //pstesthole.insert(begin_input2, end_input, orient_);
             //psrefhole.shrink2(west_shrinking, east_shrinking, south_shrinking, north_shrinking);
             //if(!equivalence(psrefhole, pstesthole)) {
@@ -619,13 +620,13 @@
       insert(externalBoundary, true); //note that the set is in a dirty state now
       sort();  //does not apply implicit OR operation
       std::vector<rectangle_data<coordinate_type> > rects;
-      rects.reserve(data_.size() / 2); 
+      rects.reserve(data_.size() / 2);  
       //begin does not apply implicit or operation, this is a dirty range
       form_rectangles(rects, data_.begin(), data_.end(), orient_, rectangle_concept());
       clear();
-      rectangle_data<coordinate_type> convolutionRectangle(interval_data<coordinate_type>(-((coordinate_type)east_shrinking), 
+      rectangle_data<coordinate_type> convolutionRectangle(interval_data<coordinate_type>(-((coordinate_type)east_shrinking),  
                                                                                           (coordinate_type)west_shrinking),
-                                                           interval_data<coordinate_type>(-((coordinate_type)north_shrinking), 
+                                                           interval_data<coordinate_type>(-((coordinate_type)north_shrinking),  
                                                                                           (coordinate_type)south_shrinking));
       for(typename std::vector<rectangle_data<coordinate_type> >::iterator itr = rects.begin();
           itr != rects.end(); ++itr) {
@@ -664,10 +665,10 @@
     }
 
     polygon_90_set_data&
-    resize(coordinate_type west, coordinate_type east, coordinate_type south, coordinate_type north); 
+    resize(coordinate_type west, coordinate_type east, coordinate_type south, coordinate_type north);  
 
     polygon_90_set_data& move(coordinate_type x_delta, coordinate_type y_delta) {
-      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator 
+      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator  
             itr = data_.begin(); itr != data_.end(); ++itr) {
         if(orient_ == orientation_2d(VERTICAL)) {
           (*itr).first += x_delta;
@@ -702,7 +703,7 @@
 
     // scale set
     polygon_90_set_data& scale_up(typename coordinate_traits<coordinate_type>::unsigned_area_type factor) {
-      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator 
+      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator  
             itr = data_.begin(); itr != data_.end(); ++itr) {
         (*itr).first *= (coordinate_type)factor;
         (*itr).second.first *= (coordinate_type)factor;
@@ -711,7 +712,7 @@
     }
     polygon_90_set_data& scale_down(typename coordinate_traits<coordinate_type>::unsigned_area_type factor) {
       typedef typename coordinate_traits<coordinate_type>::coordinate_distance dt;
-      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator 
+      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator  
             itr = data_.begin(); itr != data_.end(); ++itr) {
         (*itr).first = scaling_policy<coordinate_type>::round((dt)((*itr).first) / (dt)factor);
         (*itr).second.first = scaling_policy<coordinate_type>::round((dt)((*itr).second.first) / (dt)factor);
@@ -721,7 +722,7 @@
     }
     template <typename scaling_type>
     polygon_90_set_data& scale(const anisotropic_scale_factor<scaling_type>& scaling) {
-      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator 
+      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator  
             itr = data_.begin(); itr != data_.end(); ++itr) {
         if(orient_ == orientation_2d(VERTICAL)) {
           scaling.scale((*itr).first, (*itr).second.first);
@@ -734,7 +735,7 @@
     }
     template <typename scaling_type>
     polygon_90_set_data& scale_with(const scaling_type& scaling) {
-      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator 
+      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator  
             itr = data_.begin(); itr != data_.end(); ++itr) {
         if(orient_ == orientation_2d(VERTICAL)) {
           scaling.scale((*itr).first, (*itr).second.first);
@@ -747,7 +748,7 @@
     }
     polygon_90_set_data& scale(double factor) {
       typedef typename coordinate_traits<coordinate_type>::coordinate_distance dt;
-      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator 
+      for(typename std::vector<std::pair<coordinate_type, std::pair<coordinate_type, int> > >::iterator  
             itr = data_.begin(); itr != data_.end(); ++itr) {
         (*itr).first = scaling_policy<coordinate_type>::round((dt)((*itr).first) * (dt)factor);
         (*itr).second.first = scaling_policy<coordinate_type>::round((dt)((*itr).second.first) * (dt)factor);
@@ -883,7 +884,7 @@
       return bloat(0, e_total, 0, n_total);
     }
   }
-    
+  
   template <typename coordinate_type, typename property_type>
   class property_merge_90 {
   private:
@@ -906,7 +907,7 @@
     //with unique sets of merged properties to polygons sets in a map keyed by sets of properties
     // T = std::map<std::set<property_type>, polygon_90_set_data<coordiante_type> > or
     // T = std::map<std::vector<property_type>, polygon_90_set_data<coordiante_type> >
-    template <typename ResultType> 
+    template <typename ResultType>  
     inline void merge(ResultType& result) {
       merge_scanline<coordinate_type, property_type, polygon_90_set_data<coordinate_type>, typename ResultType::key_type> ms;
       ms.perform_merge(result, pmd_);
@@ -925,12 +926,12 @@
     inline connectivity_extraction_90() : tsd_(), nodeCount_(0) {}
     inline connectivity_extraction_90(const connectivity_extraction_90& that) : tsd_(that.tsd_),
                                                                           nodeCount_(that.nodeCount_) {}
-    inline connectivity_extraction_90& operator=(const connectivity_extraction_90& that) { 
-      tsd_ = that.tsd_; 
+    inline connectivity_extraction_90& operator=(const connectivity_extraction_90& that) {  
+      tsd_ = that.tsd_;  
       nodeCount_ = that.nodeCount_; {}
       return *this;
     }
-    
+  
     //insert a polygon set graph node, the value returned is the id of the graph node
     inline unsigned int insert(const polygon_90_set_data<coordinate_type>& ps) {
       ps.clean();
@@ -943,7 +944,7 @@
       ps.insert(geoObj);
       return insert(ps);
     }
-    
+  
     //extract connectivity and store the edges in the graph
     //graph must be indexable by graph node id and the indexed value must be a std::set of
     //graph node id
@@ -955,4 +956,3 @@
 }
 }
 #endif
-
Modified: trunk/boost/polygon/polygon_90_set_traits.hpp
==============================================================================
--- trunk/boost/polygon/polygon_90_set_traits.hpp	(original)
+++ trunk/boost/polygon/polygon_90_set_traits.hpp	2012-05-06 08:24:59 EDT (Sun, 06 May 2012)
@@ -24,7 +24,7 @@
   template <typename T>
   struct traits_by_concept<T, rectangle_concept> { typedef rectangle_traits<T> type; };
   template <typename T>
-  struct traits_by_concept<T, segment_concept> { typedef segment_concept<T> type; };
+  struct traits_by_concept<T, segment_concept> { typedef segment_traits<T> type; };
   template <typename T>
   struct traits_by_concept<T, polygon_90_concept> { typedef polygon_traits<T> type; };
   template <typename T>
Modified: trunk/boost/polygon/segment_concept.hpp
==============================================================================
--- trunk/boost/polygon/segment_concept.hpp	(original)
+++ trunk/boost/polygon/segment_concept.hpp	2012-05-06 08:24:59 EDT (Sun, 06 May 2012)
@@ -174,12 +174,12 @@
   typename enable_if<
     typename gtl_and_3<
       y_s_assign,
-        typename is_mutable_segment_concept<
-          typename geometry_concept<Segment1>::type
-        >::type,
-        typename is_segment_concept<
-          typename geometry_concept<Segment2>::type
-        >::type
+      typename is_mutable_segment_concept<
+        typename geometry_concept<Segment1>::type
+      >::type,
+      typename is_segment_concept<
+        typename geometry_concept<Segment2>::type
+      >::type
     >::type,
     Segment1
   >::type &
@@ -338,20 +338,17 @@
     bool
   >::type
   contains(const Segment& segment, const Point& point, bool consider_touch = true ) {
-    if (!on_above_or_below(segment, point)) {
-      rectangle_data<typename segment_coordinate_type<Segment>::type> rect;
-      set_points(rect, low(segment), high(segment));
-      if (area(rect) == 0.0) {
-        if (!consider_touch) {
-          return !equivalence(point, low(segment)) &&
-                 !equivalence(point, high(segment));
-        }
-      }
-      return contains(rect, point, consider_touch);
-    }
-    return false;
+    if (on_above_or_below(segment, point))
+      return false;
+    rectangle_data<typename segment_coordinate_type<Segment>::type> rect;
+    set_points(rect, low(segment), high(segment));
+    if (!contains(rect, point, true))
+      return false;
+    if (!consider_touch && (equivalence(low(segment), point) || equivalence(high(segment), point)))
+      return false;
+    return true;
   }
-
+  
   struct y_s_contains2 : gtl_yes {};
 
   template <typename Segment1, typename Segment2>
@@ -590,21 +587,26 @@
   >::type
   intersects(const Segment1& segment1, const Segment2& segment2,
              bool consider_touch = true) {
-    if (consider_touch) {
-      if (low(segment1) == low(segment2) || low(segment1) == high(segment2) ||
-          high(segment1) == low(segment2) || high(segment1) == high(segment2))
-        return true;
-    }
-    typedef polygon_arbitrary_formation<
-      typename segment_coordinate_type<Segment1>::type
-    > paf;
-    typename paf::Point l1, h1, l2, h2;
-    assign(l1, low(segment1));
-    assign(h1, high(segment1));
-    assign(l2, low(segment2));
-    assign(h2, high(segment2));
-    return paf::intersects(typename paf::half_edge(l1, h1),
-                           typename paf::half_edge(l2, h2));
+    rectangle_data<typename segment_coordinate_type<Segment1>::type> rect1, rect2;
+    set_points(rect1, low(segment1), high(segment1));
+    set_points(rect2, low(segment2), high(segment2));
+    // Check if axis-parallel rectangles containing segments intersect.
+    if (!intersects(rect1, rect2, true))
+      return false;
+    int or1_1 = on_above_or_below(segment1, low(segment2));
+    int or1_2 = on_above_or_below(segment1, high(segment2));
+    if (or1_1 * or1_2 > 0)
+      return false;
+    int or2_1 = on_above_or_below(segment2, low(segment1));
+    int or2_2 = on_above_or_below(segment2, high(segment1));
+    if (or2_1 * or2_2 > 0)
+      return false;
+    if (consider_touch || or1_1 && or1_2 || or2_1 && or2_2)
+      return true;
+    if (or1_1 || or1_2 || or2_1 || or2_2)
+      return false;
+    return intersects(vertical(rect1), vertical(rect2), false) ||
+           intersects(horizontal(rect1), horizontal(rect2), false);
   }
 
   struct y_s_intersect : gtl_yes {};
@@ -713,10 +715,11 @@
         result2 = euclidean_distance(segment1, high(segment2)),
         result3 = euclidean_distance(segment2, low(segment1)),
         result4 = euclidean_distance(segment2, high(segment1));
-    typename segment_distance_type<Segment1>::type
-        subres1 = (result1 < result2) ? result1 : result2,
-        subres2 = (result3 < result4) ? result3 : result4;
-    return (subres1 < subres2) ? subres1 : subres2;
+    if (result2 < result1)
+      result1 = result2;
+    if (result4 < result3)
+      result3 = result4;
+    return (result1 < result3) ? result1 : result3;
   }
 
   template <class T>
Modified: trunk/libs/polygon/test/polygon_segment_test.cpp
==============================================================================
--- trunk/libs/polygon/test/polygon_segment_test.cpp	(original)
+++ trunk/libs/polygon/test/polygon_segment_test.cpp	2012-05-06 08:24:59 EDT (Sun, 06 May 2012)
@@ -34,7 +34,7 @@
   BOOST_CHECK(!(segment1 > segment1));
   BOOST_CHECK(segment1 <= segment2);
   BOOST_CHECK(segment1 >= segment2);
-  
+
   segment1.low(point2);
   segment1.high(point1);
   BOOST_CHECK(segment1.low() == point2);
@@ -80,7 +80,7 @@
   struct segment_traits< Segment<T> > {
     typedef T coordinate_type;
     typedef point_data<T> point_type;
-    
+
     static point_type get(const Segment<T>& segment, direction_1d dir) {
       return dir.to_int() ? segment.p1 : segment.p0;
     }
@@ -150,7 +150,7 @@
 BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test2, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
-  
+
   point_type point1(1, 2);
   point_type point2(2, 4);
   point_type point3(0, 0);
@@ -260,7 +260,7 @@
 
   scale_up(segment1, 3);
   BOOST_CHECK(low(segment1) == point_type(3, 6));
-  BOOST_CHECK(high(segment1) == point_type(12, 18));  
+  BOOST_CHECK(high(segment1) == point_type(12, 18));
 
   scale_down(segment1, 3);
   BOOST_CHECK(low(segment1) == point1);
@@ -321,18 +321,57 @@
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
-  point_type point;
   segment_type segment1 = construct<segment_type>(point_type(0, 0), point_type(2, 2));
   segment_type segment2 = construct<segment_type>(point_type(1, 1), point_type(3, 3));
-  
-  BOOST_CHECK(!intersection(point, segment1, segment2));
-  BOOST_CHECK(intersects(segment1, segment2));
+  segment_type segment3 = construct<segment_type>(point_type(2, 2), point_type(-1, -1));
+  segment_type segment4 = construct<segment_type>(point_type(1, 3), point_type(3, 1));
+  segment_type segment5 = construct<segment_type>(point_type(2, 2), point_type(1, 3));
+
+  BOOST_CHECK(intersects(segment1, segment2, false));
+  BOOST_CHECK(intersects(segment1, segment2, true));
+  BOOST_CHECK(intersects(segment1, segment3, false));
+  BOOST_CHECK(intersects(segment1, segment3, true));
+  BOOST_CHECK(intersects(segment2, segment3, false));
+  BOOST_CHECK(intersects(segment2, segment3, true));
+  BOOST_CHECK(intersects(segment4, segment3, false));
+  BOOST_CHECK(intersects(segment4, segment3, true));
+  BOOST_CHECK(intersects(segment4, segment2, false));
+  BOOST_CHECK(intersects(segment4, segment2, true));
+  BOOST_CHECK(!intersects(segment3, segment5, false));
+  BOOST_CHECK(intersects(segment3, segment5, true));
 }
 
 BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test9, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
+  segment_type segment1 = construct<segment_type>(point_type(0, 0), point_type(0, 2));
+  segment_type segment2 = construct<segment_type>(point_type(0, 1), point_type(0, 3));
+  segment_type segment3 = construct<segment_type>(point_type(0, 1), point_type(0, 2));
+  segment_type segment4 = construct<segment_type>(point_type(0, 2), point_type(0, 3));
+  segment_type segment5 = construct<segment_type>(point_type(0, 2), point_type(2, 2));
+  segment_type segment6 = construct<segment_type>(point_type(0, 1), point_type(1, 1));
+
+  BOOST_CHECK(intersects(segment1, segment1, false));
+  BOOST_CHECK(intersects(segment1, segment1, true));
+  BOOST_CHECK(intersects(segment1, segment2, false));
+  BOOST_CHECK(intersects(segment1, segment2, true));
+  BOOST_CHECK(intersects(segment1, segment3, false));
+  BOOST_CHECK(intersects(segment1, segment3, true));
+  BOOST_CHECK(intersects(segment2, segment3, false));
+  BOOST_CHECK(intersects(segment2, segment3, true));
+  BOOST_CHECK(!intersects(segment1, segment4, false));
+  BOOST_CHECK(intersects(segment1, segment4, true));
+  BOOST_CHECK(!intersects(segment1, segment5, false));
+  BOOST_CHECK(intersects(segment1, segment5, true));
+  BOOST_CHECK(intersects(segment1, segment6, false));
+  BOOST_CHECK(intersects(segment1, segment6, true));
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test10, T, test_types) {
+  typedef point_data<T> point_type;
+  typedef Segment<T> segment_type;
+
   point_type point1(1, 2);
   point_type point2(7, 10);
   segment_type segment1 = construct<segment_type>(point1, point2);
@@ -345,7 +384,7 @@
   BOOST_CHECK(euclidean_distance(segment1, point_type(8, 3)) == 5.0);
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test10, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test11, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
@@ -353,15 +392,8 @@
   segment_type segment2 = construct<segment_type>(point_type(2, 0), point_type(0, 2));
   segment_type segment3 = construct<segment_type>(point_type(1, -7), point_type(10, 5));
   segment_type segment4 = construct<segment_type>(point_type(7, 7), point_type(10, 11));
-  segment_type segment5 = construct<segment_type>(point_type(1, 1), point_type(-1, 3));
-  segment_type segment6 = construct<segment_type>(point_type(0, 0), point_type(1, 1));
 
-  BOOST_CHECK(intersects(segment1, segment2, false));
   BOOST_CHECK(euclidean_distance(segment1, segment2) == 0.0);
-  BOOST_CHECK(!intersects(segment1, segment3, true));
   BOOST_CHECK(euclidean_distance(segment1, segment3) == 5.0);
-  BOOST_CHECK(!intersects(segment1, segment4, true));
   BOOST_CHECK(euclidean_distance(segment1, segment4) == 5.0);
-  BOOST_CHECK(intersects(segment2, segment5, false));
-  BOOST_CHECK(intersects(segment2, segment6, false));
 }