Imported Upstream version 1.63.0
[platform/upstream/boost.git] / libs / geometry / doc / doxy / doxygen_output / html_by_doxygen / 03_polygon_example_8cpp-example.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
5 <title>Boost.Geometry (aka GGL, Generic Geometry Library)</title>
6 <link href="doxygen.css" rel="stylesheet" type="text/css">
7 <link href="tabs.css" rel="stylesheet" type="text/css">
8 </head>
9 <table cellpadding="2" width="100%">
10 <tbody>
11 <tr>
12 <td valign="top">
13 <img alt="Boost.Geometry" src="images/ggl-logo-big.png" height="80" width="200">
14 &nbsp;&nbsp;
15 </td>
16 <td valign="top" align="right">
17 <a href="http://www.boost.org">
18 <img alt="Boost C++ Libraries" src="images/accepted_by_boost.png" height="80" width="230" border="0">
19 </a>
20 </td>
21 </tr>
22 </tbody>
23 </table>
24 <!-- Generated by Doxygen 1.8.6 -->
25   <div id="navrow1" class="tabs">
26     <ul class="tablist">
27       <li><a href="index.html"><span>Main&#160;Page</span></a></li>
28       <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
29       <li><a href="modules.html"><span>Modules</span></a></li>
30       <li><a href="namespaces.html"><span>Namespaces</span></a></li>
31       <li><a href="annotated.html"><span>Classes</span></a></li>
32       <li><a href="files.html"><span>Files</span></a></li>
33       <li><a href="examples.html"><span>Examples</span></a></li>
34     </ul>
35   </div>
36 </div><!-- top -->
37 <div class="header">
38   <div class="headertitle">
39 <div class="title">03_polygon_example.cpp</div>  </div>
40 </div><!--header-->
41 <div class="contents">
42 <p>The polygon example shows some examples of what can be done with polygons in the Generic Geometry Library: the outer ring and the inner rings how to calculate the area of a polygon how to get the centroid, and how to get an often more interesting label point how to correct the polygon such that it is clockwise and closed within: the well-known point in polygon algorithm how to use polygons which use another container, or which use different containers for points and for inner rings how polygons can be intersected, or clipped, using a clipping box</p>
43 <p>The illustrations below show the usage of the within algorithm and the intersection algorithm.</p>
44 <p>The within algorithm results in true if a point lies completly within a polygon. If it lies exactly on a border it is not considered as within and if it is inside a hole it is also not within the polygon. This is illustrated below, where only the point in the middle is within the polygon.</p>
45 <div class="image">
46 <img src="within_polygon.png" alt="within_polygon.png"/>
47 </div>
48 <p>The clipping algorithm, called intersection, is illustrated below:</p>
49 <div class="image">
50 <img src="clip_polygon.png" alt="clip_polygon.png"/>
51 </div>
52 <p>The yellow polygon, containing a hole, is clipped with the blue rectangle, resulting in a multi_polygon of three polygons, drawn in red. The hole is vanished.</p>
53 <p>include polygon_example.cpp</p>
54 <div class="fragment"><div class="line"><span class="comment">// Boost.Geometry (aka GGL, Generic Geometry Library)</span></div>
55 <div class="line"></div>
56 <div class="line"><span class="comment">// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.</span></div>
57 <div class="line"><span class="comment">// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.</span></div>
58 <div class="line"><span class="comment">// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.</span></div>
59 <div class="line"></div>
60 <div class="line"><span class="comment">// Use, modification and distribution is subject to the Boost Software License,</span></div>
61 <div class="line"><span class="comment">// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at</span></div>
62 <div class="line"><span class="comment">// http://www.boost.org/LICENSE_1_0.txt)</span></div>
63 <div class="line"><span class="comment">//</span></div>
64 <div class="line"><span class="comment">// Polygon Example</span></div>
65 <div class="line"></div>
66 <div class="line"><span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for reverse, unique</span></div>
67 <div class="line"><span class="preprocessor">#include &lt;iostream&gt;</span></div>
68 <div class="line"><span class="preprocessor">#include &lt;string&gt;</span></div>
69 <div class="line"></div>
70 <div class="line"><span class="preprocessor">#include &lt;boost/geometry/geometry.hpp&gt;</span></div>
71 <div class="line"><span class="preprocessor">#include &lt;<a class="code" href="point__xy_8hpp.html">boost/geometry/geometries/point_xy.hpp</a>&gt;</span></div>
72 <div class="line"><span class="preprocessor">#include &lt;<a class="code" href="geometries_2polygon_8hpp.html">boost/geometry/geometries/polygon.hpp</a>&gt;</span></div>
73 <div class="line"><span class="preprocessor">#include &lt;<a class="code" href="c__array_8hpp.html">boost/geometry/geometries/adapted/c_array.hpp</a>&gt;</span></div>
74 <div class="line"><span class="preprocessor">#include &lt;<a class="code" href="multi__polygon_8hpp.html">boost/geometry/geometries/multi_polygon.hpp</a>&gt;</span></div>
75 <div class="line"></div>
76 <div class="line"><a name="a0"></a><a class="code" href="c__array_8hpp.html#a815278dd46c0e0cbb9188150ef5305a9">BOOST_GEOMETRY_REGISTER_C_ARRAY_CS</a>(cs::cartesian)</div>
77 <div class="line"></div>
78 <div class="line"></div>
79 <div class="line">std::<span class="keywordtype">string</span> boolstr(<span class="keywordtype">bool</span> v)</div>
80 <div class="line">{</div>
81 <div class="line">    <span class="keywordflow">return</span> v ? <span class="stringliteral">&quot;true&quot;</span> : <span class="stringliteral">&quot;false&quot;</span>;</div>
82 <div class="line">}</div>
83 <div class="line"></div>
84 <div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">void</span>)</div>
85 <div class="line">{</div>
86 <div class="line">    <span class="keyword">using namespace </span>boost::geometry;</div>
87 <div class="line"></div>
88 <div class="line">    <span class="keyword">typedef</span> <a name="_a1"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1d2_1_1point__xy.html">model::d2::point_xy&lt;double&gt;</a> point_2d;</div>
89 <div class="line">    <span class="keyword">typedef</span> <a name="_a2"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1polygon.html">model::polygon&lt;point_2d&gt;</a> polygon_2d;</div>
90 <div class="line">    <span class="keyword">typedef</span> <a name="_a3"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1box.html">model::box&lt;point_2d&gt;</a> box_2d;</div>
91 <div class="line"></div>
92 <div class="line">    <span class="comment">// Define a polygon and fill the outer ring.</span></div>
93 <div class="line">    <span class="comment">// In most cases you will read it from a file or database</span></div>
94 <div class="line">    polygon_2d poly;</div>
95 <div class="line">    {</div>
96 <div class="line">        <span class="keyword">const</span> <span class="keywordtype">double</span> coor[][2] = {</div>
97 <div class="line">            {2.0, 1.3}, {2.4, 1.7}, {2.8, 1.8}, {3.4, 1.2}, {3.7, 1.6},</div>
98 <div class="line">            {3.4, 2.0}, {4.1, 3.0}, {5.3, 2.6}, {5.4, 1.2}, {4.9, 0.8}, {2.9, 0.7},</div>
99 <div class="line">            {2.0, 1.3} <span class="comment">// closing point is opening point</span></div>
100 <div class="line">            };</div>
101 <div class="line">        <a name="a4"></a><a class="code" href="group__assign.html#ga1fdbc43645872ba459c455318706a925">assign_points</a>(poly, coor);</div>
102 <div class="line">    }</div>
103 <div class="line"></div>
104 <div class="line">    <span class="comment">// Polygons should be closed, and directed clockwise. If you&#39;re not sure if that is the case,</span></div>
105 <div class="line">    <span class="comment">// call the correct algorithm</span></div>
106 <div class="line">    <a name="a5"></a><a class="code" href="group__correct.html#gaf14641937f187af33fec6bd99c8202d9">correct</a>(poly);</div>
107 <div class="line"></div>
108 <div class="line">    <span class="comment">// Polygons can be streamed as text</span></div>
109 <div class="line">    <span class="comment">// (or more precisely: as DSV (delimiter separated values))</span></div>
110 <div class="line">    std::cout &lt;&lt; dsv(poly) &lt;&lt; std::endl;</div>
111 <div class="line"></div>
112 <div class="line">    <span class="comment">// As with lines, bounding box of polygons can be calculated</span></div>
113 <div class="line">    box_2d b;</div>
114 <div class="line">    <a name="a6"></a><a class="code" href="group__envelope.html#gac1f1865a7b36047d44949e17266d8f5a">envelope</a>(poly, b);</div>
115 <div class="line">    std::cout &lt;&lt; dsv(b) &lt;&lt; std::endl;</div>
116 <div class="line"></div>
117 <div class="line">    <span class="comment">// The area of the polygon can be calulated</span></div>
118 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;area: &quot;</span> &lt;&lt; <a name="a7"></a><a class="code" href="group__area.html#gaf7a1c34467f74f290d0b090adb27db62">area</a>(poly) &lt;&lt; std::endl;</div>
119 <div class="line"></div>
120 <div class="line">    <span class="comment">// And the centroid, which is the center of gravity</span></div>
121 <div class="line">    point_2d cent;</div>
122 <div class="line">    <a name="a8"></a><a class="code" href="group__centroid.html#ga3ec2c5e245c42ffaf28f1c88ea564c8c">centroid</a>(poly, cent);</div>
123 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;centroid: &quot;</span> &lt;&lt; dsv(cent) &lt;&lt; std::endl;</div>
124 <div class="line"></div>
125 <div class="line"></div>
126 <div class="line">    <span class="comment">// The number of points can be requested per ring (using .size())</span></div>
127 <div class="line">    <span class="comment">// or per polygon (using num_points)</span></div>
128 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;number of points in outer ring: &quot;</span> &lt;&lt; poly.outer().size() &lt;&lt; std::endl;</div>
129 <div class="line"></div>
130 <div class="line">    <span class="comment">// Polygons can have one or more inner rings, also called holes, islands, interior rings.</span></div>
131 <div class="line">    <span class="comment">// Let&#39;s add one</span></div>
132 <div class="line">    {</div>
133 <div class="line">        poly.inners().resize(1);</div>
134 <div class="line">        <a name="_a9"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1ring.html">model::ring&lt;point_2d&gt;</a>&amp; inner = poly.inners().back();</div>
135 <div class="line"></div>
136 <div class="line">        <span class="keyword">const</span> <span class="keywordtype">double</span> coor[][2] = { {4.0, 2.0}, {4.2, 1.4}, {4.8, 1.9}, {4.4, 2.2}, {4.0, 2.0} };</div>
137 <div class="line">        <a class="code" href="group__assign.html#ga1fdbc43645872ba459c455318706a925">assign_points</a>(inner, coor);</div>
138 <div class="line">    }</div>
139 <div class="line"></div>
140 <div class="line">    <a class="code" href="group__correct.html#gaf14641937f187af33fec6bd99c8202d9">correct</a>(poly);</div>
141 <div class="line"></div>
142 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;with inner ring:&quot;</span> &lt;&lt; dsv(poly) &lt;&lt; std::endl;</div>
143 <div class="line">    <span class="comment">// The area of the polygon is changed of course</span></div>
144 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;new area of polygon: &quot;</span> &lt;&lt; <a class="code" href="group__area.html#gaf7a1c34467f74f290d0b090adb27db62">area</a>(poly) &lt;&lt; std::endl;</div>
145 <div class="line">    <a class="code" href="group__centroid.html#ga3ec2c5e245c42ffaf28f1c88ea564c8c">centroid</a>(poly, cent);</div>
146 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;new centroid: &quot;</span> &lt;&lt; dsv(cent) &lt;&lt; std::endl;</div>
147 <div class="line"></div>
148 <div class="line">    <span class="comment">// You can test whether points are within a polygon</span></div>
149 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;point in polygon:&quot;</span></div>
150 <div class="line">        &lt;&lt; <span class="stringliteral">&quot; p1: &quot;</span>  &lt;&lt; boolstr(<a name="a10"></a><a class="code" href="group__within.html#gaf8f597c0a7352f0a6808944db2a549b7">within</a>(make&lt;point_2d&gt;(3.0, 2.0), poly))</div>
151 <div class="line">        &lt;&lt; <span class="stringliteral">&quot; p2: &quot;</span>  &lt;&lt; boolstr(<a class="code" href="group__within.html#gaf8f597c0a7352f0a6808944db2a549b7">within</a>(make&lt;point_2d&gt;(3.7, 2.0), poly))</div>
152 <div class="line">        &lt;&lt; <span class="stringliteral">&quot; p3: &quot;</span>  &lt;&lt; boolstr(<a class="code" href="group__within.html#gaf8f597c0a7352f0a6808944db2a549b7">within</a>(make&lt;point_2d&gt;(4.4, 2.0), poly))</div>
153 <div class="line">        &lt;&lt; std::endl;</div>
154 <div class="line"></div>
155 <div class="line">    <span class="comment">// As with linestrings and points, you can derive from polygon to add, for example,</span></div>
156 <div class="line">    <span class="comment">// fill color and stroke color. Or SRID (spatial reference ID). Or Z-value. Or a property map.</span></div>
157 <div class="line">    <span class="comment">// We don&#39;t show this here.</span></div>
158 <div class="line"></div>
159 <div class="line">    <span class="comment">// Clip the polygon using a box</span></div>
160 <div class="line">    box_2d cb(make&lt;point_2d&gt;(1.5, 1.5), make&lt;point_2d&gt;(4.5, 2.5));</div>
161 <div class="line">    <span class="keyword">typedef</span> std::vector&lt;polygon_2d&gt; polygon_list;</div>
162 <div class="line">    polygon_list v;</div>
163 <div class="line"></div>
164 <div class="line">    <a name="a11"></a><a class="code" href="group__intersection.html#gac78b88e0ea7af3453a626a0e6fc588d7">intersection</a>(cb, poly, v);</div>
165 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;Clipped output polygons&quot;</span> &lt;&lt; std::endl;</div>
166 <div class="line">    <span class="keywordflow">for</span> (polygon_list::const_iterator it = v.begin(); it != v.end(); ++it)</div>
167 <div class="line">    {</div>
168 <div class="line">        std::cout &lt;&lt; dsv(*it) &lt;&lt; std::endl;</div>
169 <div class="line">    }</div>
170 <div class="line"></div>
171 <div class="line">    <span class="keyword">typedef</span> <a name="_a12"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1multi__polygon.html">model::multi_polygon&lt;polygon_2d&gt;</a> polygon_set;</div>
172 <div class="line">    polygon_set ps;</div>
173 <div class="line">    <a name="a13"></a><a class="code" href="group__union.html#gaa300b8994725c85cc71b304713a75501">union_</a>(cb, poly, ps);</div>
174 <div class="line"></div>
175 <div class="line">    polygon_2d hull;</div>
176 <div class="line">    <a name="a14"></a><a class="code" href="namespaceboost_1_1geometry.html#a5f0f6e4d01982d810d1ad1c1817521cb">convex_hull</a>(poly, hull);</div>
177 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;Convex hull:&quot;</span> &lt;&lt; dsv(hull) &lt;&lt; std::endl;</div>
178 <div class="line"></div>
179 <div class="line">    <span class="comment">// If you really want:</span></div>
180 <div class="line">    <span class="comment">//   You don&#39;t have to use a vector, you can define a polygon with a deque</span></div>
181 <div class="line">    <span class="comment">//   You can specify the container for the points and for the inner rings independantly</span></div>
182 <div class="line"></div>
183 <div class="line">    <span class="keyword">typedef</span> <a class="code" href="classboost_1_1geometry_1_1model_1_1polygon.html">model::polygon&lt;point_2d, true, true, std::deque, std::deque&gt;</a> deque_polygon;</div>
184 <div class="line">    deque_polygon poly2;</div>
185 <div class="line">    <a class="code" href="structboost_1_1geometry_1_1ring__type.html#a009cf4da9da6576d9733537a6e4d9ed6">ring_type&lt;deque_polygon&gt;::type</a>&amp; ring = <a name="a15"></a><a class="code" href="group__exterior__ring.html#ga08713d51a3bbe530a5f69b5084107d89">exterior_ring</a>(poly2);</div>
186 <div class="line">    <a name="a16"></a><a class="code" href="group__append.html#gaa3a95c7738229a30f77562cb095b3699">append</a>(ring, make&lt;point_2d&gt;(2.8, 1.9));</div>
187 <div class="line">    <a class="code" href="group__append.html#gaa3a95c7738229a30f77562cb095b3699">append</a>(ring, make&lt;point_2d&gt;(2.9, 2.4));</div>
188 <div class="line">    <a class="code" href="group__append.html#gaa3a95c7738229a30f77562cb095b3699">append</a>(ring, make&lt;point_2d&gt;(3.3, 2.2));</div>
189 <div class="line">    <a class="code" href="group__append.html#gaa3a95c7738229a30f77562cb095b3699">append</a>(ring, make&lt;point_2d&gt;(3.2, 1.8));</div>
190 <div class="line">    <a class="code" href="group__append.html#gaa3a95c7738229a30f77562cb095b3699">append</a>(ring, make&lt;point_2d&gt;(2.8, 1.9));</div>
191 <div class="line">    std::cout &lt;&lt; dsv(poly2) &lt;&lt; std::endl;</div>
192 <div class="line"></div>
193 <div class="line">    <span class="keywordflow">return</span> 0;</div>
194 <div class="line">}</div>
195 </div><!-- fragment --> </div><!-- contents -->
196 <hr size="1">
197 <table width="100%">
198 <tbody>
199 <tr>
200 <td align="left"><small>
201 <p>April 2, 2011</p>
202 </small></td>
203 <td align="right">
204 <small>
205 Copyright &copy; 2007-2011 Barend Gehrels, Amsterdam, the Netherlands<br>
206 Copyright &copy; 2008-2011 Bruno Lalande, Paris, France<br>
207 Copyright &copy; 2009-2010 Mateusz Loskot, London, UK<br>
208 </small>
209 </td>
210 </tr>
211 </tbody>
212 </table>
213 <address style="text-align: right;"><small>
214 Documentation is generated by&nbsp;<a href="http://www.doxygen.org/index.html">Doxygen</a>
215 </small></address>
216 </body>
217 </html>