Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / geometry / test / algorithms / buffer / buffer_with_strategies.cpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3
4 // Copyright (c) 2015-2019 Barend Gehrels, Amsterdam, the Netherlands.
5
6 // Use, modification and distribution is subject to the Boost Software License,
7 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9
10 #include "geometry_test_common.hpp"
11
12 #include <boost/geometry/algorithms/buffer.hpp>
13
14 #include <boost/geometry/strategies/strategies.hpp>
15
16 #include <boost/geometry/geometries/geometries.hpp>
17
18 // For test
19 #include <boost/geometry/algorithms/area.hpp>
20 #include <boost/geometry/algorithms/correct.hpp>
21 #include <boost/geometry/algorithms/num_points.hpp>
22
23
24 // This unit test tests boost::geometry::buffer (overload with strategies)
25 // More detailed tests are, per geometry type, available in buffer_<TYPE>.cpp
26 // (testing boost::geometry::buffer_inserter)
27
28 // SVG's are not created (they are in detailed tests)
29
30 static std::string const polygon_simplex = "POLYGON ((0 0,1 5,6 1,0 0))";
31 static std::string const polygon_empty = "POLYGON()";
32 static std::string const multi_polygon_empty = "MULTIPOLYGON()";
33 static std::string const multi_polygon_simplex
34     = "MULTIPOLYGON(((0 1,2 5,5 3,0 1)),((1 1,5 2,5 0,1 1)))";
35
36
37 template
38 <
39     typename Geometry,
40     typename GeometryOut,
41     typename JoinStrategy,
42     typename EndStrategy,
43     typename SideStrategy,
44     typename PointStrategy,
45     typename DistanceStrategy
46 >
47 void test_with_strategies(std::string const& caseid,
48         std::string const& wkt,
49         JoinStrategy const& join_strategy,
50         EndStrategy const& end_strategy,
51         SideStrategy const& side_strategy,
52         PointStrategy const& point_strategy,
53         DistanceStrategy const& distance_strategy,
54         double expected_area,
55         std::size_t expected_numpoints,
56         double tolerance = 0.01)
57 {
58     namespace bg = boost::geometry;
59     Geometry g;
60     bg::read_wkt(wkt, g);
61     bg::correct(g);
62
63     GeometryOut result;
64
65     bg::buffer(g, result,
66                 distance_strategy, side_strategy,
67                 join_strategy, end_strategy, point_strategy);
68
69     BOOST_CHECK_MESSAGE
70         (
71             bg::num_points(result) == expected_numpoints,
72             "Buffer " << caseid
73             << " numpoints expected: " << expected_numpoints
74             << " detected: " << bg::num_points(result)
75         );
76
77     double const area = bg::area(result);
78     double const difference = area - expected_area;
79
80     BOOST_CHECK_MESSAGE
81         (
82             bg::math::abs(difference) < tolerance,
83             "Buffer " << caseid
84             << std::setprecision(12)
85             << " area expected: " << expected_area
86             << " detected: " << area
87         );
88 }
89
90
91 template <bool Clockwise, typename Point>
92 void test_all()
93 {
94     typedef bg::model::polygon<Point, Clockwise> polygon;
95     typedef bg::model::multi_polygon<polygon> multi_polygon;
96
97     bg::strategy::buffer::join_round join(160);
98     bg::strategy::buffer::end_round end(160);
99     bg::strategy::buffer::point_circle circle(160);
100     bg::strategy::buffer::side_straight side;
101
102     typedef bg::strategy::buffer::distance_symmetric
103     <
104         typename bg::coordinate_type<Point>::type
105     > distance;
106
107     test_with_strategies<multi_polygon, multi_polygon>(
108         "multi_polygon_empty", multi_polygon_empty,
109         join, end, side, circle, distance(1.0),
110         0.0, 0);
111
112
113     // PostGIS: 34.2550669294223 216 (40 / qcircle)
114     // SQL Server: 34.2550419903829 220 (default options)
115     test_with_strategies<multi_polygon, multi_polygon>(
116         "multi_polygon_simplex", multi_polygon_simplex,
117         join, end, side, circle, distance(1.0),
118         34.2551, 219);
119
120     test_with_strategies<polygon, multi_polygon>(
121         "polygon_empty", polygon_empty,
122         join, end, side, circle, distance(1.0),
123         0.0, 0);
124
125     //
126     // PostGIS: 35.2256914798762 164 (40 / qcircle)
127     // SQL Server: 35.2252355201605 153 (default options)
128     test_with_strategies<polygon, multi_polygon>(
129         "polygon_simplex", polygon_simplex,
130         join, end, side, circle, distance(1.0),
131         35.2257, 166);
132 }
133
134 int test_main(int, char* [])
135 {
136     BoostGeometryWriteTestConfiguration();
137
138     test_all<true, bg::model::point<default_test_type, 2, bg::cs::cartesian> >();
139
140     return 0;
141 }