Chris@102: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@102: // Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands. Chris@102: // Use, modification and distribution is subject to the Boost Software License, Chris@102: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: Chris@102: #ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP Chris@102: #define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: Chris@102: namespace boost { namespace geometry Chris@102: { Chris@102: Chris@102: namespace strategy { namespace buffer Chris@102: { Chris@102: Chris@102: /*! Chris@102: \brief Create a squared form buffer around a point Chris@102: \ingroup strategies Chris@102: \details This strategy can be used as PointStrategy for the buffer algorithm. Chris@102: It creates a square from each point, where the point lies in the center. Chris@102: It can be applied for points and multi_points, but also for a linestring (if it is degenerate, Chris@102: so consisting of only one point) and for polygons (if it is degenerate). Chris@102: This strategy is only applicable for Cartesian coordinate systems. Chris@102: Chris@102: \qbk{ Chris@102: [heading Example] Chris@102: [buffer_point_square] Chris@102: [heading Output] Chris@102: [$img/strategies/buffer_point_square.png] Chris@102: [heading See also] Chris@102: \* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)] Chris@102: \* [link geometry.reference.strategies.strategy_buffer_point_circle point_circle] Chris@102: } Chris@102: */ Chris@102: class point_square Chris@102: { Chris@102: template Chris@102: < Chris@102: typename Point, Chris@102: typename DistanceType, Chris@102: typename OutputRange Chris@102: > Chris@102: inline void add_point(Point const& point, Chris@102: DistanceType const& distance, Chris@102: DistanceType const& x, Chris@102: DistanceType const& y, Chris@102: OutputRange& output_range) const Chris@102: { Chris@102: typename boost::range_value::type p; Chris@102: set<0>(p, get<0>(point) + x * distance); Chris@102: set<1>(p, get<1>(point) + y * distance); Chris@102: output_range.push_back(p); Chris@102: } Chris@102: Chris@102: template Chris@102: < Chris@102: typename Point, Chris@102: typename DistanceType, Chris@102: typename OutputRange Chris@102: > Chris@102: inline void add_points(Point const& point, Chris@102: DistanceType const& distance, Chris@102: OutputRange& output_range) const Chris@102: { Chris@102: add_point(point, distance, -1.0, -1.0, output_range); Chris@102: add_point(point, distance, -1.0, +1.0, output_range); Chris@102: add_point(point, distance, +1.0, +1.0, output_range); Chris@102: add_point(point, distance, +1.0, -1.0, output_range); Chris@102: Chris@102: // Close it: Chris@102: output_range.push_back(output_range.front()); Chris@102: } Chris@102: Chris@102: public : Chris@102: Chris@102: #ifndef DOXYGEN_SHOULD_SKIP_THIS Chris@102: //! Fills output_range with a square around point using distance_strategy Chris@102: template Chris@102: < Chris@102: typename Point, Chris@102: typename DistanceStrategy, Chris@102: typename OutputRange Chris@102: > Chris@102: inline void apply(Point const& point, Chris@102: DistanceStrategy const& distance_strategy, Chris@102: OutputRange& output_range) const Chris@102: { Chris@102: add_points(point, distance_strategy.apply(point, point, Chris@102: strategy::buffer::buffer_side_left), output_range); Chris@102: } Chris@102: #endif // DOXYGEN_SHOULD_SKIP_THIS Chris@102: Chris@102: }; Chris@102: Chris@102: Chris@102: }} // namespace strategy::buffer Chris@102: Chris@102: }} // namespace boost::geometry Chris@102: Chris@102: #endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP