summaryrefslogtreecommitdiff
path: root/boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp')
-rw-r--r--boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp b/boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp
new file mode 100644
index 0000000000..bc0c46f644
--- /dev/null
+++ b/boost/geometry/strategies/agnostic/buffer_distance_symmetric.hpp
@@ -0,0 +1,102 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is 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)
+
+#ifndef BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_SYMMETRIC_HPP
+#define BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_SYMMETRIC_HPP
+
+#include <boost/geometry/strategies/buffer.hpp>
+#include <boost/geometry/util/math.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+namespace strategy { namespace buffer
+{
+
+
+/*!
+\brief Let the buffer algorithm create buffers with same distances
+\ingroup strategies
+\tparam NumericType \tparam_numeric
+\details This strategy can be used as DistanceStrategy for the buffer algorithm.
+ It can be applied for all geometries. It uses one distance for left and
+ for right.
+ If the distance is negative and used with a (multi)polygon or ring, the
+ geometry will shrink (deflate) instead of expand (inflate).
+
+\qbk{
+[heading Example]
+[buffer_distance_symmetric]
+[heading Output]
+[$img/strategies/buffer_distance_symmetric.png]
+[heading See also]
+\* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
+\* [link geometry.reference.strategies.strategy_buffer_distance_asymmetric distance_asymmetric]
+}
+ */
+template<typename NumericType>
+class distance_symmetric
+{
+public :
+ //! \brief Constructs the strategy, a distance must be specified
+ //! \param distance The distance (or radius) of the buffer
+ explicit inline distance_symmetric(NumericType const& distance)
+ : m_distance(distance)
+ {}
+
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+ //! Returns the distance-value
+ template <typename Point>
+ inline NumericType apply(Point const& , Point const& ,
+ buffer_side_selector ) const
+ {
+ return negative() ? geometry::math::abs(m_distance) : m_distance;
+ }
+
+ //! Used internally, returns -1 for deflate, 1 for inflate
+ inline int factor() const
+ {
+ return negative() ? -1 : 1;
+ }
+
+ //! Returns true if distance is negative
+ inline bool negative() const
+ {
+ return m_distance < 0;
+ }
+
+ //! Returns the max distance distance up to the buffer will reach
+ template <typename JoinStrategy, typename EndStrategy>
+ inline NumericType max_distance(JoinStrategy const& join_strategy,
+ EndStrategy const& end_strategy) const
+ {
+ NumericType const dist = geometry::math::abs(m_distance);
+ return (std::max)(join_strategy.max_distance(dist),
+ end_strategy.max_distance(dist));
+ }
+
+
+ //! Returns the distance at which the input is simplified before the buffer process
+ inline NumericType simplify_distance() const
+ {
+ return geometry::math::abs(m_distance) / 1000.0;
+ }
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
+private :
+ NumericType m_distance;
+};
+
+
+}} // namespace strategy::buffer
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_STRATEGIES_AGNOSTIC_BUFFER_DISTANCE_SYMMETRIC_HPP