1 // Boost.Geometry (aka GGL, Generic Geometry Library)
4 // Copyright (c) 2009-2012 Barend Gehrels, Amsterdam, the Netherlands.
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)
10 #define BOOST_GEOMETRY_REPORT_OVERLAY_ERROR
11 #define BOOST_GEOMETRY_NO_BOOST_TEST
13 #include <test_overlay_p_q.hpp>
15 #include <boost/program_options.hpp>
16 #include <boost/random/linear_congruential.hpp>
17 #include <boost/random/uniform_int.hpp>
18 #include <boost/random/uniform_real.hpp>
19 #include <boost/random/variate_generator.hpp>
20 #include <boost/timer.hpp>
23 template <typename Polygon
, typename Generator
>
24 inline void make_polygon(Polygon
& polygon
, Generator
& generator
, bool triangular
)
26 typedef typename
bg::point_type
<Polygon
>::type point_type
;
27 typedef typename
bg::coordinate_type
<Polygon
>::type coordinate_type
;
33 typename
bg::ring_type
<Polygon
>::type
& ring
= bg::exterior_ring(polygon
);
36 bg::set
<0>(p
, x
); bg::set
<1>(p
, y
); ring
.push_back(p
);
37 bg::set
<0>(p
, x
); bg::set
<1>(p
, y
+ 1); ring
.push_back(p
);
38 bg::set
<0>(p
, x
+ 1); bg::set
<1>(p
, y
+ 1); ring
.push_back(p
);
39 bg::set
<0>(p
, x
+ 1); bg::set
<1>(p
, y
); ring
.push_back(p
);
40 bg::set
<0>(p
, x
); bg::set
<1>(p
, y
); ring
.push_back(p
);
44 // Remove a point depending on generator
45 int c
= generator() % 4;
48 ring
.erase(ring
.begin() + c
);
55 template <typename MultiPolygon
, typename Generator
>
56 bool test_recursive_boxes(MultiPolygon
& result
, int& index
,
58 int level
, bool triangular
, p_q_settings
const& settings
)
67 make_polygon(p
.front(), generator
, triangular
);
68 make_polygon(q
.front(), generator
, triangular
);
76 if (! test_recursive_boxes(p
, index
, generator
, level
- 1, triangular
, settings
)
77 || ! test_recursive_boxes(q
, index
, generator
, level
- 1, triangular
, settings
))
83 typedef typename
boost::range_value
<MultiPolygon
>::type polygon
;
85 std::ostringstream out
;
86 out
<< "recursive_box_" << index
++ << "_" << level
;
88 if (! test_overlay_p_q
91 typename
bg::coordinate_type
<MultiPolygon
>::type
92 >(out
.str(), p
, q
, settings
))
98 bg::detail::union_::union_insert
101 >(p
, q
, std::back_inserter(mp
));
104 bg::simplify(mp
, result
, 0.01);
110 template <typename T
, bool Clockwise
, bool Closed
>
111 void test_all(int seed
, int count
, int field_size
, int level
, bool triangular
, p_q_settings
const& settings
)
115 typedef boost::minstd_rand base_generator_type
;
117 base_generator_type
generator(seed
);
119 boost::uniform_int
<> random_coordinate(0, field_size
- 1);
120 boost::variate_generator
<base_generator_type
&, boost::uniform_int
<> >
121 coordinate_generator(generator
, random_coordinate
);
123 typedef bg::model::polygon
125 bg::model::d2::point_xy
<T
>, Clockwise
, Closed
127 typedef bg::model::multi_polygon
<polygon
> mp
;
131 for(int i
= 0; i
< count
; i
++)
134 test_recursive_boxes
<mp
>(p
, index
, coordinate_generator
, level
, triangular
, settings
);
137 << "polygons: " << index
138 << " type: " << string_from_type
<T
>::name()
139 << " time: " << t
.elapsed() << std::endl
;
142 int main(int argc
, char** argv
)
146 namespace po
= boost::program_options
;
147 po::options_description
description("=== recursive_polygons ===\nAllowed options");
150 int seed
= static_cast<unsigned int>(std::time(0));
155 p_q_settings settings
;
156 std::string form
= "box";
158 description
.add_options()
159 ("help", "Help message")
160 ("seed", po::value
<int>(&seed
), "Initialization seed for random generator")
161 ("count", po::value
<int>(&count
)->default_value(1), "Number of tests")
162 ("diff", po::value
<bool>(&settings
.also_difference
)->default_value(false), "Include testing on difference")
163 ("level", po::value
<int>(&level
)->default_value(3), "Level to reach (higher->slower)")
164 ("size", po::value
<int>(&field_size
)->default_value(10), "Size of the field")
165 ("form", po::value
<std::string
>(&form
)->default_value("box"), "Form of the polygons (box, triangle)")
166 ("ccw", po::value
<bool>(&ccw
)->default_value(false), "Counter clockwise polygons")
167 ("open", po::value
<bool>(&open
)->default_value(false), "Open polygons")
168 ("wkt", po::value
<bool>(&settings
.wkt
)->default_value(false), "Create a WKT of the inputs, for all tests")
169 ("svg", po::value
<bool>(&settings
.svg
)->default_value(false), "Create a SVG for all tests")
172 po::variables_map varmap
;
173 po::store(po::parse_command_line(argc
, argv
, description
), varmap
);
176 if (varmap
.count("help")
177 || (form
!= "box" && form
!= "triangle"))
179 std::cout
<< description
<< std::endl
;
183 bool triangular
= form
!= "box";
188 test_all
<double, false, false>(seed
, count
, field_size
, level
, triangular
, settings
);
192 test_all
<double, false, true>(seed
, count
, field_size
, level
, triangular
, settings
);
196 test_all
<double, true, false>(seed
, count
, field_size
, level
, triangular
, settings
);
200 test_all
<double, true, true>(seed
, count
, field_size
, level
, triangular
, settings
);
203 #if defined(HAVE_TTMATH)
204 // test_all<ttmath_big, true, true>(seed, count, max, svg, level);
207 catch(std::exception
const& e
)
209 std::cout
<< "Exception " << e
.what() << std::endl
;
213 std::cout
<< "Other exception" << std::endl
;