1 // Boost.Geometry (aka GGL, Generic Geometry Library)
4 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
5 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
6 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
7 // Copyright (c) 2014 Samuel Debionne, Grenoble, France.
9 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
10 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
12 // Use, modification and distribution is subject to the Boost Software License,
13 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
14 // http://www.boost.org/LICENSE_1_0.txt)
16 #include <geometry_test_common.hpp>
18 #include <boost/geometry/arithmetic/arithmetic.hpp>
19 #include <boost/geometry/algorithms/assign.hpp>
20 #include <boost/geometry/algorithms/num_points.hpp>
22 #include <boost/geometry/geometries/geometries.hpp>
23 #include <boost/geometry/geometries/adapted/c_array.hpp>
24 #include <boost/geometry/geometries/adapted/boost_tuple.hpp>
25 #include <boost/geometry/io/wkt/wkt.hpp>
26 #include <boost/variant/variant.hpp>
27 #include <test_common/test_point.hpp>
29 BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(cs::cartesian
)
30 BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian
)
33 template <typename Geometry
>
34 void check_geometry(Geometry
const& geometry
, std::string
const& expected
)
36 std::ostringstream out
;
37 out
<< bg::wkt(geometry
);
38 BOOST_CHECK_EQUAL(out
.str(), expected
);
41 template <typename Geometry
, typename Points
>
42 void check_assign_points(Points
const& points
, std::string
const& /*expected*/)
45 bg::assign_points(geometry
, points
);
46 check_geometry(geometry
, "LINESTRING(1 2,3 4,5 6)");
48 boost::variant
<Geometry
> v
;
49 bg::assign_points(v
, points
);
52 template <typename Point
>
53 void test_assign_linestring_2d()
55 bg::model::linestring
<Point
> line
;
57 // Test assignment of plain array (note that this is only possible if adapted c-array is included!)
58 const double coors
[3][2] = { {1, 2}, {3, 4}, {5, 6} };
59 check_assign_points
<bg::model::linestring
<Point
> >(coors
, "LINESTRING(1 2,3 4,5 6)");
61 // Test assignment of point array
63 bg::assign_values(points
[0], 1, 2);
64 bg::assign_values(points
[1], 3, 4);
65 bg::assign_values(points
[2], 5, 6);
66 check_assign_points
<bg::model::linestring
<Point
> >(points
, "LINESTRING(1 2,3 4,5 6)");
68 // Test assignment of array with different point-type (tuple adaption should be included)
69 boost::tuple
<float, float> tuples
[3];
70 tuples
[0] = boost::make_tuple(1, 2);
71 tuples
[1] = boost::make_tuple(3, 4);
72 tuples
[2] = boost::make_tuple(5, 6);
73 check_assign_points
<bg::model::linestring
<Point
> >(tuples
, "LINESTRING(1 2,3 4,5 6)");
78 template <typename BoxOrSegment
>
79 void test_assign_box_or_segment_2d()
81 BoxOrSegment geometry
;
82 bg::assign_values(geometry
, 1, 2, 3, 4);
83 BOOST_CHECK((bg::get
<bg::min_corner
, 0>(geometry
) == 1));
84 BOOST_CHECK((bg::get
<bg::min_corner
, 1>(geometry
) == 2));
85 BOOST_CHECK((bg::get
<bg::max_corner
, 0>(geometry
) == 3));
86 BOOST_CHECK((bg::get
<bg::max_corner
, 1>(geometry
) == 4));
88 bg::assign_zero(geometry
);
89 BOOST_CHECK((bg::get
<bg::min_corner
, 0>(geometry
) == 0));
90 BOOST_CHECK((bg::get
<bg::min_corner
, 1>(geometry
) == 0));
91 BOOST_CHECK((bg::get
<bg::max_corner
, 0>(geometry
) == 0));
92 BOOST_CHECK((bg::get
<bg::max_corner
, 1>(geometry
) == 0));
94 bg::assign_inverse(geometry
);
95 BOOST_CHECK((bg::get
<bg::min_corner
, 0>(geometry
) > 9999));
96 BOOST_CHECK((bg::get
<bg::min_corner
, 1>(geometry
) > 9999));
97 BOOST_CHECK((bg::get
<bg::max_corner
, 0>(geometry
) < 9999));
98 BOOST_CHECK((bg::get
<bg::max_corner
, 1>(geometry
) < 9999));
102 template <typename Point
>
103 void test_assign_box_or_segment_2d()
105 detail::test_assign_box_or_segment_2d
<bg::model::box
<Point
> >();
106 detail::test_assign_box_or_segment_2d
<bg::model::segment
<Point
> >();
109 template <typename Point
>
110 void test_assign_box_2d()
112 detail::test_assign_box_or_segment_2d
<bg::model::box
<Point
> >();
115 template <typename Point
>
116 void test_assign_point_3d()
119 bg::assign_values(p
, 1, 2, 3);
120 check_geometry(p
, "POINT(1 2 3)");
122 bg::assign_value(p
, 123);
123 check_geometry(p
, "POINT(123 123 123)");
126 check_geometry(p
, "POINT(0 0 0)");
129 template <typename P
>
130 void test_assign_conversion()
132 typedef bg::model::box
<P
> box_type
;
133 typedef bg::model::ring
<P
> ring_type
;
134 typedef bg::model::polygon
<P
> polygon_type
;
137 bg::assign_values(p
, 1, 2);
142 BOOST_CHECK_CLOSE((bg::get
<0, 0>(b
)), 1.0, 0.001);
143 BOOST_CHECK_CLOSE((bg::get
<0, 1>(b
)), 2.0, 0.001);
144 BOOST_CHECK_CLOSE((bg::get
<1, 0>(b
)), 1.0, 0.001);
145 BOOST_CHECK_CLOSE((bg::get
<1, 1>(b
)), 2.0, 0.001);
148 bg::set
<bg::min_corner
, 0>(b
, 1);
149 bg::set
<bg::min_corner
, 1>(b
, 2);
150 bg::set
<bg::max_corner
, 0>(b
, 3);
151 bg::set
<bg::max_corner
, 1>(b
, 4);
157 typedef bg::model::ring
<P
, false, false> ring_type_ccw
;
158 ring_type_ccw ring_ccw
;
159 // Should NOT compile (currently): bg::assign(ring_ccw, ring);
163 typename
boost::range_const_iterator
<ring_type
>::type it
= ring
.begin();
164 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 1.0, 0.001);
165 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 2.0, 0.001);
167 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 1.0, 0.001);
168 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 4.0, 0.001);
170 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 3.0, 0.001);
171 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 4.0, 0.001);
173 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 3.0, 0.001);
174 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 2.0, 0.001);
176 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 1.0, 0.001);
177 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 2.0, 0.001);
179 BOOST_CHECK_EQUAL(ring
.size(), 5u);
182 polygon_type polygon
;
184 bg::assign(polygon
, ring
);
185 BOOST_CHECK_EQUAL(bg::num_points(polygon
), 5u);
188 bg::assign(ring2
, polygon
);
189 BOOST_CHECK_EQUAL(bg::num_points(ring2
), 5u);
193 template <typename P
>
194 void test_assign_conversion_variant()
196 typedef bg::model::box
<P
> box_type
;
197 typedef bg::model::ring
<P
> ring_type
;
198 typedef bg::model::polygon
<P
> polygon_type
;
201 bg::assign_values(p
, 1, 2);
204 boost::variant
<box_type
&> variant_b(b
);
205 bg::assign(variant_b
, p
);
207 BOOST_CHECK_CLOSE((bg::get
<0, 0>(b
)), 1.0, 0.001);
208 BOOST_CHECK_CLOSE((bg::get
<0, 1>(b
)), 2.0, 0.001);
209 BOOST_CHECK_CLOSE((bg::get
<1, 0>(b
)), 1.0, 0.001);
210 BOOST_CHECK_CLOSE((bg::get
<1, 1>(b
)), 2.0, 0.001);
213 bg::set
<bg::min_corner
, 0>(b
, 1);
214 bg::set
<bg::min_corner
, 1>(b
, 2);
215 bg::set
<bg::max_corner
, 0>(b
, 3);
216 bg::set
<bg::max_corner
, 1>(b
, 4);
219 boost::variant
<ring_type
&> variant_ring(ring
);
220 bg::assign(variant_ring
, boost::variant
<box_type
>(b
));
223 typedef bg::model::ring
<P
, false, false> ring_type_ccw
;
224 ring_type_ccw ring_ccw
;
225 // Should NOT compile (currently): bg::assign(ring_ccw, ring);
229 typename
boost::range_const_iterator
<ring_type
>::type it
= ring
.begin();
230 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 1.0, 0.001);
231 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 2.0, 0.001);
233 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 1.0, 0.001);
234 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 4.0, 0.001);
236 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 3.0, 0.001);
237 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 4.0, 0.001);
239 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 3.0, 0.001);
240 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 2.0, 0.001);
242 BOOST_CHECK_CLOSE(bg::get
<0>(*it
), 1.0, 0.001);
243 BOOST_CHECK_CLOSE(bg::get
<1>(*it
), 2.0, 0.001);
245 BOOST_CHECK_EQUAL(ring
.size(), 5u);
248 polygon_type polygon
;
249 boost::variant
<polygon_type
&> variant_polygon(polygon
);
251 bg::assign(variant_polygon
, boost::variant
<ring_type
>(ring
));
252 BOOST_CHECK_EQUAL(bg::num_points(polygon
), 5u);
255 boost::variant
<ring_type
&> variant_ring2(ring2
);
256 bg::assign(variant_ring2
, boost::variant
<polygon_type
>(polygon
));
257 BOOST_CHECK_EQUAL(bg::num_points(ring2
), 5u);
261 template <typename Point
>
262 void test_assign_point_2d()
265 bg::assign_values(p
, 1, 2);
266 check_geometry(p
, "POINT(1 2)");
268 bg::assign_value(p
, 123);
269 check_geometry(p
, "POINT(123 123)");
272 check_geometry(p
, "POINT(0 0)");
279 int test_main(int, char* [])
281 test_assign_point_3d
<int[3]>();
282 test_assign_point_3d
<float[3]>();
283 test_assign_point_3d
<double[3]>();
284 test_assign_point_3d
<test::test_point
>();
285 test_assign_point_3d
<bg::model::point
<int, 3, bg::cs::cartesian
> >();
286 test_assign_point_3d
<bg::model::point
<float, 3, bg::cs::cartesian
> >();
287 test_assign_point_3d
<bg::model::point
<double, 3, bg::cs::cartesian
> >();
289 test_assign_point_2d
<int[2]>();
290 test_assign_point_2d
<float[2]>();
291 test_assign_point_2d
<double[2]>();
292 test_assign_point_2d
<bg::model::point
<int, 2, bg::cs::cartesian
> >();
293 test_assign_point_2d
<bg::model::point
<float, 2, bg::cs::cartesian
> >();
294 test_assign_point_2d
<bg::model::point
<double, 2, bg::cs::cartesian
> >();
296 test_assign_conversion
<bg::model::point
<double, 2, bg::cs::cartesian
> >();
297 test_assign_conversion_variant
<bg::model::point
<double, 2, bg::cs::cartesian
> >();
300 // Segment (currently) cannot handle array's because derived from std::pair
301 test_assign_box_2d
<int[2]>();
302 test_assign_box_2d
<float[2]>();
303 test_assign_box_2d
<double[2]>();
305 test_assign_box_or_segment_2d
<bg::model::point
<int, 2, bg::cs::cartesian
> >();
306 test_assign_box_or_segment_2d
<bg::model::point
<float, 2, bg::cs::cartesian
> >();
307 test_assign_box_or_segment_2d
<bg::model::point
<double, 2, bg::cs::cartesian
> >();
309 test_assign_linestring_2d
<bg::model::point
<int, 2, bg::cs::cartesian
> >();
310 test_assign_linestring_2d
<bg::model::point
<float, 2, bg::cs::cartesian
> >();
311 test_assign_linestring_2d
<bg::model::point
<double, 2, bg::cs::cartesian
> >();