Chris@102
|
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
|
Chris@102
|
2 // Copyright (c) 2012-2014 Barend Gehrels, Amsterdam, the Netherlands.
|
Chris@102
|
3 // Use, modification and distribution is subject to the Boost Software License,
|
Chris@102
|
4 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
5 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
6
|
Chris@102
|
7 #ifndef BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP
|
Chris@102
|
8 #define BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP
|
Chris@102
|
9
|
Chris@102
|
10 #include <cstddef>
|
Chris@102
|
11
|
Chris@102
|
12 #include <boost/range.hpp>
|
Chris@102
|
13
|
Chris@102
|
14 #include <boost/geometry/util/math.hpp>
|
Chris@102
|
15
|
Chris@102
|
16 #include <boost/geometry/strategies/buffer.hpp>
|
Chris@102
|
17
|
Chris@102
|
18
|
Chris@102
|
19 namespace boost { namespace geometry
|
Chris@102
|
20 {
|
Chris@102
|
21
|
Chris@102
|
22 namespace strategy { namespace buffer
|
Chris@102
|
23 {
|
Chris@102
|
24
|
Chris@102
|
25 /*!
|
Chris@102
|
26 \brief Create a squared form buffer around a point
|
Chris@102
|
27 \ingroup strategies
|
Chris@102
|
28 \details This strategy can be used as PointStrategy for the buffer algorithm.
|
Chris@102
|
29 It creates a square from each point, where the point lies in the center.
|
Chris@102
|
30 It can be applied for points and multi_points, but also for a linestring (if it is degenerate,
|
Chris@102
|
31 so consisting of only one point) and for polygons (if it is degenerate).
|
Chris@102
|
32 This strategy is only applicable for Cartesian coordinate systems.
|
Chris@102
|
33
|
Chris@102
|
34 \qbk{
|
Chris@102
|
35 [heading Example]
|
Chris@102
|
36 [buffer_point_square]
|
Chris@102
|
37 [heading Output]
|
Chris@102
|
38 [$img/strategies/buffer_point_square.png]
|
Chris@102
|
39 [heading See also]
|
Chris@102
|
40 \* [link geometry.reference.algorithms.buffer.buffer_7_with_strategies buffer (with strategies)]
|
Chris@102
|
41 \* [link geometry.reference.strategies.strategy_buffer_point_circle point_circle]
|
Chris@102
|
42 }
|
Chris@102
|
43 */
|
Chris@102
|
44 class point_square
|
Chris@102
|
45 {
|
Chris@102
|
46 template
|
Chris@102
|
47 <
|
Chris@102
|
48 typename Point,
|
Chris@102
|
49 typename DistanceType,
|
Chris@102
|
50 typename OutputRange
|
Chris@102
|
51 >
|
Chris@102
|
52 inline void add_point(Point const& point,
|
Chris@102
|
53 DistanceType const& distance,
|
Chris@102
|
54 DistanceType const& x,
|
Chris@102
|
55 DistanceType const& y,
|
Chris@102
|
56 OutputRange& output_range) const
|
Chris@102
|
57 {
|
Chris@102
|
58 typename boost::range_value<OutputRange>::type p;
|
Chris@102
|
59 set<0>(p, get<0>(point) + x * distance);
|
Chris@102
|
60 set<1>(p, get<1>(point) + y * distance);
|
Chris@102
|
61 output_range.push_back(p);
|
Chris@102
|
62 }
|
Chris@102
|
63
|
Chris@102
|
64 template
|
Chris@102
|
65 <
|
Chris@102
|
66 typename Point,
|
Chris@102
|
67 typename DistanceType,
|
Chris@102
|
68 typename OutputRange
|
Chris@102
|
69 >
|
Chris@102
|
70 inline void add_points(Point const& point,
|
Chris@102
|
71 DistanceType const& distance,
|
Chris@102
|
72 OutputRange& output_range) const
|
Chris@102
|
73 {
|
Chris@102
|
74 add_point(point, distance, -1.0, -1.0, output_range);
|
Chris@102
|
75 add_point(point, distance, -1.0, +1.0, output_range);
|
Chris@102
|
76 add_point(point, distance, +1.0, +1.0, output_range);
|
Chris@102
|
77 add_point(point, distance, +1.0, -1.0, output_range);
|
Chris@102
|
78
|
Chris@102
|
79 // Close it:
|
Chris@102
|
80 output_range.push_back(output_range.front());
|
Chris@102
|
81 }
|
Chris@102
|
82
|
Chris@102
|
83 public :
|
Chris@102
|
84
|
Chris@102
|
85 #ifndef DOXYGEN_SHOULD_SKIP_THIS
|
Chris@102
|
86 //! Fills output_range with a square around point using distance_strategy
|
Chris@102
|
87 template
|
Chris@102
|
88 <
|
Chris@102
|
89 typename Point,
|
Chris@102
|
90 typename DistanceStrategy,
|
Chris@102
|
91 typename OutputRange
|
Chris@102
|
92 >
|
Chris@102
|
93 inline void apply(Point const& point,
|
Chris@102
|
94 DistanceStrategy const& distance_strategy,
|
Chris@102
|
95 OutputRange& output_range) const
|
Chris@102
|
96 {
|
Chris@102
|
97 add_points(point, distance_strategy.apply(point, point,
|
Chris@102
|
98 strategy::buffer::buffer_side_left), output_range);
|
Chris@102
|
99 }
|
Chris@102
|
100 #endif // DOXYGEN_SHOULD_SKIP_THIS
|
Chris@102
|
101
|
Chris@102
|
102 };
|
Chris@102
|
103
|
Chris@102
|
104
|
Chris@102
|
105 }} // namespace strategy::buffer
|
Chris@102
|
106
|
Chris@102
|
107 }} // namespace boost::geometry
|
Chris@102
|
108
|
Chris@102
|
109 #endif // BOOST_GEOMETRY_STRATEGIES_CARTESIAN_BUFFER_POINT_SQUARE_HPP
|