diff options
Diffstat (limited to 'boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp')
-rw-r--r-- | boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp | 51 |
1 files changed, 34 insertions, 17 deletions
diff --git a/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp b/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp index 8ad3bbc50d..99e7d9b50f 100644 --- a/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp +++ b/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp @@ -1,8 +1,13 @@ // Boost.Geometry (aka GGL, Generic Geometry Library) -// Copyright (c) 1995, 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. +// Copyright (c) 1995, 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 1995 Maarten Hilferink, Amsterdam, the Netherlands +// This file was modified by Oracle on 2015. +// Modifications copyright (c) 2015, Oracle and/or its affiliates. + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. @@ -15,6 +20,9 @@ #include <cstddef> +#ifdef BOOST_GEOMETRY_DEBUG_DOUGLAS_PEUCKER +#include <iostream> +#endif #include <vector> #include <boost/range.hpp> @@ -23,10 +31,7 @@ #include <boost/geometry/strategies/distance.hpp> - -//#define GL_DEBUG_DOUGLAS_PEUCKER - -#ifdef GL_DEBUG_DOUGLAS_PEUCKER +#ifdef BOOST_GEOMETRY_DEBUG_DOUGLAS_PEUCKER #include <boost/geometry/io/dsv/write.hpp> #endif @@ -126,7 +131,7 @@ namespace detail // because we want to consider a candidate point in between if (size <= 2) { -#ifdef GL_DEBUG_DOUGLAS_PEUCKER +#ifdef BOOST_GEOMETRY_DEBUG_DOUGLAS_PEUCKER if (begin != end) { std::cout << "ignore between " << dsv(begin->p) @@ -140,7 +145,7 @@ namespace detail iterator_type last = end - 1; -#ifdef GL_DEBUG_DOUGLAS_PEUCKER +#ifdef BOOST_GEOMETRY_DEBUG_DOUGLAS_PEUCKER std::cout << "find between " << dsv(begin->p) << " and " << dsv(last->p) << " size=" << size << std::endl; @@ -155,7 +160,7 @@ namespace detail { distance_type dist = ps_distance_strategy.apply(it->p, begin->p, last->p); -#ifdef GL_DEBUG_DOUGLAS_PEUCKER +#ifdef BOOST_GEOMETRY_DEBUG_DOUGLAS_PEUCKER std::cout << "consider " << dsv(it->p) << " at " << double(dist) << ((dist > max_dist) ? " maybe" : " no") @@ -173,7 +178,7 @@ namespace detail // and handle segments in between recursively if ( less()(max_dist, md) ) { -#ifdef GL_DEBUG_DOUGLAS_PEUCKER +#ifdef BOOST_GEOMETRY_DEBUG_DOUGLAS_PEUCKER std::cout << "use " << dsv(candidate->p) << std::endl; #endif @@ -193,6 +198,10 @@ namespace detail OutputIterator out, distance_type max_distance) const { +#ifdef BOOST_GEOMETRY_DEBUG_DOUGLAS_PEUCKER + std::cout << "max distance: " << max_distance + << std::endl << std::endl; +#endif distance_strategy_type strategy; // Copy coordinates, a vector of references to all points @@ -228,8 +237,6 @@ namespace detail } }; - - } #endif // DOXYGEN_NO_DETAIL @@ -269,18 +276,28 @@ public : PointDistanceStrategy >::distance_type distance_type; - typedef distance_type return_type; - template <typename Range, typename OutputIterator> static inline OutputIterator apply(Range const& range, OutputIterator out, - distance_type max_distance) + distance_type const& max_distance) { - return detail::douglas_peucker + namespace services = strategy::distance::services; + + typedef typename services::comparable_type < - Point, PointDistanceStrategy - >().apply(range, out, max_distance); + >::type comparable_distance_strategy_type; + + return detail::douglas_peucker + < + Point, comparable_distance_strategy_type + >().apply(range, out, + services::result_from_distance + < + comparable_distance_strategy_type, Point, Point + >::apply(comparable_distance_strategy_type(), + max_distance) + ); } }; |