Imported Upstream version 1.63.0
[platform/upstream/boost.git] / libs / geometry / doc / doxy / doxygen_output / html_by_doxygen / 02_linestring_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">02_linestring_example.cpp</div>  </div>
40 </div><!--header-->
41 <div class="contents">
42 <p>The linestring example shows how linestrings can be declared and used and shows some more algorithms. One of the important concepts of the Generic Geometry Library is that it is totally built upon the standard library, using the standard containers such as std::vector.</p>
43 <p>A linestring is, as explained elsewhere in this documentation, not much more than a vector of points. Most algorithms run on linestrings, but can also run on any iterator pair. And all algorithms on std::vector can be used on geometry::linestring.</p>
44 <p>The sample shows this, shows some algorithms:</p>
45 <ul>
46 <li>geometry::envelope</li>
47 <li>geometry::length</li>
48 <li>geometry::distance</li>
49 <li>geometry::simplify</li>
50 <li>geometry::for_each</li>
51 <li>geometry::intersection</li>
52 </ul>
53 <p>This documentation illustrates the simplify algorithm and the intersection algorithm with some pictures.</p>
54 <p>The simplify algorithm simplifies a linestring. Simplification means that the less important points are removed from the line and that the points that are most important for the shape of a line are kept. Simplification is done using the well known Douglas Peucker algorithm. The library user can specify the distance or tolerance, which indicates how much the linestring should be simplified.</p>
55 <p>The image below shows the original and simplified linestring: </p>
56 <div class="image">
57 <img src="simplify_linestring.png" alt="simplify_linestring.png"/>
58 </div>
59 <p> The blue line is the original linestring; the red line is the simplified line which has one point less. In geographical applications simplification can reduce a linestring to its basic form containing only 10% of its original points.</p>
60 <p>The intersection algorithm intersects two geometries which each other, delivering a third geometry. In the case of the example a linestring is intersected with a box. Intersection with a box is often called a clip. The image below illustrates the intersection. </p>
61 <div class="image">
62 <img src="clip_linestring.png" alt="clip_linestring.png"/>
63 </div>
64 <p> The yellow line is intersected with the blue box. The intersection result, painted in red, contains three linestrings.</p>
65 <div class="fragment"><div class="line"><span class="comment">// Boost.Geometry (aka GGL, Generic Geometry Library)</span></div>
66 <div class="line"></div>
67 <div class="line"><span class="comment">// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.</span></div>
68 <div class="line"><span class="comment">// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.</span></div>
69 <div class="line"><span class="comment">// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.</span></div>
70 <div class="line"></div>
71 <div class="line"><span class="comment">// Use, modification and distribution is subject to the Boost Software License,</span></div>
72 <div class="line"><span class="comment">// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at</span></div>
73 <div class="line"><span class="comment">// http://www.boost.org/LICENSE_1_0.txt)</span></div>
74 <div class="line"><span class="comment">//</span></div>
75 <div class="line"><span class="comment">// Linestring Example</span></div>
76 <div class="line"></div>
77 <div class="line"><span class="preprocessor">#include &lt;algorithm&gt;</span> <span class="comment">// for reverse, unique</span></div>
78 <div class="line"><span class="preprocessor">#include &lt;iostream&gt;</span></div>
79 <div class="line"><span class="preprocessor">#include &lt;iterator&gt;</span></div>
80 <div class="line"><span class="preprocessor">#include &lt;utility&gt;</span></div>
81 <div class="line"><span class="preprocessor">#include &lt;vector&gt;</span></div>
82 <div class="line"></div>
83 <div class="line"><span class="preprocessor">#include &lt;boost/geometry/geometry.hpp&gt;</span></div>
84 <div class="line"><span class="preprocessor">#include &lt;<a class="code" href="linestring_8hpp.html">boost/geometry/geometries/linestring.hpp</a>&gt;</span></div>
85 <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>
86 <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>
87 <div class="line"></div>
88 <div class="line"><span class="comment">// Optional includes and defines to handle c-arrays as points, std::vectors as linestrings</span></div>
89 <div class="line"><span class="preprocessor">#include &lt;<a class="code" href="register_2linestring_8hpp.html">boost/geometry/geometries/register/linestring.hpp</a>&gt;</span></div>
90 <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>
91 <div class="line"></div>
92 <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>
93 <div class="line"></div>
94 <div class="line"><a name="a1"></a><a class="code" href="group__register.html#ga56729e5117bdd1ef2f5df70e113135d1">BOOST_GEOMETRY_REGISTER_LINESTRING_TEMPLATED</a>(std::vector)</div>
95 <div class="line"><a class="code" href="group__register.html#ga56729e5117bdd1ef2f5df70e113135d1">BOOST_GEOMETRY_REGISTER_LINESTRING_TEMPLATED</a>(std::deque)</div>
96 <div class="line"></div>
97 <div class="line"></div>
98 <div class="line">template&lt;typename P&gt;</div>
99 <div class="line">inline <span class="keywordtype">void</span> translate_function(P&amp; p)</div>
100 <div class="line">{</div>
101 <div class="line">        p.x(p.x() + 100.0);</div>
102 <div class="line">}</div>
103 <div class="line"></div>
104 <div class="line"><span class="keyword">template</span>&lt;<span class="keyword">typename</span> P&gt;</div>
105 <div class="line"><span class="keyword">struct </span>scale_functor</div>
106 <div class="line">{</div>
107 <div class="line">    <span class="keyword">inline</span> <span class="keywordtype">void</span> operator()(P&amp; p)</div>
108 <div class="line">    {</div>
109 <div class="line">        p.x(p.x() * 1000.0);</div>
110 <div class="line">        p.y(p.y() * 1000.0);</div>
111 <div class="line">    }</div>
112 <div class="line">};</div>
113 <div class="line"></div>
114 <div class="line"></div>
115 <div class="line"><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Po<span class="keywordtype">int</span>&gt;</div>
116 <div class="line"><span class="keyword">struct </span>round_coordinates</div>
117 <div class="line">{</div>
118 <div class="line">    <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structboost_1_1geometry_1_1coordinate__type.html#a426b2210908d022e151055d1fed4ac75">boost::geometry::coordinate_type&lt;Point&gt;::type</a> coordinate_type;</div>
119 <div class="line">    coordinate_type m_factor;</div>
120 <div class="line"></div>
121 <div class="line">    <span class="keyword">inline</span> round_coordinates(coordinate_type <span class="keyword">const</span>&amp; factor)</div>
122 <div class="line">        : m_factor(factor)</div>
123 <div class="line">    {}</div>
124 <div class="line"></div>
125 <div class="line">    <span class="keyword">template</span> &lt;<span class="keywordtype">int</span> Dimension&gt;</div>
126 <div class="line">    <span class="keyword">inline</span> <span class="keywordtype">void</span> round(Point&amp; p)</div>
127 <div class="line">    {</div>
128 <div class="line">        coordinate_type c = boost::geometry::get&lt;Dimension&gt;(p) / m_factor;</div>
129 <div class="line">        <span class="keywordtype">int</span> rounded = c;</div>
130 <div class="line">        boost::geometry::set&lt;Dimension&gt;(p, coordinate_type(rounded) * m_factor);</div>
131 <div class="line">    }</div>
132 <div class="line"></div>
133 <div class="line">    <span class="keyword">inline</span> <span class="keywordtype">void</span> operator()(Point&amp; p)</div>
134 <div class="line">    {</div>
135 <div class="line">        round&lt;0&gt;(p);</div>
136 <div class="line">        round&lt;1&gt;(p);</div>
137 <div class="line">    }</div>
138 <div class="line">};</div>
139 <div class="line"></div>
140 <div class="line"></div>
141 <div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">void</span>)</div>
142 <div class="line">{</div>
143 <div class="line">    <span class="keyword">using namespace </span>boost::geometry;</div>
144 <div class="line"></div>
145 <div class="line">    <span class="comment">// Define a linestring, which is a vector of points, and add some points</span></div>
146 <div class="line">    <span class="comment">// (we add them deliberately in different ways)</span></div>
147 <div class="line">    <span class="keyword">typedef</span> <a name="_a2"></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>
148 <div class="line">    <span class="keyword">typedef</span> <a name="_a3"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1linestring.html">model::linestring&lt;point_2d&gt;</a> linestring_2d;</div>
149 <div class="line">    linestring_2d ls;</div>
150 <div class="line"></div>
151 <div class="line">    <span class="comment">// points can be created using &quot;make&quot; and added to a linestring using the std:: &quot;push_back&quot;</span></div>
152 <div class="line">    ls.push_back(make&lt;point_2d&gt;(1.1, 1.1));</div>
153 <div class="line"></div>
154 <div class="line">    <span class="comment">// points can also be assigned using &quot;assign_values&quot; and added to a linestring using &quot;append&quot;</span></div>
155 <div class="line">    point_2d lp;</div>
156 <div class="line">    <a name="a4"></a><a class="code" href="group__assign.html#ga9ee6c10e38a19e8e52bf9a1fc5a19a05">assign_values</a>(lp, 2.5, 2.1);</div>
157 <div class="line">    <a name="a5"></a><a class="code" href="group__append.html#gaa3a95c7738229a30f77562cb095b3699">append</a>(ls, lp);</div>
158 <div class="line"></div>
159 <div class="line">    <span class="comment">// Lines can be streamed using DSV (delimiter separated values)</span></div>
160 <div class="line">    std::cout &lt;&lt; dsv(ls) &lt;&lt; std::endl;</div>
161 <div class="line"></div>
162 <div class="line">    <span class="comment">// The bounding box of linestrings can be calculated</span></div>
163 <div class="line">    <span class="keyword">typedef</span> <a name="_a6"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1box.html">model::box&lt;point_2d&gt;</a> box_2d;</div>
164 <div class="line">    box_2d b;</div>
165 <div class="line">    <a name="a7"></a><a class="code" href="group__envelope.html#gac1f1865a7b36047d44949e17266d8f5a">envelope</a>(ls, b);</div>
166 <div class="line">    std::cout &lt;&lt; dsv(b) &lt;&lt; std::endl;</div>
167 <div class="line"></div>
168 <div class="line">    <span class="comment">// The length of the line can be calulated</span></div>
169 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;length: &quot;</span> &lt;&lt; <a name="a8"></a><a class="code" href="group__length.html#ga38dff36b8deb6a1a8cb0a3d6387af8fc">length</a>(ls) &lt;&lt; std::endl;</div>
170 <div class="line"></div>
171 <div class="line">    <span class="comment">// All things from std::vector can be called, because a linestring is a vector</span></div>
172 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;number of points 1: &quot;</span> &lt;&lt; ls.size() &lt;&lt; std::endl;</div>
173 <div class="line"></div>
174 <div class="line">    <span class="comment">// All things from boost ranges can be called because a linestring is considered as a range</span></div>
175 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;number of points 2: &quot;</span> &lt;&lt; boost::size(ls) &lt;&lt; std::endl;</div>
176 <div class="line"></div>
177 <div class="line">    <span class="comment">// Generic function from geometry/OGC delivers the same value</span></div>
178 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;number of points 3: &quot;</span> &lt;&lt; <a name="a9"></a><a class="code" href="group__num__points.html#ga4e90b249b3cf16e4ef8f486df042aacd">num_points</a>(ls) &lt;&lt; std::endl;</div>
179 <div class="line"></div>
180 <div class="line">    <span class="comment">// The distance from a point to a linestring can be calculated</span></div>
181 <div class="line">    point_2d p(1.9, 1.2);</div>
182 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;distance of &quot;</span> &lt;&lt; dsv(p)</div>
183 <div class="line">        &lt;&lt; <span class="stringliteral">&quot; to line: &quot;</span> &lt;&lt; <a name="a10"></a><a class="code" href="group__distance.html#ga7d68c34d1ded4428903f906244b31da4">distance</a>(p, ls) &lt;&lt; std::endl;</div>
184 <div class="line"></div>
185 <div class="line">    <span class="comment">// A linestring is a vector. However, some algorithms consider &quot;segments&quot;,</span></div>
186 <div class="line">    <span class="comment">// which are the line pieces between two points of a linestring.</span></div>
187 <div class="line">    <span class="keywordtype">double</span> d = <a class="code" href="group__distance.html#ga7d68c34d1ded4428903f906244b31da4">distance</a>(p, <a name="_a11"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1segment.html">model::segment&lt;point_2d &gt;</a>(ls.front(), ls.back()));</div>
188 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;distance: &quot;</span> &lt;&lt; d &lt;&lt; std::endl;</div>
189 <div class="line"></div>
190 <div class="line">    <span class="comment">// Add some three points more, let&#39;s do it using a classic array.</span></div>
191 <div class="line">    <span class="comment">// (See documentation for picture of this linestring)</span></div>
192 <div class="line">    <span class="keyword">const</span> <span class="keywordtype">double</span> c[][2] = { {3.1, 3.1}, {4.9, 1.1}, {3.1, 1.9} };</div>
193 <div class="line">    <a class="code" href="group__append.html#gaa3a95c7738229a30f77562cb095b3699">append</a>(ls, c);</div>
194 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;appended: &quot;</span> &lt;&lt; dsv(ls) &lt;&lt; std::endl;</div>
195 <div class="line"></div>
196 <div class="line">    <span class="comment">// Output as iterator-pair on a vector</span></div>
197 <div class="line">    {</div>
198 <div class="line">        std::vector&lt;point_2d&gt; v;</div>
199 <div class="line">        std::copy(ls.begin(), ls.end(), <a name="a12"></a><a class="code" href="namespaceboost_1_1geometry_1_1range.html#a1e6b151e65be317d5cfaadfd26f5135e">std::back_inserter</a>(v));</div>
200 <div class="line"></div>
201 <div class="line">        std::cout</div>
202 <div class="line">            &lt;&lt; <span class="stringliteral">&quot;as vector: &quot;</span></div>
203 <div class="line">            &lt;&lt; dsv(v)</div>
204 <div class="line">            &lt;&lt; std::endl;</div>
205 <div class="line">    }</div>
206 <div class="line"></div>
207 <div class="line">    <span class="comment">// All algorithms from std can be used: a linestring is a vector</span></div>
208 <div class="line">    <a name="a13"></a><a class="code" href="group__reverse.html#ga9d0e06498236cee4517168b4cb231998">std::reverse</a>(ls.begin(), ls.end());</div>
209 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;reversed: &quot;</span> &lt;&lt; dsv(ls) &lt;&lt; std::endl;</div>
210 <div class="line">    <a class="code" href="group__reverse.html#ga9d0e06498236cee4517168b4cb231998">std::reverse</a>(boost::begin(ls), boost::end(ls));</div>
211 <div class="line"></div>
212 <div class="line">    <span class="comment">// The other way, using a vector instead of a linestring, is also possible</span></div>
213 <div class="line">    std::vector&lt;point_2d&gt; pv(ls.begin(), ls.end());</div>
214 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;length: &quot;</span> &lt;&lt; <a class="code" href="group__length.html#ga38dff36b8deb6a1a8cb0a3d6387af8fc">length</a>(pv) &lt;&lt; std::endl;</div>
215 <div class="line"></div>
216 <div class="line">    <span class="comment">// If there are double points in the line, you can use unique to remove them</span></div>
217 <div class="line">    <span class="comment">// So we add the last point, print, make a unique copy and print</span></div>
218 <div class="line">    {</div>
219 <div class="line">        <span class="comment">// (sidenote, we have to make copies, because</span></div>
220 <div class="line">        <span class="comment">// ls.push_back(ls.back()) often succeeds but</span></div>
221 <div class="line">        <span class="comment">// IS dangerous and erroneous!</span></div>
222 <div class="line">        point_2d last = ls.back(), first = ls.front();</div>
223 <div class="line">        ls.push_back(last);</div>
224 <div class="line">        ls.insert(ls.begin(), first);</div>
225 <div class="line">    }</div>
226 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;extra duplicate points: &quot;</span> &lt;&lt; dsv(ls) &lt;&lt; std::endl;</div>
227 <div class="line"></div>
228 <div class="line">    {</div>
229 <div class="line">        linestring_2d ls_copy;</div>
230 <div class="line">        std::unique_copy(ls.begin(), ls.end(), <a class="code" href="namespaceboost_1_1geometry_1_1range.html#a1e6b151e65be317d5cfaadfd26f5135e">std::back_inserter</a>(ls_copy),</div>
231 <div class="line">            <a name="_a14"></a><a class="code" href="structboost_1_1geometry_1_1equal__to.html">boost::geometry::equal_to&lt;point_2d&gt;</a>());</div>
232 <div class="line">        ls = ls_copy;</div>
233 <div class="line">        std::cout &lt;&lt; <span class="stringliteral">&quot;uniquecopy: &quot;</span> &lt;&lt; dsv(ls) &lt;&lt; std::endl;</div>
234 <div class="line">    }</div>
235 <div class="line"></div>
236 <div class="line">    <span class="comment">// Lines can be simplified. This removes points, but preserves the shape</span></div>
237 <div class="line">    linestring_2d ls_simplified;</div>
238 <div class="line">    <a name="a15"></a><a class="code" href="group__simplify.html#ga8f1c13c0fe844ffdaa6196ce3854849f">simplify</a>(ls, ls_simplified, 0.5);</div>
239 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;simplified: &quot;</span> &lt;&lt; dsv(ls_simplified) &lt;&lt; std::endl;</div>
240 <div class="line"></div>
241 <div class="line"></div>
242 <div class="line">    <span class="comment">// for_each:</span></div>
243 <div class="line">    <span class="comment">// 1) Lines can be visited with std::for_each</span></div>
244 <div class="line">    <span class="comment">// 2) for_each_point is also defined for all geometries</span></div>
245 <div class="line">    <span class="comment">// 3) for_each_segment is defined for all geometries to all segments</span></div>
246 <div class="line">    <span class="comment">// 4) loop is defined for geometries to visit segments</span></div>
247 <div class="line">    <span class="comment">//    with state apart, and to be able to break out (not shown here)</span></div>
248 <div class="line">    {</div>
249 <div class="line">        linestring_2d lscopy = ls;</div>
250 <div class="line">        std::for_each(lscopy.begin(), lscopy.end(), translate_function&lt;point_2d&gt;);</div>
251 <div class="line">        <a name="a16"></a><a class="code" href="group__for__each.html#ga3010849a8b501309db7b74157382cfaf">for_each_point</a>(lscopy, scale_functor&lt;point_2d&gt;());</div>
252 <div class="line">        <a class="code" href="group__for__each.html#ga3010849a8b501309db7b74157382cfaf">for_each_point</a>(lscopy, translate_function&lt;point_2d&gt;);</div>
253 <div class="line">        std::cout &lt;&lt; <span class="stringliteral">&quot;modified line: &quot;</span> &lt;&lt; dsv(lscopy) &lt;&lt; std::endl;</div>
254 <div class="line">    }</div>
255 <div class="line"></div>
256 <div class="line">    <span class="comment">// Lines can be clipped using a clipping box. Clipped lines are added to the output iterator</span></div>
257 <div class="line">    box_2d cb(point_2d(1.5, 1.5), point_2d(4.5, 2.5));</div>
258 <div class="line"></div>
259 <div class="line">    std::vector&lt;linestring_2d&gt; clipped;</div>
260 <div class="line">    <a name="a17"></a><a class="code" href="group__intersection.html#gac78b88e0ea7af3453a626a0e6fc588d7">intersection</a>(cb, ls, clipped);</div>
261 <div class="line"></div>
262 <div class="line">    <span class="comment">// Also possible: clip-output to a vector of vectors</span></div>
263 <div class="line">    std::vector&lt;std::vector&lt;point_2d&gt; &gt; vector_out;</div>
264 <div class="line">    <a class="code" href="group__intersection.html#gac78b88e0ea7af3453a626a0e6fc588d7">intersection</a>(cb, ls, vector_out);</div>
265 <div class="line"></div>
266 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;clipped output as vector:&quot;</span> &lt;&lt; std::endl;</div>
267 <div class="line">    <span class="keywordflow">for</span> (std::vector&lt;std::vector&lt;point_2d&gt; &gt;::const_iterator it</div>
268 <div class="line">            = vector_out.begin(); it != vector_out.end(); ++it)</div>
269 <div class="line">    {</div>
270 <div class="line">        std::cout &lt;&lt; dsv(*it) &lt;&lt; std::endl;</div>
271 <div class="line">    }</div>
272 <div class="line"></div>
273 <div class="line">    <span class="comment">// Calculate the convex hull of the linestring</span></div>
274 <div class="line">    <a name="_a18"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1polygon.html">model::polygon&lt;point_2d&gt;</a> hull;</div>
275 <div class="line">    <a name="a19"></a><a class="code" href="namespaceboost_1_1geometry.html#a5f0f6e4d01982d810d1ad1c1817521cb">convex_hull</a>(ls, hull);</div>
276 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;Convex hull:&quot;</span> &lt;&lt; dsv(hull) &lt;&lt; std::endl;</div>
277 <div class="line"></div>
278 <div class="line">    <span class="comment">// All the above assumed 2D Cartesian linestrings. 3D is possible as well</span></div>
279 <div class="line">    <span class="comment">// Let&#39;s define a 3D point ourselves, this time using &#39;float&#39;</span></div>
280 <div class="line">    <span class="keyword">typedef</span> <a name="_a20"></a><a class="code" href="classboost_1_1geometry_1_1model_1_1point.html">model::point&lt;float, 3, cs::cartesian&gt;</a> point_3d;</div>
281 <div class="line">    <a class="code" href="classboost_1_1geometry_1_1model_1_1linestring.html">model::linestring&lt;point_3d&gt;</a> line3;</div>
282 <div class="line">    line3.push_back(make&lt;point_3d&gt;(1,2,3));</div>
283 <div class="line">    line3.push_back(make&lt;point_3d&gt;(4,5,6));</div>
284 <div class="line">    line3.push_back(make&lt;point_3d&gt;(7,8,9));</div>
285 <div class="line"></div>
286 <div class="line">    <span class="comment">// Not all algorithms work on 3d lines. For example convex hull does NOT.</span></div>
287 <div class="line">    <span class="comment">// But, for example, length, distance, simplify, envelope and stream do.</span></div>
288 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;3D: length: &quot;</span> &lt;&lt; <a class="code" href="group__length.html#ga38dff36b8deb6a1a8cb0a3d6387af8fc">length</a>(line3) &lt;&lt; <span class="stringliteral">&quot; line: &quot;</span> &lt;&lt; dsv(line3) &lt;&lt; std::endl;</div>
289 <div class="line"></div>
290 <div class="line">    <span class="comment">// With DSV you can also use other delimiters, e.g. JSON style</span></div>
291 <div class="line">    std::cout &lt;&lt; <span class="stringliteral">&quot;JSON: &quot;</span></div>
292 <div class="line">        &lt;&lt; dsv(ls, <span class="stringliteral">&quot;, &quot;</span>, <span class="stringliteral">&quot;[&quot;</span>, <span class="stringliteral">&quot;]&quot;</span>, <span class="stringliteral">&quot;, &quot;</span>, <span class="stringliteral">&quot;[ &quot;</span>, <span class="stringliteral">&quot; ]&quot;</span>)</div>
293 <div class="line">        &lt;&lt; std::endl;</div>
294 <div class="line"></div>
295 <div class="line">    <span class="keywordflow">return</span> 0;</div>
296 <div class="line">}</div>
297 </div><!-- fragment --> </div><!-- contents -->
298 <hr size="1">
299 <table width="100%">
300 <tbody>
301 <tr>
302 <td align="left"><small>
303 <p>April 2, 2011</p>
304 </small></td>
305 <td align="right">
306 <small>
307 Copyright &copy; 2007-2011 Barend Gehrels, Amsterdam, the Netherlands<br>
308 Copyright &copy; 2008-2011 Bruno Lalande, Paris, France<br>
309 Copyright &copy; 2009-2010 Mateusz Loskot, London, UK<br>
310 </small>
311 </td>
312 </tr>
313 </tbody>
314 </table>
315 <address style="text-align: right;"><small>
316 Documentation is generated by&nbsp;<a href="http://www.doxygen.org/index.html">Doxygen</a>
317 </small></address>
318 </body>
319 </html>