• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3 
4 // Copyright (c) 2010-2012 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 // geometry::num_points does not accept the ring_proxy for adaptation, like
11 // centroid and probably many more algorithms. TODO: fix that. Until then we
12 // define it such that num_points is not called.
13 #define BOOST_GEOMETRY_EMPTY_INPUT_NO_THROW
14 
15 #include <geometry_test_common.hpp>
16 
17 
18 #include <boost/geometry/geometry.hpp>
19 
20 #include <boost/geometry/geometries/box.hpp>
21 #include <boost/geometry/geometries/point.hpp>
22 #include <boost/geometry/geometries/polygon.hpp>
23 #include <boost/geometry/geometries/ring.hpp>
24 
25 #include <boost/geometry/geometries/adapted/boost_polygon/point.hpp>
26 #include <boost/geometry/geometries/adapted/boost_polygon/box.hpp>
27 #include <boost/geometry/geometries/adapted/boost_polygon/ring.hpp>
28 #include <boost/geometry/geometries/adapted/boost_polygon/polygon.hpp>
29 
30 #include <boost/geometry/io/wkt/wkt.hpp>
31 
32 #include <iostream>
33 
34 template <typename T>
fill_polygon_with_two_holes(boost::polygon::polygon_with_holes_data<T> & boost_polygon_polygon)35 void fill_polygon_with_two_holes(boost::polygon::polygon_with_holes_data<T>& boost_polygon_polygon)
36 {
37     std::vector<boost::polygon::point_data<T> > point_vector;
38     point_vector.push_back(boost::polygon::point_data<T>(0, 0));
39     point_vector.push_back(boost::polygon::point_data<T>(0, 10));
40     point_vector.push_back(boost::polygon::point_data<T>(10, 10));
41     point_vector.push_back(boost::polygon::point_data<T>(10, 0));
42     point_vector.push_back(boost::polygon::point_data<T>(0, 0));
43     boost_polygon_polygon.set(point_vector.begin(), point_vector.end());
44 
45 
46     std::vector<boost::polygon::polygon_data<T> > holes;
47     holes.resize(2);
48 
49     {
50         std::vector<boost::polygon::point_data<T> > point_vector;
51         point_vector.push_back(boost::polygon::point_data<T>(1, 1));
52         point_vector.push_back(boost::polygon::point_data<T>(2, 1));
53         point_vector.push_back(boost::polygon::point_data<T>(2, 2));
54         point_vector.push_back(boost::polygon::point_data<T>(1, 2));
55         point_vector.push_back(boost::polygon::point_data<T>(1, 1));
56         holes[0].set(point_vector.begin(), point_vector.end());
57     }
58 
59     {
60         std::vector<boost::polygon::point_data<T> > point_vector;
61         point_vector.push_back(boost::polygon::point_data<T>(3, 3));
62         point_vector.push_back(boost::polygon::point_data<T>(4, 3));
63         point_vector.push_back(boost::polygon::point_data<T>(4, 4));
64         point_vector.push_back(boost::polygon::point_data<T>(3, 4));
65         point_vector.push_back(boost::polygon::point_data<T>(3, 3));
66         holes[1].set(point_vector.begin(), point_vector.end());
67     }
68     boost_polygon_polygon.set_holes(holes.begin(), holes.end());
69 }
70 
71 
72 template <typename T>
test_coordinate_type()73 void test_coordinate_type()
74 {
75     // 1a: Check if Boost.Polygon's point fulfills Boost.Geometry's point concept
76     bg::concepts::check<boost::polygon::point_data<T> >();
77 
78     // 1b: use a Boost.Polygon point in Boost.Geometry, calc. distance with two point types
79     boost::polygon::point_data<T> boost_polygon_point(1, 2);
80 
81     typedef bg::model::point<T, 2, bg::cs::cartesian> bg_point_type;
82     bg_point_type boost_geometry_point(3, 4);
83     BOOST_CHECK_EQUAL(bg::distance(boost_polygon_point, boost_geometry_point),
84                     2 * std::sqrt(2.0));
85 
86     // 2a: Check if Boost.Polygon's box fulfills Boost.Geometry's box concept
87     bg::concepts::check<boost::polygon::rectangle_data<T> >();
88 
89     // 2b: use a Boost.Polygon rectangle in Boost.Geometry, compare with boxes
90     boost::polygon::rectangle_data<T> boost_polygon_box;
91     bg::model::box<bg_point_type> boost_geometry_box;
92 
93     bg::assign_values(boost_polygon_box, 0, 1, 5, 6);
94     bg::assign_values(boost_geometry_box, 0, 1, 5, 6);
95     T boost_polygon_area = bg::area(boost_polygon_box);
96     T boost_geometry_area = bg::area(boost_geometry_box);
97     T boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_box);
98     BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
99     BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
100 
101     // 3a: Check if Boost.Polygon's polygon fulfills Boost.Geometry's ring concept
102     bg::concepts::check<boost::polygon::polygon_data<T> >();
103 
104     // 3b: use a Boost.Polygon polygon (ring)
105     boost::polygon::polygon_data<T> boost_polygon_ring;
106     {
107         // Filling it is a two-step process using Boost.Polygon
108         std::vector<boost::polygon::point_data<T> > point_vector;
109         point_vector.push_back(boost::polygon::point_data<T>(0, 0));
110         point_vector.push_back(boost::polygon::point_data<T>(0, 3));
111         point_vector.push_back(boost::polygon::point_data<T>(4, 0));
112         point_vector.push_back(boost::polygon::point_data<T>(0, 0));
113         boost_polygon_ring.set(point_vector.begin(), point_vector.end());
114     }
115 
116     // Boost-geometry ring
117     bg::model::ring<bg_point_type> boost_geometry_ring;
118     {
119         boost_geometry_ring.push_back(bg_point_type(0, 0));
120         boost_geometry_ring.push_back(bg_point_type(0, 3));
121         boost_geometry_ring.push_back(bg_point_type(4, 0));
122         boost_geometry_ring.push_back(bg_point_type(0, 0));
123     }
124     boost_polygon_area = bg::area(boost_polygon_ring);
125     boost_geometry_area = bg::area(boost_geometry_ring);
126     boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_ring);
127     BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
128     BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
129 
130     // Check mutable ring
131     std::string wkt = "POLYGON((0 0,0 10,10 10,10 0,0 0))";
132     bg::read_wkt(wkt, boost_polygon_ring);
133     bg::read_wkt(wkt, boost_geometry_ring);
134     boost_polygon_area = bg::area(boost_polygon_ring);
135     boost_geometry_area = bg::area(boost_geometry_ring);
136     boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_ring);
137     BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
138     BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
139 
140     // 4a: Boost.Polygon's polygon with holes
141     boost::polygon::polygon_with_holes_data<T> boost_polygon_polygon;
142     fill_polygon_with_two_holes(boost_polygon_polygon);
143 
144     // Using Boost.Polygon
145     boost_polygon_area = bg::area(boost_polygon_polygon);
146     boost_polygon_area_by_boost_polygon = boost::polygon::area(boost_polygon_polygon);
147     BOOST_CHECK_EQUAL(boost_polygon_area, boost_polygon_area_by_boost_polygon);
148 
149     wkt = "POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,2 1,2 2,1 2,1 1),(3 3,4 3,4 4,3 4,3 3))";
150 
151     bg::model::polygon<bg_point_type> boost_geometry_polygon;
152     bg::read_wkt(wkt, boost_geometry_polygon);
153 
154     boost_geometry_area = bg::area(boost_geometry_polygon);
155     BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
156 
157     bg::clear(boost_polygon_polygon);
158     bg::read_wkt(wkt, boost_polygon_polygon);
159     boost_geometry_area = bg::area(boost_polygon_polygon);
160     BOOST_CHECK_EQUAL(boost_polygon_area, boost_geometry_area);
161 
162     std::ostringstream out;
163     out << bg::wkt(boost_polygon_polygon);
164     BOOST_CHECK_EQUAL(wkt, out.str());
165 
166 }
167 
test_main(int,char * [])168 int test_main(int, char* [])
169 {
170     test_coordinate_type<int>();
171     //test_coordinate_type<float>(); // compiles, but "BOOST_CHECK_EQUAL" fails
172     test_coordinate_type<double>();
173     return 0;
174 }
175