• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // QuickBook Example
3 
4 // Copyright (c) 2011-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 //[rings
11 /*`
12 Shows how to access the exterior ring (one)
13 and interior rings (zero or more) of a polygon.
14 Also shows the related ring_type and interior_type.
15 */
16 
17 #include <iostream>
18 
19 #include <boost/geometry.hpp>
20 #include <boost/geometry/geometries/polygon.hpp>
21 #include <boost/geometry/geometries/point_xy.hpp>
22 
23 
main()24 int main()
25 {
26     typedef boost::geometry::model::d2::point_xy<double> point;
27     typedef boost::geometry::model::polygon<point> polygon_type;
28 
29     polygon_type poly;
30 
31     typedef boost::geometry::ring_type<polygon_type>::type ring_type;
32     ring_type& ring = boost::geometry::exterior_ring(poly);
33 
34     // For a ring of model::polygon, you can call "push_back".
35     // (internally, it is done using a traits::push_back class)
36     ring.push_back(point(0, 0));
37     ring.push_back(point(0, 5));
38     ring.push_back(point(5, 4));
39     ring.push_back(point(0, 0));
40 
41     ring_type inner;
42     inner.push_back(point(1, 1));
43     inner.push_back(point(2, 1));
44     inner.push_back(point(2, 2));
45     inner.push_back(point(1, 1));
46 
47     typedef boost::geometry::interior_type<polygon_type>::type int_type;
48     int_type& interiors = boost::geometry::interior_rings(poly);
49     interiors.push_back(inner);
50 
51     std::cout << boost::geometry::dsv(poly) << std::endl;
52 
53     // So int_type defines a collection of rings,
54     // which is a Boost.Range compatible range
55     // The type of an element of the collection is the very same ring type again.
56     // We show that.
57     typedef boost::range_value<int_type>::type int_ring_type;
58 
59     std::cout
60         << std::boolalpha
61         << boost::is_same<ring_type, int_ring_type>::value
62         << std::endl;
63 
64     return 0;
65 }
66 
67 //]
68 
69 //[rings_output
70 /*`
71 Output:
72 [pre
73 (((0, 0), (0, 5), (5, 4), (0, 0)), ((1, 1), (2, 1), (2, 2), (1, 1)))
74 true
75 ]
76 */
77 //]
78