Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r78375 - in trunk: boost/polygon boost/polygon/detail libs/polygon/test
From: sydorchuk.andriy_at_[hidden]
Date: 2012-05-07 18:10:54


Author: asydorchuk
Date: 2012-05-07 18:10:46 EDT (Mon, 07 May 2012)
New Revision: 78375
URL: http://svn.boost.org/trac/boost/changeset/78375

Log:
Polygon: fixing Boost.Polygon warnings; replacing on_above_or_below with orientation method; updating tests.
Text files modified:
   trunk/boost/polygon/detail/polygon_set_view.hpp | 36 +++++++-------
   trunk/boost/polygon/polygon.hpp | 10 ++--
   trunk/boost/polygon/polygon_set_data.hpp | 97 +++++++++++++++++++--------------------
   trunk/boost/polygon/segment_concept.hpp | 73 ++++++++++++++++++++++-------
   trunk/libs/polygon/test/gtl_boost_unit_test.cpp | 63 -------------------------
   trunk/libs/polygon/test/polygon_segment_test.cpp | 65 +++++++++++++++++---------
   6 files changed, 168 insertions(+), 176 deletions(-)

Modified: trunk/boost/polygon/detail/polygon_set_view.hpp
==============================================================================
--- trunk/boost/polygon/detail/polygon_set_view.hpp (original)
+++ trunk/boost/polygon/detail/polygon_set_view.hpp 2012-05-07 18:10:46 EDT (Mon, 07 May 2012)
@@ -20,24 +20,24 @@
       //that vertices be "linearly consistent"
       //therefore it doesn't work to fall back on 45-degree
       //booleans for arbitrary angle polygons
- if(0) { //downcast(tmp) ) {
- tmp.clean();
- data_.clear();
- is_45_ = true;
- polygon_set_data<coordinate_type> tmp2;
- tmp2.insert(tmp);
- data_.swap(tmp2.data_);
- dirty_ = false;
- sort();
- } else {
- sort();
- arbitrary_boolean_op<coordinate_type> abo;
- polygon_set_data<coordinate_type> tmp2;
- abo.execute(tmp2, begin(), end(), end(), end(), 0);
- data_.swap(tmp2.data_);
- is_45_ = tmp2.is_45_;
- dirty_ = false;
- }
+ //if(0) { //downcast(tmp) ) {
+ // tmp.clean();
+ // data_.clear();
+ // is_45_ = true;
+ // polygon_set_data<coordinate_type> tmp2;
+ // tmp2.insert(tmp);
+ // data_.swap(tmp2.data_);
+ // dirty_ = false;
+ // sort();
+ //} else {
+ sort();
+ arbitrary_boolean_op<coordinate_type> abo;
+ polygon_set_data<coordinate_type> tmp2;
+ abo.execute(tmp2, begin(), end(), end(), end(), 0);
+ data_.swap(tmp2.data_);
+ is_45_ = tmp2.is_45_;
+ dirty_ = false;
+ //}
     }
   }
 

Modified: trunk/boost/polygon/polygon.hpp
==============================================================================
--- trunk/boost/polygon/polygon.hpp (original)
+++ trunk/boost/polygon/polygon.hpp 2012-05-07 18:10:46 EDT (Mon, 07 May 2012)
@@ -34,6 +34,11 @@
 #include "rectangle_traits.hpp"
 #include "rectangle_concept.hpp"
 
+//segment
+#include "segment_data.hpp"
+#include "segment_traits.hpp"
+#include "segment_concept.hpp"
+
 //algorithms needed by polygon types
 #include "detail/iterator_points_to_compact.hpp"
 #include "detail/iterator_compact_to_points.hpp"
@@ -88,9 +93,4 @@
 
 #include "polygon_set_concept.hpp"
 
-//segment
-#include "segment_data.hpp"
-#include "segment_traits.hpp"
-#include "segment_concept.hpp"
-
 #endif

Modified: trunk/boost/polygon/polygon_set_data.hpp
==============================================================================
--- trunk/boost/polygon/polygon_set_data.hpp (original)
+++ trunk/boost/polygon/polygon_set_data.hpp 2012-05-07 18:10:46 EDT (Mon, 07 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).
@@ -21,7 +21,7 @@
   template <typename T>
   static inline T round_down(double val) {
      T rounded_val = (T)(val);
- if(val < (double)rounded_val)
+ if(val < (double)rounded_val)
         --rounded_val;
      return rounded_val;
   }
@@ -56,11 +56,11 @@
     }
 
     // copy constructor
- inline polygon_set_data(const polygon_set_data& that) :
+ inline polygon_set_data(const polygon_set_data& that) :
       data_(that.data_), dirty_(that.dirty_), unsorted_(that.unsorted_), is_45_(that.is_45_) {}
 
     // copy constructor
- template <typename ltype, typename rtype, int op_type>
+ template <typename ltype, typename rtype, int op_type>
     inline polygon_set_data(const polygon_set_view<ltype, rtype, op_type>& that);
 
     // destructor
@@ -149,10 +149,10 @@
       insert(polygon_object, is_hole, polygon_concept()); }
 
     template <typename polygon_with_holes_type>
- inline void insert(const polygon_with_holes_type& polygon_with_holes_object, bool is_hole,
+ inline void insert(const polygon_with_holes_type& polygon_with_holes_object, bool is_hole,
                        polygon_with_holes_concept ) {
       insert(polygon_with_holes_object, is_hole, polygon_concept());
- for(typename polygon_with_holes_traits<polygon_with_holes_type>::iterator_holes_type itr =
+ for(typename polygon_with_holes_traits<polygon_with_holes_type>::iterator_holes_type itr =
             begin_holes(polygon_with_holes_object);
           itr != end_holes(polygon_with_holes_object); ++itr) {
         insert(*itr, !is_hole, polygon_concept());
@@ -160,12 +160,12 @@
     }
 
     template <typename polygon_with_holes_type>
- inline void insert(const polygon_with_holes_type& polygon_with_holes_object, bool is_hole,
+ inline void insert(const polygon_with_holes_type& polygon_with_holes_object, bool is_hole,
                        polygon_45_with_holes_concept ) {
       insert(polygon_with_holes_object, is_hole, polygon_with_holes_concept()); }
 
     template <typename polygon_with_holes_type>
- inline void insert(const polygon_with_holes_type& polygon_with_holes_object, bool is_hole,
+ inline void insert(const polygon_with_holes_type& polygon_with_holes_object, bool is_hole,
                        polygon_90_with_holes_concept ) {
       insert(polygon_with_holes_object, is_hole, polygon_with_holes_concept()); }
 
@@ -211,7 +211,7 @@
           first_point = previous_point = current_point;
         } else {
           if(previous_point != current_point) {
- element_type elem(edge_type(previous_point, current_point),
+ element_type elem(edge_type(previous_point, current_point),
                               ( previous_point.get(HORIZONTAL) == current_point.get(HORIZONTAL) ? -1 : 1) * multiplier);
             insert_clean(elem);
           }
@@ -221,7 +221,7 @@
       current_point = first_point;
       if(!first_iteration) {
         if(previous_point != current_point) {
- element_type elem(edge_type(previous_point, current_point),
+ element_type elem(edge_type(previous_point, current_point),
                             ( previous_point.get(HORIZONTAL) == current_point.get(HORIZONTAL) ? -1 : 1) * multiplier);
           insert_clean(elem);
         }
@@ -269,14 +269,14 @@
       }
     }
 
- // equivalence operator
+ // equivalence operator
     inline bool operator==(const polygon_set_data& p) const {
       clean();
       p.clean();
       return data_ == p.data_;
     }
 
- // inequivalence operator
+ // inequivalence operator
     inline bool operator!=(const polygon_set_data& p) const {
       return !((*this) == p);
     }
@@ -335,7 +335,7 @@
     }
 
     void set(const value_type& value) {
- data_ = value;
+ data_ = value;
       dirty_ = true;
       unsorted_ = true;
     }
@@ -362,7 +362,7 @@
     resize(coordinate_type resizing, bool corner_fill_arc = false, unsigned int num_circle_segments=0);
 
     template <typename transform_type>
- inline polygon_set_data&
+ inline polygon_set_data&
     transform(const transform_type& tr) {
       std::vector<polygon_with_holes_data<T> > polys;
       get(polys);
@@ -376,7 +376,7 @@
       return *this;
     }
 
- inline polygon_set_data&
+ inline polygon_set_data&
     scale_up(typename coordinate_traits<coordinate_type>::unsigned_area_type factor) {
       for(typename value_type::iterator itr = data_.begin(); itr != data_.end(); ++itr) {
         ::boost::polygon::scale_up((*itr).first.first, factor);
@@ -384,8 +384,8 @@
       }
       return *this;
     }
-
- inline polygon_set_data&
+
+ inline polygon_set_data&
     scale_down(typename coordinate_traits<coordinate_type>::unsigned_area_type factor) {
       for(typename value_type::iterator itr = data_.begin(); itr != data_.end(); ++itr) {
         bool vb = (*itr).first.first.x() == (*itr).first.second.x();
@@ -400,9 +400,9 @@
       dirty_ = true;
       return *this;
     }
-
+
     template <typename scaling_type>
- inline polygon_set_data& scale(polygon_set_data& polygon_set,
+ inline polygon_set_data& scale(polygon_set_data& polygon_set,
                                    const scaling_type& scaling) {
       for(typename value_type::iterator itr = begin(); itr != end(); ++itr) {
         bool vb = (*itr).first.first.x() == (*itr).first.second.x();
@@ -418,7 +418,7 @@
       return *this;
     }
 
- static inline void compute_offset_edge(point_data<long double>& pt1, point_data<long double>& pt2,
+ static inline void compute_offset_edge(point_data<long double>& pt1, point_data<long double>& pt2,
                                            const point_data<long double>& prev_pt,
                                            const point_data<long double>& current_pt,
                                            long double distance, int multiplier) {
@@ -449,17 +449,17 @@
       he2.second.y((long double)(next_pt.y()));
       compute_offset_edge(he1.first, he1.second, prev_pt, current_pt, distance, multiplier);
       compute_offset_edge(he2.first, he2.second, current_pt, next_pt, distance, multiplier);
- typename scanline_base<long double>::compute_intersection_pack pack;
+ typedef scanline_base<long double>::compute_intersection_pack pack;
       point_data<long double> rpt;
       point_data<long double> bisectorpt((he1.second.x()+he2.first.x())/2,
                                          (he1.second.y()+he2.first.y())/2);
       point_data<long double> orig_pt((long double)pt.x(), (long double)pt.y());
       if(euclidean_distance(bisectorpt, orig_pt) < distance/2) {
- if(!pack.compute_lazy_intersection(rpt, he1, he2, true, false)) {
+ if(!pack::compute_lazy_intersection(rpt, he1, he2, true, false)) {
           rpt = he1.second; //colinear offset edges use shared point
         }
       } else {
- if(!pack.compute_lazy_intersection(rpt, he1, std::pair<point_data<long double>, point_data<long double> >(orig_pt, bisectorpt), true, false)) {
+ if(!pack::compute_lazy_intersection(rpt, he1, std::pair<point_data<long double>, point_data<long double> >(orig_pt, bisectorpt), true, false)) {
           rpt = he1.second; //colinear offset edges use shared point
         }
       }
@@ -575,8 +575,8 @@
     }
 
     template <typename geometry_type>
- inline polygon_set_data&
- insert_with_resize_dispatch(const geometry_type& poly, coordinate_type resizing, bool corner_fill_arc, unsigned int num_circle_segments, bool hole,
+ inline polygon_set_data&
+ insert_with_resize_dispatch(const geometry_type& poly, coordinate_type resizing, bool corner_fill_arc, unsigned int num_circle_segments, bool hole,
                                polygon_with_holes_concept tag) {
       insert_with_resize_dispatch(poly, resizing, corner_fill_arc, num_circle_segments, hole, polygon_concept());
       for(typename polygon_with_holes_traits<geometry_type>::iterator_holes_type itr =
@@ -588,14 +588,14 @@
     }
 
     template <typename geometry_type>
- inline polygon_set_data&
- insert_with_resize_dispatch(const geometry_type& poly, coordinate_type resizing, bool corner_fill_arc, unsigned int num_circle_segments, bool hole,
+ inline polygon_set_data&
+ insert_with_resize_dispatch(const geometry_type& poly, coordinate_type resizing, bool corner_fill_arc, unsigned int num_circle_segments, bool hole,
                           polygon_concept tag) {
 
       if (resizing==0)
          return *this;
 
-
+
       // one dimensional used to store CCW/CW flag
       //direction_1d wdir = winding(poly);
       // LOW==CLOCKWISE just faster to type
@@ -640,7 +640,7 @@
         point_data<coordinate_type> normal2( third->y()-second->y(), second->x()-third->x());
         double direction = normal1.x()*normal2.y()- normal2.x()*normal1.y();
         bool convex = direction>0;
-
+
         bool treat_as_concave = !convex;
         if(sizing_sign)
           treat_as_concave = convex;
@@ -653,12 +653,12 @@
         if (prev_concave)
           //TODO missing round_down()
           curr_prev = point_data<T>(first->x()+v.x(),first->y()+v.y());
- else
+ else
           curr_prev = prev_point;
 
            // around concave corners - insert rectangle
            // if previous corner is concave it's point info may be ignored
- if ( treat_as_concave) {
+ if ( treat_as_concave) {
            std::vector<point_data<T> > pts;
 
            pts.push_back(point_data<T>(second->x()+v.x(),second->y()+v.y()));
@@ -679,13 +679,13 @@
            direction_1d winding;
            winding = convex?COUNTERCLOCKWISE:CLOCKWISE;
            if (make_resizing_vertex_list(pts, curr_prev, prev_concave, *first, *second, *third, resizing
- , num_circle_segments, corner_fill_arc))
+ , num_circle_segments, corner_fill_arc))
            {
                if (first_pts.size()) {
                   for (int i=0; i<pts.size(); i++) {
                     sizingSet.insert_vertex_sequence(pts[i].begin(),pts[i].end(),winding,false);
                   }
-
+
                } else {
                   first_pts = pts[0];
                   first_wdir = resize_wdir;
@@ -694,7 +694,7 @@
                   }
                }
                prev_point = curr_prev;
-
+
            } else {
               treat_as_concave = true;
            }
@@ -717,7 +717,7 @@
           first_pts[first_pts.size()-1]=prev_point;
       }
       sizingSet.insert_vertex_sequence(first_pts.begin(),first_pts.end(),first_wdir,false);
-
+
       polygon_set_data<coordinate_type> tmp;
 
       //insert original shape
@@ -731,7 +731,7 @@
 
 
     inline polygon_set_data&
- interact(const polygon_set_data& that);
+ interact(const polygon_set_data& that);
 
     inline bool downcast(polygon_45_set_data<coordinate_type>& result) const {
       if(!is_45_) return false;
@@ -820,7 +820,7 @@
 // }
 
   template <typename T>
- inline int make_resizing_vertex_list(std::vector<std::vector<point_data< T> > >& return_points,
+ inline int make_resizing_vertex_list(std::vector<std::vector<point_data< T> > >& return_points,
                        point_data<T>& curr_prev, bool ignore_prev_point,
                        point_data< T> start, point_data<T> middle, point_data< T> end,
                        double sizing_distance, unsigned int num_circle_segments, bool corner_fill_arc) {
@@ -853,7 +853,7 @@
          int num = make_arc(return_points[return_points.size()-1],mid1_offset,mid2_offset,dmid,sizing_distance,num_circle_segments);
          curr_prev = round_down<T>(mid2_offset);
          return num;
-
+
       }
 
       std::pair<point_data<double>,point_data<double> > he1(start_offset,mid1_offset);
@@ -891,21 +891,21 @@
   // returnPoints will start with the first point after start
   // returnPoints vector may be empty
   template <typename T>
- inline int make_arc(std::vector<point_data< T> >& return_points,
+ inline int make_arc(std::vector<point_data< T> >& return_points,
                        point_data< double> start, point_data< double> end,
                        point_data< double> center, double r, unsigned int num_circle_segments) {
       const double our_pi=3.1415926535897932384626433832795028841971;
 
- // derive start and end angles
+ // derive start and end angles
       double ps = atan2(start.y()-center.y(), start.x()-center.x());
       double pe = atan2(end.y()-center.y(), end.x()-center.x());
- if (ps < 0.0)
+ if (ps < 0.0)
          ps += 2.0 * our_pi;
- if (pe <= 0.0)
+ if (pe <= 0.0)
          pe += 2.0 * our_pi;
- if (ps >= 2.0 * our_pi)
+ if (ps >= 2.0 * our_pi)
          ps -= 2.0 * our_pi;
- while (pe <= ps)
+ while (pe <= ps)
          pe += 2.0 * our_pi;
       double delta_angle = (2.0 * our_pi) / (double)num_circle_segments;
       if ( start==end) // full circle?
@@ -951,12 +951,12 @@
     inline connectivity_extraction() : ce_(), nodeCount_(0) {}
     inline connectivity_extraction(const connectivity_extraction& that) : ce_(that.ce_),
                                                                           nodeCount_(that.nodeCount_) {}
- inline connectivity_extraction& operator=(const connectivity_extraction& that) {
- ce_ = that.ce_;
+ inline connectivity_extraction& operator=(const connectivity_extraction& that) {
+ ce_ = that.ce_;
       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_set_data<coordinate_type>& ps) {
       ps.clean();
@@ -969,7 +969,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
@@ -1007,4 +1007,3 @@
 #include "polygon_set_concept.hpp"
 #include "detail/minkowski.hpp"
 #endif
-

Modified: trunk/boost/polygon/segment_concept.hpp
==============================================================================
--- trunk/boost/polygon/segment_concept.hpp (original)
+++ trunk/boost/polygon/segment_concept.hpp 2012-05-07 18:10:46 EDT (Mon, 07 May 2012)
@@ -12,7 +12,6 @@
 #include "segment_data.hpp"
 #include "segment_traits.hpp"
 #include "rectangle_concept.hpp"
-#include "detail/polygon_arbitrary_formation.hpp"
 
 namespace boost { namespace polygon{
   struct segment_concept {};
@@ -296,13 +295,57 @@
     set(segment, HIGH, point);
   }
 
- struct y_s_on_above_or_below : gtl_yes {};
+ struct y_s_orientation1 : gtl_yes {};
 
- // -1 for below, 0 for on and 1 for above
+ // -1 for CW, 0 for collinear and 1 for CCW.
+ template <typename Segment1, typename Segment2>
+ typename enable_if<
+ typename gtl_and_3<
+ y_s_orientation1,
+ typename is_segment_concept<
+ typename geometry_concept<Segment1>::type
+ >::type,
+ typename is_segment_concept<
+ typename geometry_concept<Segment2>::type
+ >::type
+ >::type,
+ int
+ >::type
+ orientation(const Segment1& segment1, const Segment2& segment2) {
+ typedef typename coordinate_traits<
+ typename segment_traits<Segment1>::coordinate_type
+ >::manhattan_area_type int_x2;
+ typedef typename coordinate_traits<
+ typename segment_traits<Segment1>::coordinate_type
+ >::unsigned_area_type uint_x2;
+ int_x2 a1 = (int_x2)x(high(segment1)) - (int_x2)x(low(segment1));
+ int_x2 b1 = (int_x2)y(high(segment1)) - (int_x2)y(low(segment1));
+ int_x2 a2 = (int_x2)x(high(segment2)) - (int_x2)x(low(segment2));
+ int_x2 b2 = (int_x2)y(high(segment2)) - (int_x2)y(low(segment2));
+
+ int sign1 = 0;
+ int sign2 = 0;
+ if (a1 && b2)
+ sign1 = ((a1 > 0) ^ (b2 > 0)) ? -1 : 1;
+ if (a2 && b1)
+ sign2 = ((a2 > 0) ^ (b1 > 0)) ? -1 : 1;
+
+ if (sign1 != sign2)
+ return (sign1 < sign2) ? -1 : 1;
+ uint_x2 a3 = (uint_x2)(a1 < 0 ? -a1 : a1) * (uint_x2)(b2 < 0 ? -b2 : b2);
+ uint_x2 b3 = (uint_x2)(b1 < 0 ? -b1 : b1) * (uint_x2)(a2 < 0 ? -a2 : a2);
+ if (a3 == b3)
+ return 0;
+ return ((a3 < b3) ^ (sign1 == 1)) ? 1 : -1;
+ }
+
+ struct y_s_orientation2 : gtl_yes {};
+
+ // -1 for right, 0 for collinear and 1 for left.
   template <typename Segment, typename Point>
   typename enable_if<
     typename gtl_and_3<
- y_s_on_above_or_below,
+ y_s_orientation2,
       typename is_segment_concept<
         typename geometry_concept<Segment>::type
>::type,
@@ -312,15 +355,9 @@
>::type,
     int
>::type
- on_above_or_below(const Segment& segment, const Point& point) {
- typedef polygon_arbitrary_formation<
- typename segment_coordinate_type<Segment>::type
- > paf;
- typename paf::Point pt, l, h;
- assign(pt, point);
- assign(l, low(segment));
- assign(h, high(segment));
- return paf::on_above_or_below(pt, typename paf::half_edge(l, h));
+ orientation(const Segment& segment, const Point& point) {
+ Segment segment2 = construct<Segment>(high(segment), point);
+ return orientation(segment, segment2);
   }
 
   struct y_s_contains : gtl_yes {};
@@ -339,7 +376,7 @@
     bool
>::type
   contains(const Segment& segment, const Point& point, bool consider_touch = true ) {
- if (on_above_or_below(segment, point))
+ if (orientation(segment, point))
       return false;
     rectangle_data<typename segment_coordinate_type<Segment>::type> rect;
     set_points(rect, low(segment), high(segment));
@@ -594,12 +631,12 @@
     // 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));
+ int or1_1 = orientation(segment1, low(segment2));
+ int or1_2 = orientation(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));
+ int or2_1 = orientation(segment2, low(segment1));
+ int or2_2 = orientation(segment2, high(segment1));
     if (or2_1 * or2_2 > 0)
       return false;
     if (consider_touch || or1_1 && or1_2 || or2_1 && or2_2)

Modified: trunk/libs/polygon/test/gtl_boost_unit_test.cpp
==============================================================================
--- trunk/libs/polygon/test/gtl_boost_unit_test.cpp (original)
+++ trunk/libs/polygon/test/gtl_boost_unit_test.cpp 2012-05-07 18:10:46 EDT (Mon, 07 May 2012)
@@ -3645,69 +3645,6 @@
       }
     }
   }
- {
- using namespace gtl;
- typedef point_data<int> Point;
- typedef segment_data<int> Segment;
- Point pt1(0, 0);
- Point pt2(10, 10);
- Point pt3(20, 20);
- Point pt4(20, 0);
- Segment dls1(pt1, pt2);
- Segment dls2(pt1, pt3);
- Segment dls3(pt1, pt4);
- Segment dls4(pt2, pt1);
- bool b1 = equivalence(dls1, dls1);
- bool b2 = equivalence(dls1, dls2);
- bool b3 = equivalence(dls1, dls3);
- bool b4 = equivalence(dls1, dls4);
- if(!b1 || b2 || b3 || b4) {
- std::cout << "fail1\n";
- return 1;
- }
- low(dls1, pt1);
- if(!equivalence(low(dls1), pt1)) {
- std::cout << "fail2\n";
- return 1;
- }
- high(dls1, pt2);
- assert_s(equivalence(high(dls1), pt2), "fail3");
- assign(dls1, dls4);
- assert_s(equivalence(dls1, dls4), "fail4");
- assert_s(!contains(dls1, dls2), "fail5");
- assert_s(contains(dls2, dls1), "fail5");
- assert_s(!contains(dls2, dls1, false), "fail6");
- assert_s(center(dls1) == Point(5, 5), "center");
- assert_s(length(dls3) == 20, "length");
- scale_up(dls3, 10);
- assert_s(length(dls3) == 200, "length2");
- scale_down(dls3, 10);
- assert_s(length(dls3) == 20, "length3");
- scale(dls3, anisotropic_scale_factor<double>(1.5, 1.5, 1.5));
- assert_s(length(dls3) == 30, "length4");
- axis_transformation atr(axis_transformation::WS);
- transform(dls3, atr);
- assert_s(equivalence(high(dls3), Point(-30, 0)), "transform");
- move(dls3, HORIZONTAL, 30);
- assert_s(equivalence(high(dls3), pt1), "move");
- convolve(dls3, pt2);
- assert_s(equivalence(high(dls3), pt2), "convolve");
- deconvolve(dls3, pt2);
- assert_s(equivalence(high(dls3), pt1), "deconvolve");
- assert_s(euclidean_distance(dls3, pt1) == 0.0, "distance1");
- assert_s(euclidean_distance(dls3, pt2) == 10.0, "distance2");
- std::cout << euclidean_distance(dls3, Point(5, 5)) << std::endl;
- std::cout << dls1 << std::endl;
- std::cout << euclidean_distance(dls1, Point(5, 5)) << std::endl;
- std::cout << euclidean_distance(dls1, Point(15, 15)) << std::endl;
- std::cout << euclidean_distance(dls1, Point(5, 6)) << std::endl;
- std::cout << euclidean_distance(dls1, Point(5, 3)) << std::endl;
- std::cout << euclidean_distance(dls1, dls3) << std::endl;
- std::cout << euclidean_distance(dls1, segment_data<int>(Point(2, 0), Point(3, 0))) << std::endl;
- assert_s(intersects(dls1, dls3), "intersects1");
- assert_s(!intersects(dls1, segment_data<int>(Point(2, 0), Point(3, 0))), "intersects2");
- assert_s(abuts(dls1, dls2), "abuts");
- }
 
   std::cout << "ALL TESTS COMPLETE\n";
   return 0;

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-07 18:10:46 EDT (Mon, 07 May 2012)
@@ -164,27 +164,46 @@
   segment_type segment2 = construct<segment_type>(point2, point1);
   segment_type segment3 = construct<segment_type>(point1, point5);
 
- BOOST_CHECK(on_above_or_below(segment1, point1) == 0);
- BOOST_CHECK(on_above_or_below(segment1, point2) == 0);
- BOOST_CHECK(on_above_or_below(segment1, point3) == 0);
- BOOST_CHECK(on_above_or_below(segment1, point4) == 0);
- BOOST_CHECK(on_above_or_below(segment1, point5) == 1);
- BOOST_CHECK(on_above_or_below(segment2, point5) == 1);
- BOOST_CHECK(on_above_or_below(segment1, point6) == -1);
- BOOST_CHECK(on_above_or_below(segment2, point6) == -1);
- BOOST_CHECK(on_above_or_below(segment1, point7) == 1);
- BOOST_CHECK(on_above_or_below(segment2, point7) == 1);
- BOOST_CHECK(on_above_or_below(segment1, point8) == 0);
- BOOST_CHECK(on_above_or_below(segment1, point9) == -1);
- BOOST_CHECK(on_above_or_below(segment2, point9) == -1);
- BOOST_CHECK(on_above_or_below(segment3, point6) == -1);
- BOOST_CHECK(on_above_or_below(segment3, point3) == 1);
+ BOOST_CHECK(orientation(segment1, point1) == 0);
+ BOOST_CHECK(orientation(segment1, point2) == 0);
+ BOOST_CHECK(orientation(segment1, point3) == 0);
+ BOOST_CHECK(orientation(segment1, point4) == 0);
+ BOOST_CHECK(orientation(segment1, point5) == 1);
+ BOOST_CHECK(orientation(segment2, point5) == -1);
+ BOOST_CHECK(orientation(segment1, point6) == -1);
+ BOOST_CHECK(orientation(segment2, point6) == 1);
+ BOOST_CHECK(orientation(segment1, point7) == 1);
+ BOOST_CHECK(orientation(segment2, point7) == -1);
+ BOOST_CHECK(orientation(segment1, point8) == 0);
+ BOOST_CHECK(orientation(segment1, point9) == -1);
+ BOOST_CHECK(orientation(segment2, point9) == 1);
+ BOOST_CHECK(orientation(segment3, point6) == -1);
+ BOOST_CHECK(orientation(segment3, point3) == 1);
 }
 
 BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test3, 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(1, 2));
+ segment_type segment2 = construct<segment_type>(point_type(0, 0), point_type(2, 4));
+ segment_type segment3 = construct<segment_type>(point_type(0, 0), point_type(2, 3));
+ segment_type segment4 = construct<segment_type>(point_type(0, 0), point_type(2, 5));
+ segment_type segment5 = construct<segment_type>(point_type(0, 2), point_type(2, 0));
+
+ BOOST_CHECK(orientation(segment1, segment2) == 0);
+ BOOST_CHECK(orientation(segment1, segment3) == -1);
+ BOOST_CHECK(orientation(segment3, segment1) == 1);
+ BOOST_CHECK(orientation(segment1, segment4) == 1);
+ BOOST_CHECK(orientation(segment4, segment1) == -1);
+ BOOST_CHECK(orientation(segment1, segment5) == -1);
+ BOOST_CHECK(orientation(segment5, segment1) == 1);
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test4, T, test_types) {
+ typedef point_data<T> point_type;
+ typedef Segment<T> segment_type;
+
   point_type point1(1, 2);
   point_type point2(3, 6);
   point_type point3(2, 4);
@@ -201,7 +220,7 @@
   BOOST_CHECK(!contains(segment, point5, true));
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test4, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test5, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
@@ -221,7 +240,7 @@
   BOOST_CHECK(!contains(segment, point5, true));
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test5, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test6, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
@@ -258,7 +277,7 @@
   }
 };
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test6, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test7, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
@@ -297,7 +316,7 @@
   BOOST_CHECK(high(segment1) == point_type(12, 8));
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test7, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test8, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
@@ -325,7 +344,7 @@
   BOOST_CHECK(!abuts(segment2, segment4));
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test8, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test9, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
@@ -349,7 +368,7 @@
   BOOST_CHECK(intersects(segment3, segment5, true));
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test9, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test10, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 
@@ -376,7 +395,7 @@
   BOOST_CHECK(intersects(segment1, segment6, true));
 }
 
-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;
 
@@ -392,7 +411,7 @@
   BOOST_CHECK(euclidean_distance(segment1, point_type(8, 3)) == 5.0);
 }
 
-BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test11, T, test_types) {
+BOOST_AUTO_TEST_CASE_TEMPLATE(segment_concept_test12, T, test_types) {
   typedef point_data<T> point_type;
   typedef Segment<T> segment_type;
 


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk