Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r64087 - in sandbox/geometry: boost/geometry/algorithms boost/geometry/strategies boost/geometry/strategies/cartesian libs/geometry/test/algorithms
From: barend.gehrels_at_[hidden]
Date: 2010-07-17 06:46:27


Author: barendgehrels
Date: 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
New Revision: 64087
URL: http://svn.boost.org/trac/boost/changeset/64087

Log:
Added Point-Point strategy to default_strategy for Point-segment
Added some MPL assertions
Updated distance tests
Text files modified:
   sandbox/geometry/boost/geometry/algorithms/distance.hpp | 18 +
   sandbox/geometry/boost/geometry/strategies/cartesian/distance_projected_point.hpp | 24 +
   sandbox/geometry/boost/geometry/strategies/cartesian/distance_pythagoras.hpp | 2
   sandbox/geometry/boost/geometry/strategies/distance.hpp | 47 ++++
   sandbox/geometry/boost/geometry/strategies/distance_result.hpp | 2
   sandbox/geometry/libs/geometry/test/algorithms/distance.cpp | 375 ++++++++++++++++++++++++++-------------
   sandbox/geometry/libs/geometry/test/algorithms/within.cpp | 2
   7 files changed, 327 insertions(+), 143 deletions(-)

Modified: sandbox/geometry/boost/geometry/algorithms/distance.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/distance.hpp (original)
+++ sandbox/geometry/boost/geometry/algorithms/distance.hpp 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
@@ -91,7 +91,10 @@
             <
                 segment_tag,
                 Point,
- typename point_type<Segment>::type
+ typename point_type<Segment>::type,
+ typename cs_tag<Point>::type,
+ typename cs_tag<typename point_type<Segment>::type>::type,
+ Strategy
>::type segment_strategy;
 
         // See remark below.
@@ -125,7 +128,7 @@
             return pp_strategy.apply(point, *boost::begin(range));
         }
 
- // Create efficient strategy
+ // Create comparable (more efficient) strategy
         typedef typename strategy::distance::services::comparable_type<PSStrategy>::type eps_strategy_type;
         eps_strategy_type eps_strategy = strategy::distance::services::get_comparable<PSStrategy>::apply(ps_strategy);
 
@@ -422,7 +425,7 @@
     \param geometry1 first geometry
     \param geometry2 second geometry
     \param strategy strategy to calculate distance between two points
- \return the distance (either a double or a distance_result, (convertable to double))
+ \return the distance
     \note The strategy can be a point-point strategy. In case of distance point-line/point-polygon
         it may also be a point-segment strategy.
     \par Example:
@@ -432,6 +435,15 @@
     \line {
     \until }
  */
+
+/*
+Note, in case of a Compilation Error:
+if you get:
+ - "Failed to specialize function template ..."
+ - "error: no matching function for call to ..."
+for distance, it is probably so that there is no specialization
+for return_type<...> for your strategy.
+*/
 template <typename Geometry1, typename Geometry2, typename Strategy>
 inline typename strategy::distance::services::return_type<Strategy>::type distance(
                 Geometry1 const& geometry1,

Modified: sandbox/geometry/boost/geometry/strategies/cartesian/distance_projected_point.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/strategies/cartesian/distance_projected_point.hpp (original)
+++ sandbox/geometry/boost/geometry/strategies/cartesian/distance_projected_point.hpp 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
@@ -266,19 +266,29 @@
 };
 
 
-template <typename Point, typename PointOfSegment>
-struct default_strategy<segment_tag, Point, PointOfSegment, cartesian_tag, cartesian_tag>
+// Get default-strategy for point-segment distance calculation
+// while still have the possibility to specify point-point distance strategy (PPS)
+// It is used in algorithms/distance.hpp where users specify PPS for distance
+// of point-to-segment or point-to-linestring.
+// Convenient for geographic coordinate systems especially.
+template <typename Point, typename PointOfSegment, typename Strategy>
+struct default_strategy<segment_tag, Point, PointOfSegment, cartesian_tag, cartesian_tag, Strategy>
 {
     typedef strategy::distance::projected_point
     <
         Point,
         PointOfSegment,
         void,
- typename default_strategy
- <
- point_tag, Point, PointOfSegment,
- cartesian_tag, cartesian_tag
- >::type
+ typename boost::mpl::if_
+ <
+ boost::is_void<Strategy>,
+ typename default_strategy
+ <
+ point_tag, Point, PointOfSegment,
+ cartesian_tag, cartesian_tag
+ >::type,
+ Strategy
+ >::type
> type;
 };
 

Modified: sandbox/geometry/boost/geometry/strategies/cartesian/distance_pythagoras.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/strategies/cartesian/distance_pythagoras.hpp (original)
+++ sandbox/geometry/boost/geometry/strategies/cartesian/distance_pythagoras.hpp 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
@@ -309,7 +309,7 @@
 
 
 template <typename Point1, typename Point2>
-struct default_strategy<point_tag, Point1, Point2, cartesian_tag, cartesian_tag>
+struct default_strategy<point_tag, Point1, Point2, cartesian_tag, cartesian_tag, void>
 {
     typedef pythagoras<Point1, Point2> type;
 };

Modified: sandbox/geometry/boost/geometry/strategies/distance.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/strategies/distance.hpp (original)
+++ sandbox/geometry/boost/geometry/strategies/distance.hpp 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
@@ -23,8 +23,15 @@
 namespace strategy { namespace distance { namespace services
 {
 
+
 template <typename Strategy> struct tag {};
-template <typename Strategy> struct return_type {};
+template <typename Strategy> struct return_type
+{
+ BOOST_MPL_ASSERT_MSG
+ (
+ false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY, (types<Strategy>)
+ );
+};
 
 
 /*!
@@ -36,7 +43,14 @@
     typename Point1,
     typename Point2
>
-struct similar_type {};
+struct similar_type
+{
+ BOOST_MPL_ASSERT_MSG
+ (
+ false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY
+ , (types<Strategy, Point1, Point2>)
+ );
+};
 
 template
 <
@@ -44,10 +58,30 @@
     typename Point1,
     typename Point2
>
-struct get_similar {};
+struct get_similar
+{
+ BOOST_MPL_ASSERT_MSG
+ (
+ false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY
+ , (types<Strategy, Point1, Point2>)
+ );
+};
 
-template <typename Strategy> struct comparable_type {};
-template <typename Strategy> struct get_comparable {};
+template <typename Strategy> struct comparable_type
+{
+ BOOST_MPL_ASSERT_MSG
+ (
+ false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY, (types<Strategy>)
+ );
+};
+
+template <typename Strategy> struct get_comparable
+{
+ BOOST_MPL_ASSERT_MSG
+ (
+ false, NOT_IMPLEMENTED_FOR_THIS_STRATEGY, (types<Strategy>)
+ );
+};
 
 template <typename Strategy> struct result_from_distance {};
 
@@ -75,7 +109,8 @@
     typename Point1,
     typename Point2 = Point1,
     typename CsTag1 = typename cs_tag<Point1>::type,
- typename CsTag2 = typename cs_tag<Point2>::type
+ typename CsTag2 = typename cs_tag<Point2>::type,
+ typename UnderlyingStrategy = void
>
 struct default_strategy
 {

Modified: sandbox/geometry/boost/geometry/strategies/distance_result.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/strategies/distance_result.hpp (original)
+++ sandbox/geometry/boost/geometry/strategies/distance_result.hpp 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
@@ -28,7 +28,7 @@
 
 // TODO: rename to "default_distance_result" or services::default_result
 
-template <typename Geometry1, typename Geometry2>
+template <typename Geometry1, typename Geometry2 = Geometry1>
 struct distance_result
 {
     typedef typename strategy::distance::services::return_type

Modified: sandbox/geometry/libs/geometry/test/algorithms/distance.cpp
==============================================================================
--- sandbox/geometry/libs/geometry/test/algorithms/distance.cpp (original)
+++ sandbox/geometry/libs/geometry/test/algorithms/distance.cpp 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
@@ -6,7 +6,7 @@
 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 
-//#define TEST_ARRAY
+#define TEST_ARRAY
 
 #include <sstream>
 
@@ -28,185 +28,312 @@
 #include <test_common/test_point.hpp>
 
 
-template <typename P>
-void test_distance_result()
+namespace bg = boost::geometry;
+
+
+// Define a custom distance strategy
+// For this one, the "taxicab" distance,
+// see http://en.wikipedia.org/wiki/Taxicab_geometry
+
+// For a point-point-distance operation, one typename Point is enough.
+// For a point-segment-distance operation, there is some magic inside
+// using another point type and casting if necessary. Therefore,
+// two point-types are necessary.
+template <typename P1, typename P2 = P1>
+struct taxicab_distance
 {
- typedef typename boost::geometry::distance_result<P, P>::type distance_type;
+ static inline typename boost::geometry::coordinate_type<P1>::type apply(
+ P1 const& p1, P2 const& p2)
+ {
+ using boost::geometry::get;
+ using boost::geometry::math::abs;
+ return abs(get<0>(p1) - get<1>(p2))
+ + abs(get<1>(p1) - get<1>(p2));
+ }
+};
 
-#ifndef TEST_ARRAY
- P p1 = boost::geometry::make<P>(0, 0);
- P p2 = boost::geometry::make<P>(3, 0);
- P p3 = boost::geometry::make<P>(0, 4);
-#else
- P p1, p2, p3;
- boost::geometry::set<0>(p1, 0); boost::geometry::set<1>(p1, 0);
- boost::geometry::set<0>(p2, 3); boost::geometry::set<1>(p2, 0);
- boost::geometry::set<0>(p3, 0); boost::geometry::set<1>(p3, 4);
-#endif
 
- distance_type dr12 = boost::geometry::distance(p1, p2);
- distance_type dr13 = boost::geometry::distance(p1, p3);
- distance_type dr23 = boost::geometry::distance(p2, p3);
 
- BOOST_CHECK_CLOSE(double(dr12), 3.000, 0.001);
- BOOST_CHECK_CLOSE(double(dr13), 4.000, 0.001);
- BOOST_CHECK_CLOSE(double(dr23), 5.000, 0.001);
+namespace boost { namespace geometry { namespace strategy { namespace distance { namespace services
+{
 
- // COMPARABLE TESTS
- {
- namespace services = boost::geometry::strategy::distance::services;
+template <typename P1, typename P2>
+struct tag<taxicab_distance<P1, P2> >
+{
+ typedef strategy_tag_distance_point_point type;
+};
 
- typedef typename services::default_strategy<boost::geometry::point_tag, P>::type strategy_type;
- typedef typename services::comparable_type<strategy_type>::type comparable_strategy_type;
 
- strategy_type strategy;
- comparable_strategy_type comparable_strategy = services::get_comparable<strategy_type>::apply(strategy);
- distance_type comparable = services::result_from_distance<comparable_strategy_type>::apply(comparable_strategy, 3);
+template <typename P1, typename P2>
+struct return_type<taxicab_distance<P1, P2> >
+{
+ typedef typename coordinate_type<P1>::type type;
+};
+
+
+template<typename P1, typename P2, typename PN1, typename PN2>
+struct similar_type<taxicab_distance<P1, P2>, PN1, PN2>
+{
+ typedef taxicab_distance<PN1, PN2> type;
+};
 
- BOOST_CHECK_CLOSE(double(comparable), 9.000, 0.001);
 
- // COMPILATION TESTS (probably obsolete...)
- if (comparable == dr12) {};
- if (comparable < dr12) {};
- if (comparable > dr12) {};
-
- // Check streamability
- std::ostringstream s;
- s << comparable;
-
- // Check comparisons with plain double
- double d = 3.0;
- if (dr12 == d) {};
- if (dr12 < d) {};
- if (dr12 > d) {};
+template<typename P1, typename P2, typename PN1, typename PN2>
+struct get_similar<taxicab_distance<P1, P2>, PN1, PN2>
+{
+ static inline typename similar_type
+ <
+ taxicab_distance<P1, P2>, PN1, PN2
+ >::type apply(taxicab_distance<P1, P2> const& )
+ {
+ return taxicab_distance<PN1, PN2>();
     }
-}
+};
+
+template <typename P1, typename P2>
+struct comparable_type<taxicab_distance<P1, P2> >
+{
+ typedef taxicab_distance<P1, P2> type;
+};
+
+template <typename P1, typename P2>
+struct get_comparable<taxicab_distance<P1, P2> >
+{
+ static inline taxicab_distance<P1, P2> apply(taxicab_distance<P1, P2> const& input)
+ {
+ return input;
+ }
+};
+
+template <typename P1, typename P2>
+struct result_from_distance<taxicab_distance<P1, P2> >
+{
+ template <typename T>
+ static inline typename coordinate_type<P1>::type apply(taxicab_distance<P1, P2> const& , T const& value)
+ {
+ return value;
+ }
+};
+
+
+}}}}} // namespace boost::geometry::strategy::distance::services
+
+
+
 
 template <typename P>
 void test_distance_point()
 {
- P p1;
- boost::geometry::set<0>(p1, 1);
- boost::geometry::set<1>(p1, 1);
-
- P p2;
- boost::geometry::set<0>(p2, 2);
- boost::geometry::set<1>(p2, 2);
+ namespace services = bg::strategy::distance::services;
+ typedef typename bg::distance_result<P>::type return_type;
+
+ {
+ // Basic, trivial test
+
+ P p1;
+ bg::set<0>(p1, 1);
+ bg::set<1>(p1, 1);
+
+ P p2;
+ bg::set<0>(p2, 2);
+ bg::set<1>(p2, 2);
+
+ return_type d = bg::distance(p1, p2);
+ BOOST_CHECK_CLOSE(d, return_type(1.4142135), 0.001);
+
+ // Test specifying strategy manually
+ typename services::default_strategy<bg::point_tag, P>::type strategy;
+
+ d = bg::distance(p1, p2, strategy);
+ BOOST_CHECK_CLOSE(d, return_type(1.4142135), 0.001);
 
- double d = boost::geometry::distance(p1, p2);
- BOOST_CHECK_CLOSE(d, 1.4142135, 0.001);
+ {
+ // Test custom strategy
+ BOOST_CONCEPT_ASSERT( (bg::concept::PointDistanceStrategy<taxicab_distance<P> >) );
+
+ typedef typename services::return_type<taxicab_distance<P> >::type cab_return_type;
+ BOOST_MPL_ASSERT((boost::is_same<cab_return_type, typename bg::coordinate_type<P>::type>));
+
+ taxicab_distance<P> tcd;
+ cab_return_type d = bg::distance(p1, p2, tcd);
+
+ BOOST_CHECK( bg::math::abs(d - cab_return_type(2)) <= cab_return_type(0.01) );
+ }
+ }
+
+
+ {
+ // 3-4-5 angle
+ P p1, p2, p3;
+ bg::set<0>(p1, 0); bg::set<1>(p1, 0);
+ bg::set<0>(p2, 3); bg::set<1>(p2, 0);
+ bg::set<0>(p3, 0); bg::set<1>(p3, 4);
+
+ return_type dr12 = bg::distance(p1, p2);
+ return_type dr13 = bg::distance(p1, p3);
+ return_type dr23 = bg::distance(p2, p3);
+
+ BOOST_CHECK_CLOSE(dr12, return_type(3), 0.001);
+ BOOST_CHECK_CLOSE(dr13, return_type(4), 0.001);
+ BOOST_CHECK_CLOSE(dr23, return_type(5), 0.001);
+ }
+
+
+ {
+ // test comparability
+
+ typedef typename services::default_strategy<bg::point_tag, P>::type strategy_type;
+ typedef typename services::comparable_type<strategy_type>::type comparable_strategy_type;
+
+ strategy_type strategy;
+ comparable_strategy_type comparable_strategy = services::get_comparable<strategy_type>::apply(strategy);
+ return_type comparable = services::result_from_distance<comparable_strategy_type>::apply(comparable_strategy, 3);
+
+ BOOST_CHECK_CLOSE(comparable, return_type(9), 0.001);
+ }
 }
 
 template <typename P>
 void test_distance_segment()
 {
- typedef typename boost::geometry::coordinate_type<P>::type coordinate_type;
+ typedef typename bg::distance_result<P>::type return_type;
+ typedef typename bg::coordinate_type<P>::type coordinate_type;
 
- P s1; boost::geometry::set<0>(s1, 2); boost::geometry::set<1>(s1, 2);
- P s2; boost::geometry::set<0>(s2, 3); boost::geometry::set<1>(s2, 3);
+ P s1; bg::set<0>(s1, 1); bg::set<1>(s1, 1);
+ P s2; bg::set<0>(s2, 4); bg::set<1>(s2, 4);
 
     // Check points left, right, projected-left, projected-right, on segment
- P p1; boost::geometry::set<0>(p1, 0); boost::geometry::set<1>(p1, 0);
- P p2; boost::geometry::set<0>(p2, 4); boost::geometry::set<1>(p2, 4);
- P p3; boost::geometry::set<0>(p3, coordinate_type(2.4)); boost::geometry::set<1>(p3, coordinate_type(2.6));
- P p4; boost::geometry::set<0>(p4, coordinate_type(2.6)); boost::geometry::set<1>(p4, coordinate_type(2.4));
- P p5; boost::geometry::set<0>(p5, 2.5); boost::geometry::set<1>(p5, 2.5);
-
- const boost::geometry::segment<const P> seg(s1, s2);
-
- double d1 = boost::geometry::distance(p1, seg); BOOST_CHECK_CLOSE(d1, 2.8284271, 0.001);
- double d2 = boost::geometry::distance(p2, seg); BOOST_CHECK_CLOSE(d2, 1.4142135, 0.001);
- double d3 = boost::geometry::distance(p3, seg); BOOST_CHECK_CLOSE(d3, 0.141421, 0.001);
- double d4 = boost::geometry::distance(p4, seg); BOOST_CHECK_CLOSE(d4, 0.141421, 0.001);
- double d5 = boost::geometry::distance(p5, seg); BOOST_CHECK_CLOSE(d5, 0.0, 0.001);
-
- // Reverse case
- double dr1 = boost::geometry::distance(seg, p1); BOOST_CHECK_CLOSE(dr1, d1, 0.001);
- double dr2 = boost::geometry::distance(seg, p2); BOOST_CHECK_CLOSE(dr2, d2, 0.001);
+ P p1; bg::set<0>(p1, 0); bg::set<1>(p1, 1);
+ P p2; bg::set<0>(p2, 1); bg::set<1>(p2, 0);
+ P p3; bg::set<0>(p3, 3); bg::set<1>(p3, 1);
+ P p4; bg::set<0>(p4, 1); bg::set<1>(p4, 3);
+ P p5; bg::set<0>(p5, 3); bg::set<1>(p5, 3);
+
+ bg::segment<P const> const seg(s1, s2);
+
+ return_type d1 = bg::distance(p1, seg);
+ return_type d2 = bg::distance(p2, seg);
+ return_type d3 = bg::distance(p3, seg);
+ return_type d4 = bg::distance(p4, seg);
+ return_type d5 = bg::distance(p5, seg);
+
+ BOOST_CHECK_CLOSE(d1, return_type(1), 0.001);
+ BOOST_CHECK_CLOSE(d2, return_type(1), 0.001);
+ BOOST_CHECK_CLOSE(d3, return_type(1.4142135), 0.001);
+ BOOST_CHECK_CLOSE(d4, return_type(1.4142135), 0.001);
+ BOOST_CHECK_CLOSE(d5, return_type(0), 0.001);
+
+ // Reverse case: segment/point instead of point/segment
+ return_type dr1 = bg::distance(seg, p1);
+ return_type dr2 = bg::distance(seg, p2);
+
+ BOOST_CHECK_CLOSE(dr1, d1, 0.001);
+ BOOST_CHECK_CLOSE(dr2, d2, 0.001);
+
+ // Test specifying strategy manually:
+ // 1) point-point-distance
+ typename bg::strategy::distance::services::default_strategy<bg::point_tag, P>::type pp_strategy;
+ d1 = bg::distance(p1, seg, pp_strategy);
+ BOOST_CHECK_CLOSE(d1, return_type(1), 0.001);
+
+ // 2) point-segment-distance
+ typename bg::strategy::distance::services::default_strategy<bg::segment_tag, P>::type ps_strategy;
+ d1 = bg::distance(p1, seg, ps_strategy);
+ BOOST_CHECK_CLOSE(d1, return_type(1), 0.001);
+
+ // 3) custom point strategy
+ taxicab_distance<P> tcd;
+ return_type d = bg::distance(p1, seg, tcd);
+ BOOST_CHECK_CLOSE(d1, return_type(1), 0.001);
 }
 
+
 template <typename P>
 void test_distance_linestring()
 {
- typedef typename boost::geometry::coordinate_type<P>::type coordinate_type;
+ typedef typename bg::distance_result<P>::type return_type;
 
     boost::array<P, 2> points;
- boost::geometry::set<0>(points[0], 1);
- boost::geometry::set<1>(points[0], 1);
- boost::geometry::set<0>(points[1], 3);
- boost::geometry::set<1>(points[1], 3);
+ bg::set<0>(points[0], 1);
+ bg::set<1>(points[0], 1);
+ bg::set<0>(points[1], 3);
+ bg::set<1>(points[1], 3);
 
-#ifndef TEST_ARRAY
- P p = boost::geometry::make<P>(2, 1);
-#else
     P p;
- boost::geometry::set<0>(p, 2); boost::geometry::set<1>(p, 1);
-#endif
+ bg::set<0>(p, 2); bg::set<1>(p, 1);
 
- double d = boost::geometry::distance(p, points);
- BOOST_CHECK_CLOSE(d, 0.70710678, 0.001);
+ return_type d = bg::distance(p, points);
+ BOOST_CHECK_CLOSE(d, return_type(0.70710678), 0.001);
 
-#ifndef TEST_ARRAY
- p = boost::geometry::make<P>(5, 5);
-#else
- boost::geometry::set<0>(p, 5); boost::geometry::set<1>(p, 5);
-#endif
- d = boost::geometry::distance(p, points);
- BOOST_CHECK_CLOSE(d, 2.828427, 0.001);
+ bg::set<0>(p, 5); bg::set<1>(p, 5);
+ d = bg::distance(p, points);
+ BOOST_CHECK_CLOSE(d, return_type(2.828427), 0.001);
 
 
- boost::geometry::linestring<P> line;
-#ifndef TEST_ARRAY
- line.push_back(boost::geometry::make<P>(1,1));
- line.push_back(boost::geometry::make<P>(2,2));
- line.push_back(boost::geometry::make<P>(3,3));
-#else
+ bg::linestring<P> line;
     {
         P lp;
- boost::geometry::set<0>(lp, 1); boost::geometry::set<1>(lp, 1); line.push_back(lp);
- boost::geometry::set<0>(lp, 2); boost::geometry::set<1>(lp, 2); line.push_back(lp);
- boost::geometry::set<0>(lp, 3); boost::geometry::set<1>(lp, 3); line.push_back(lp);
+ bg::set<0>(lp, 1); bg::set<1>(lp, 1); line.push_back(lp);
+ bg::set<0>(lp, 2); bg::set<1>(lp, 2); line.push_back(lp);
+ bg::set<0>(lp, 3); bg::set<1>(lp, 3); line.push_back(lp);
     }
-#endif
 
-#ifndef TEST_ARRAY
- p = boost::geometry::make<P>(5, 5);
-#else
- boost::geometry::set<0>(p, 5); boost::geometry::set<1>(p, 5);
-#endif
+ bg::set<0>(p, 5); bg::set<1>(p, 5);
 
- d = boost::geometry::distance(p, line);
- BOOST_CHECK_CLOSE(d, 2.828427, 0.001);
+ d = bg::distance(p, line);
+ BOOST_CHECK_CLOSE(d, return_type(2.828427), 0.001);
 
- // Reverse case
- d = boost::geometry::distance(line, p);
- BOOST_CHECK_CLOSE(d, 2.828427, 0.001);
+ // Reverse case: line/point instead of point/line
+ d = bg::distance(line, p);
+ BOOST_CHECK_CLOSE(d, return_type(2.828427), 0.001);
 }
 
+
+template <typename P>
+void test_distance_ring()
+{
+ typedef typename bg::distance_result<P>::type return_type;
+
+ bg::linear_ring<P> ring;
+ {
+ P lp;
+ bg::set<0>(lp, 1); bg::set<1>(lp, 1); line.push_back(lp);
+ bg::set<0>(lp, 2); bg::set<1>(lp, 2); line.push_back(lp);
+ bg::set<0>(lp, 3); bg::set<1>(lp, 3); line.push_back(lp);
+ }
+
+ bg::set<0>(p, 5); bg::set<1>(p, 5);
+
+ d = bg::distance(p, line);
+ BOOST_CHECK_CLOSE(d, return_type(2.828427), 0.001);
+
+ // Reverse case: line/point instead of point/line
+ d = bg::distance(line, p);
+ BOOST_CHECK_CLOSE(d, return_type(2.828427), 0.001);
+}
+
+
 template <typename P>
 void test_all()
 {
- test_distance_result<P>();
     test_distance_point<P>();
-// test_distance_segment<P>();
-#ifndef TEST_ARRAY
- //test_distance_linestring<P>();
-#endif
+ test_distance_segment<P>();
+ test_distance_linestring<P>();
 }
 
 int test_main(int, char* [])
 {
 #ifdef TEST_ARRAY
- test_all<int[2]>();
- test_all<float[2]>();
- test_all<double[2]>();
- test_all<test::test_point>(); // located here because of 3D
+ //test_all<int[2]>();
+ //test_all<float[2]>();
+ //test_all<double[2]>();
+ //test_all<test::test_point>(); // located here because of 3D
 #endif
 
- test_all<boost::geometry::point_xy<int> >();
+ test_all<bg::point_xy<int> >();
     test_all<boost::tuple<float, float> >();
- test_all<boost::geometry::point_xy<float> >();
- test_all<boost::geometry::point_xy<double> >();
+ test_all<bg::point_xy<float> >();
+ test_all<bg::point_xy<double> >();
 
     return 0;
 }

Modified: sandbox/geometry/libs/geometry/test/algorithms/within.cpp
==============================================================================
--- sandbox/geometry/libs/geometry/test/algorithms/within.cpp (original)
+++ sandbox/geometry/libs/geometry/test/algorithms/within.cpp 2010-07-17 06:46:25 EDT (Sat, 17 Jul 2010)
@@ -77,5 +77,5 @@
     test_all<boost::geometry::point_xy<boost::numeric_adaptor::gmp_value_type> >();
 #endif
 
- return 0;
+ return 0;
 }


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