1 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns=
"http://www.w3.org/1999/xhtml" xml:
lang=
"en"
3 xmlns:
v=
"urn:schemas-microsoft-com:vml"
4 xmlns:
o=
"urn:schemas-microsoft-com:office:office"
5 xmlns:(null)
1=
"http://www.w3.org/TR/REC-html40" lang=
"en">
8 Copyright 2009-2010 Intel Corporation
11 <title>Boost Polygon Library: Polygon With Holes Concept
</title>
12 <meta http-equiv=
"content-type" content=
"text/html;charset=ISO-8859-1" />
13 <!-- <link type="text/css" rel="stylesheet" href="adobe_source.css"> -->
16 <table style=
"margin: 0pt; padding: 0pt; width: 100%;" border=
"0"
17 cellpadding=
"0" cellspacing=
"0">
20 <td style=
"background-color: rgb(238, 238, 238);" nowrap=
"1"
22 <div style=
"padding: 5px;" align=
"center"> <img
23 src=
"images/boost.png" border=
"0" height=
"86" width=
"277" /><a
24 title=
"www.boost.org home page" href=
"http://www.boost.org/"
25 tabindex=
"2" style=
"border: medium none ;"> </a> </div>
26 <div style=
"margin: 5px;">
27 <h3 class=
"navbar">Contents
</h3>
29 <li><a href=
"index.htm">Boost.Polygon Main Page
</a></li>
30 <li><a href=
"gtl_design_overview.htm">Design Overview
</a></li>
31 <li><a href=
"gtl_isotropy.htm">Isotropy
</a></li>
32 <li><a href=
"gtl_coordinate_concept.htm">Coordinate Concept
</a></li>
33 <li><a href=
"gtl_interval_concept.htm">Interval Concept
</a></li>
34 <li><a href=
"gtl_point_concept.htm">Point Concept
</a></li>
35 <li><a href=
"gtl_segment_concept.htm">Segment Concept
</a></li>
36 <li><a href=
"gtl_rectangle_concept.htm">Rectangle Concept
</a></li>
37 <li><a href=
"gtl_polygon_90_concept.htm">Polygon
90 Concept
</a></li>
38 <li><a href=
"gtl_polygon_90_with_holes_concept.htm">Polygon
90
39 With Holes Concept
</a></li>
40 <li><a href=
"gtl_polygon_45_concept.htm">Polygon
45 Concept
</a></li>
41 <li><a href=
"gtl_polygon_45_with_holes_concept.htm">Polygon
45
42 With Holes Concept
</a></li>
43 <li><a href=
"gtl_polygon_concept.htm">Polygon Concept
</a></li>
44 <li>Polygon With Holes Concept
</li>
45 <li><a href=
"gtl_polygon_90_set_concept.htm">Polygon
90 Set
47 <li><a href=
"gtl_polygon_45_set_concept.htm">Polygon
45 Set
49 <li><a href=
"gtl_polygon_set_concept.htm">Polygon Set Concept
</a></li>
50 <li><a href=
"gtl_connectivity_extraction_90.htm">Connectivity
51 Extraction
90</a></li>
52 <li><a href=
"gtl_connectivity_extraction_45.htm">Connectivity
53 Extraction
45</a></li>
54 <li><a href=
"gtl_connectivity_extraction.htm">Connectivity
56 <li><a href=
"gtl_property_merge_90.htm">Property Merge
90</a></li>
57 <li><a href=
"gtl_property_merge_45.htm">Property Merge
45</a></li>
58 <li><a href=
"gtl_property_merge.htm">Property Merge
</a></li>
59 <li><a href=
"voronoi_main.htm">Voronoi Main Page
<br />
61 <li><a href=
"voronoi_benchmark.htm">Voronoi Benchmark
</a><br />
63 <li><a href=
"voronoi_builder.htm">Voronoi Builder
</a></li>
64 <li><a href=
"voronoi_diagram.htm">Voronoi Diagram
</a></li>
66 <h3 class=
"navbar">Other Resources
</h3>
68 <li><a href=
"GTL_boostcon2009.pdf">GTL Boostcon
2009 Paper
</a></li>
69 <li><a href=
"GTL_boostcon_draft03.pdf">GTL Boostcon
2009
71 <li><a href=
"analysis.htm">Performance Analysis
</a></li>
72 <li><a href=
"gtl_tutorial.htm">Layout Versus Schematic Tutorial
</a></li>
73 <li><a href=
"gtl_minkowski_tutorial.htm">Minkowski Sum Tutorial
</a></li>
74 <li><a href=
"voronoi_basic_tutorial.htm">Voronoi Basic Tutorial
</a></li>
75 <li><a href=
"voronoi_advanced_tutorial.htm">Voronoi Advanced
79 <h3 class=
"navbar">Polygon Sponsor
</h3>
80 <div style=
"padding: 5px;" align=
"center"> <img
81 src=
"images/intlogo.gif" border=
"0" height=
"51" width=
"127" /><a
82 title=
"www.adobe.com home page" href=
"http://www.adobe.com/"
83 tabindex=
"2" style=
"border: medium none ;"> </a> </div>
86 style=
"padding-left: 10px; padding-right: 10px; padding-bottom: 10px;"
87 valign=
"top" width=
"100%">
88 <!-- End Header --><br />
91 <h1>Polygon With Holes Concept
</h1>
93 <p>The polygon_with_holes concept tag is
<font face=
"Courier New">
94 polygon_with_holes_concept
</font></p>
95 <p> To register a user defined type as a model of
<font
96 face=
"Times New Roman">polygon_with_holes
</font>concept, specialize
97 the geometry concept meta-function for that type.
In the example
98 below CPolygonWithHoles is registered as a model of polygon
<font
99 face=
"Times New Roman">_with_holes
</font> concept.
</p>
100 <p> <font face=
"Courier New">template
<><br />
101 struct geometry_concept
<CPolygonWithHoles
> { typedef
102 polygon_with_holes_concept type; };
</font></p>
103 <p> <font face=
"Times New Roman">The semantic of a
104 polygon_with_holes is a polygon that it can provide iterators over
105 holes that are also polygon.
A mutable polygon_with_holes must
106 also be able to set its geometry based on an interator range over
107 polygon holes.
There is no convention of winding of holes
108 enforced within the library.
</font></p>
109 <p> <font face=
"Times New Roman">Below is shown the default
110 polygon with holes traits.
Specialization of these traits is
111 required for types that don't conform to the default behavior.
112 Note, these traits are used by all polygon with holes concepts.
</font></p>
113 <p><font face=
"Courier New">template
<typename T, typename
114 enable = void
><br />
115 struct polygon_with_holes_traits {
<br />
116 typedef typename T::iterator_holes_type
117 iterator_holes_type;
<br />
118 typedef typename T::hole_type hole_type;
<br />
119 static inline iterator_holes_type
120 begin_holes(const T
& t) {
<br />
121 return
122 t.begin_holes();
<br />
123 }
<br />
124 static inline iterator_holes_type
125 end_holes(const T
& t) {
<br />
126 return
128 }
<br />
129 static inline unsigned int size_holes(const
131 return
132 t.size_holes();
<br />
133 }
<br />
135 <p><font face=
"Courier New">template
<typename T, typename
136 enable = void
><br />
137 struct polygon_with_holes_mutable_traits {
<br />
138 template
<typename iT
><br />
139 static inline T
& set_holes(T
& t, iT
140 inputBegin, iT inputEnd) {
<br />
141
142 t.set_holes(inputBegin, inputEnd);
<br />
143 return t;
<br />
144 }
<br />
146 <p>An object that is a model of
<font face=
"Courier New">
147 polygon_with_holes_concept
</font> can be viewed as a model of any of
148 its refinements if it is determined at runtime to conform to the
149 restriction of those concepts.
This concept casting is
150 accomplished through the
151 <font face=
"Courier New">view_as
<>()
</font> function.
</p>
152 <p><font face=
"Courier New">view_as
<rectangle_concept
>(polygon_with_holes_object)
</font><br />
153 <font face=
"Courier New">view_as
<polygon_90_concept
>(polygon_with_holes_object)
</font><br />
154 <font face=
"Courier New">view_as
<polygon_90_with_holes_concept
>(polygon_with_holes_object)
</font><br />
155 <font face=
"Courier New">view_as
<polygon_45_concept
>(polygon_with_holes_object)
</font><br />
156 <font face=
"Courier New">view_as
<polygon_45_with_holes_concept
>(polygon_with_holes_object)
</font><br />
157 <font face=
"Courier New">view_as
<polygon_concept
>(polygon_with_holes_object)
</font></p>
158 <p>The return value of
<font face=
"Courier New">view_as
<>()
</font>
159 can be passed into any interface that expects an object of the
160 conceptual type specified in its template parameter.
</p>
162 <table id=
"table1" border=
"1" width=
"100%">
165 <td width=
"586"><font face=
"Courier New">template
166 <typename T
><br />
167 point_iterator_type
<b>begin_points
</b>(const T
& polygon)
</font></td>
168 <td><font face=
"Times New Roman">Expects a model of
169 polygon_with_holes.
Returns the begin iterator over the range of
170 points that correspond to vertices of the polygon.
</font></td>
173 <td width=
"586"><font face=
"Courier New">template
174 <typename T
><br />
175 point_iterator_type
<b>end_points
</b>(const T
& polygon)
</font></td>
176 <td><font face=
"Times New Roman">Expects a model of
177 polygon_with_holes.
Returns the end iterator over the range of
178 points that correspond to vertices of the polygon.
</font></td>
181 <td width=
"586"><font face=
"Courier New">template
182 <typename T
><br />
183 hole_iterator_type
<b>begin_holes
</b>(const T
& polygon)
</font></td>
184 <td><font face=
"Times New Roman">Expects a model of
185 polygon_with_holes.
Returns the begin iterator over the range of
186 coordinates that correspond to horizontal and vertical edges.
</font></td>
189 <td width=
"586"><font face=
"Courier New">template
190 <typename T
><br />
191 hole_iterator_type
<b>end_holes
</b>(const T
& polygon)
</font></td>
192 <td><font face=
"Times New Roman">Expects a model of
193 polygon_with_holes.
Returns the end iterator over the range of
194 coordinates that correspond to horizontal and vertical edges.
</font></td>
197 <td width=
"586"><font face=
"Courier New">template
198 <typename T, typename iterator
><br />
199 void
<b>set_points
</b>(T
& polygon, iterator b, iterator e)
</font></td>
200 <td><font face=
"Times New Roman">Expects a model of
201 polygon_with_holes.
Sets the polygon to the point data
202 range [b,e) that corresponds to vertices of a polygon.
</font></td>
205 <td width=
"586"><font face=
"Courier New">template
206 <typename T, typename iterator
><br />
207 void
<b>set_holes
</b>(T
& polygon, iterator b, iterator e)
</font></td>
208 <td><font face=
"Times New Roman">Expects a model of
209 polygon_with_holes.
Sets the polygon holes to the hole data
210 range [b,e)
</font></td>
213 <td width=
"586"><font face=
"Courier New">template
214 <typename T
><br />
215 unsigned int
<b>size
</b>(const T
& polygon)
</font></td>
216 <td><font face=
"Times New Roman">Returns the number of
217 edges in the outer shell of the polygon_with_holes.
Does not
218 include sizes of the holes.
</font></td>
221 <td width=
"586"><font face=
"Courier New">template
222 <typename T1, typename T2
><br />
223 T1
& <b>assign
</b>(T1
& left, const T2
& right)
</font></td>
224 <td>Copies data from right object that models
225 polygon_with_holes or one of its refinements into left object that
226 models polygon_with_holes.
</td>
229 <td width=
"586"><font face=
"Courier New">template
230 <typename T, typename point_type
><br />
231 bool
<b>contains
</b>(const T
&, const point_type
& point,
<br />
232
233 bool consider_touch=true)
</font></td>
234 <td>Given an object that models polygon_with_holes and an
235 object that models point, returns true if the polygon shell contains
236 the point and one of its holes does not contain the point.
If the
237 consider_touch flag is true will return true if the point lies along
238 the boundary of the polygon or one of its holes.
</td>
241 <td width=
"586"><font face=
"Courier New">// get the center
243 template
<typename T, typename point_type
><br />
244 void
<b>center
</b>(point_type
& p, const T
& polygon)
</font></td>
245 <td>Sets object that models point to the center point of
246 the bounding box of an object that models polygon_with_holes.
</td>
249 <td width=
"586"><font face=
"Courier New">template
250 <typename T, typename rectangle_type
><br />
251 bool
<b>extents
</b>(rectangle_type
& bbox, const T
& polygon)
</font></td>
252 <td>Sets object that models rectangle to the bounding box
253 of an object that models polygon_with_holes and returns true.
254 Returns false and leaves bbox unchanged if polygon is empty.
</td>
257 <td width=
"586"><font face=
"Courier New">template
258 <typename T
><br />
259 manhattan_area_type
<b>area
</b>(const T
& polygon)
</font></td>
260 <td>Returns the area of an object that models
261 polygon_with_holes including subtracting the area of its holes from the
262 area of the outer shell polygon.
</td>
265 <td width=
"586"><font face=
"Courier New">template
266 <typename T
><br />
267 direction_1d
<b>winding
</b>(const T
& polygon)
</font></td>
268 <td>Returns the winding direction of an object that models
269 polygon_with_holes, LOW == CLOCKWISE, HIGH = COUNTERCLOCKWISE.
</td>
272 <td width=
"586"><font face=
"Courier New">template
273 <typename T
><br />
274 coordinate_difference
<b>perimeter
</b>(const T
& polygon)
</font></td>
275 <td>Returns the perimeter length of an object that models
276 polygon, including the perimeters of the holes.
</td>
279 <td width=
"586"><font face=
"Courier New">template
280 <typename T, typename transform_type
><br />
281 T
& <b>transform
</b>(T
& polygon, const transform_type
&)
</font></td>
282 <td>Applies transform() on the vertices of polygon and sets
283 the polygon to that described by the result of transforming its
284 vertices.
Also applies transform() on the holes of the polygon.
</td>
287 <td width=
"586"><font face=
"Courier New">template
288 <typename T
><br />
289 T
& <b>scale_up
</b>(T
& polygon, unsigned_area_type factor)
</font></td>
290 <td>Scales up outer shell and holes of an object that
291 models polygon by unsigned factor.
</td>
294 <td width=
"586"><font face=
"Courier New">template
295 <typename T
><br />
296 T
& <b>scale_down
</b>(T
& polygon, unsigned_area_type factor)
</font></td>
297 <td>Scales down outer shell and holes of an object that
298 models polygon by unsigned factor.
</td>
301 <td width=
"586"><font face=
"Courier New">template
302 <typename T, scaling_type
><br />
303 T
& <b>scale
</b>(T
& rectangle, double scaling)
</font></td>
304 <td>Scales outer shell and holes of an object that models
305 polygon by floating point factor.
</td>
308 <td width=
"586"><font face=
"Courier New">template
309 <typename T
><br />
310 T
& <b>move
</b>(T
& polygon, orientation_2d,
<br />
311 coordinate_difference
312 displacement)
</font></td>
313 <td>Adds displacement value to coordinate indicated by
314 orientation_2d of vertices of an object that models polygon .
</td>
317 <td width=
"586"><font face=
"Courier New">template
318 <typename polygon_type, typename point_type
><br />
319 polygon_type
& <b>convolve
</b>(polygon_type
& polygon,
<br />
320
321 const point_type
& point)
</font></td>
322 <td>Convolves coordinate values of point with the outer
323 shell and holes of an object that models polygon_with_holes.
</td>
327 <h1>Polygon With Holes Data
</h1>
329 <p>The library provides a model of polygon with holes concept
331 <font face=
"Courier New">template
<typename T
>
332 polygon_with_holes_data
</font>where T is the coordinate type.
</p>
333 <p>This data type is used internally when a polygon with holes is
334 needed and is available to the library user who finds it convenient to
335 use a library polygon data type instead of providing their own.
336 The data type is implemented to be convenient to use with the library
339 <table id=
"table2" border=
"1" width=
"100%">
342 <td width=
"586"><b><font face=
"Courier New">geometry_type
</font></b></td>
343 <td><font face=
"Times New Roman">polygon_with_holes_concept
</font></td>
346 <td width=
"586"><b><font face=
"Courier New">coordinate_type
</font></b></td>
347 <td><font face=
"Times New Roman">T
</font></td>
350 <td width=
"586"><b><font face=
"Courier New">iterator_type
</font></b></td>
351 <td>Iterator over vertices point_data
<T
> vertices of
355 <td width=
"586"><b><font face=
"Courier New">iterator_holes_type
</font></b></td>
356 <td><font face=
"Times New Roman">Iterator over hole
357 polygons of type polygon_data
<T
>.
</font></td>
360 <td width=
"586"><font face=
"Courier New"><b>polygon_with_holes_data
</b>()
</font></td>
361 <td><font face=
"Times New Roman">Default constructs the
</font>polygon.
</td>
364 <td width=
"586"><font face=
"Courier New"><b>polygon_with_holes_data
</b>(const
365 polygon_with_holes_data
& that)
</font></td>
366 <td><font face=
"Times New Roman">Copy construct
</font></td>
369 <td width=
"586"><font face=
"Courier New">polygon_with_holes_data
&
371 operator=
</b>(const polygon_with_holes_data
& that)
</font></td>
372 <td>Assignment operator.
</td>
375 <td width=
"586"><font face=
"Courier New">template
376 <typename T2
><b> </b> polygon_with_holes_data
&<b> <br />
377 operator=
</b>(const T2
& that) const
</font></td>
378 <td>Assign from an object that is a model of polygon with
382 <td width=
"586"><font face=
"Courier New">iterator_type
<b>begin
</b>()
384 <td>Get the begin iterator over vertices of the polygon.
</td>
387 <td width=
"586"><font face=
"Courier New">iterator_type
<b>end
</b>()
389 <td>Get the end iterator over vertices of the polygon.
</td>
392 <td width=
"586"><font face=
"Courier New">iterator_hole_type
393 <b>begin_holes
</b>() const
</font></td>
394 <td>Get the begin compact iterator over non-redundant
395 coordinates of the polygon.
</td>
398 <td width=
"586"><font face=
"Courier New">iterator_hole_type
399 <b>end_holes
</b>() const
</font></td>
400 <td>Get the end compact iterator over non-redundant
401 coordinates of the polygon.
</td>
404 <td width=
"586"><font face=
"Courier New">std::size_t
<b>size
</b>()
406 <td>Get the number of elements in the sequence stored to
407 the polygon, usually equal to the number of edges of the polygon.
</td>
410 <td width=
"586"><font face=
"Courier New">std::size_t
<b>size_holes
</b>()
412 <td>Get the number of holes in the polygon
</td>
415 <td width=
"586"><font face=
"Courier New">template
416 <typename iT
><b> <br />
417 </b>void
<b>set
</b>(iT begin_points, iT end_points)
</font></td>
418 <td>Sets the polygon to the iterator range of points.
</td>
421 <td width=
"586"><font face=
"Courier New">template
422 <typename iT
><b> <br />
423 </b>void
<b>set_holes
</b>(iT begin_holes, iT end_choless)
</font></td>
424 <td>Sets the polygon holes the iterator range of hole
425 polygons.
These polygons in the input range may be either
426 polygon_data or polygon_with_holes_data or any type that provides begin
427 and end member functions to iterate over point_data
<T
>.
</td>
434 <td style=
"background-color: rgb(238, 238, 238);" nowrap=
"1"
435 valign=
"top"> </td>
437 style=
"padding-left: 10px; padding-right: 10px; padding-bottom: 10px;"
438 valign=
"top" width=
"100%">
439 <table class=
"docinfo" id=
"table3" frame=
"void" rules=
"none">
440 <colgroup> <col class=
"docinfo-name" /><col
441 class=
"docinfo-content" /> </colgroup> <tbody valign=
"top">
443 <th class=
"docinfo-name">Copyright:
</th>
444 <td>Copyright © Intel Corporation
2008-
2010.
</td>
447 <th class=
"docinfo-name">License:
</th>
448 <td class=
"field-body">Distributed under the Boost Software
449 License, Version
1.0. (See accompanying file
<tt class=
"literal"> <span
450 class=
"pre">LICENSE_1_0.txt
</span></tt> or copy at
<a
451 class=
"reference" target=
"_top"
452 href=
"http://www.boost.org/LICENSE_1_0.txt">
453 http://www.boost.org/LICENSE_1_0.txt
</a>)
</td>