1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- [/============================================================================
- Boost.Geometry (aka GGL, Generic Geometry Library)
- Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
- Copyright (c) 2009-2012 Barend Gehrels, Amsterdam, the Netherlands.
- Copyright (c) 2009-2012 Bruno Lalande, Paris, France.
- Use, modification and distribution is subject to the Boost Software License,
- Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt)
- =============================================================================/]
- [section:concept_polygon Polygon Concept]
- [heading Description]
- [concept Polygon..polygon]
- A polygon is ['A polygon is a planar surface defined by one exterior boundary and zero or more interior boundaries]
- (__ogc_sf__).
- So the definition of a Boost.Geometry polygon differs a bit from e.g. Wiki, where a polygon does not have holes. A
- polygon of Boost.Geometry is a polygon with or without holes.
- ['(A polygon without holes is a ['helper geometry] within Boost.Geometry, and referred to as a ring.)]
- [heading Concept Definition]
- The Polygon Concept is defined as following:
- * there must be a specialization of `traits::tag` defining `polygon_tag` as type
- * there must be a specialization of `traits::ring_type` defining the type of its exterior ring and interior rings as type
- * this type defined by `ring_type` must fulfill the [link geometry.reference.concepts.concept_ring Ring Concept]
- * there must be a specialization of `traits::interior_type` defining the type of the collection of its interior rings as type;
- this collection itself must fulfill a Boost.Range Random Access Range Concept
- * there must be a specialization of `traits::exterior_ring` with two functions named `get`, returning the exterior ring, one being const, the other being non const
- * there must be a specialization of `traits::interior_rings` with two functions named `get`, returning the interior rings, one being const, the other being non const
- [heading Rules]
- Besides the Concepts, which are checks on compile-time, there are some other
- rules that valid polygons must fulfill. This follows the opengeospatial rules (see link
- above).
- * Polygons are simple geometric objects (See also [@http://en.wikipedia.org/wiki/Simple_polygon wiki]
- but holes are allowed in __boost_geometry__ polygons).
- * If the polygons underlying `ring_type` is defined as clockwise, the exterior
- ring must have the clockwise orientation, and any interior ring must be
- reversed w.r.t. the defined orientation (so: counter clockwise for clockwise exterior rings).
- If the `ring_type` is defined counter clockwise, it is vice versa.
- * If the polygons underlying `ring_type` is defined as closed, all rings must be
- closed: the first point must be spatially equal to the last point.
- * The interior is a connected point set.
- * There should be no self intersections, but self tangencies (between
- exterior/interior rings) are allowed (as long as the interior is a connected
- point set.
- * There should be no cut lines, spikes or punctures.
- * The interior rings should be located within the exterior ring. Interior rings
- may not be located within each other.
- The algorithms such as intersection, area, centroid, union, etc. do not check
- validity. There will be an algorithm is_valid which checks for
- validity against these rules, at runtime, and which can be called (by the library
- user) before.
- If the input is invalid, the output might be invalid too. For example: if a polygon
- which should be closed is not closed, the area will be incorrect.
- [heading Available Models]
- * [link geometry.reference.models.model_polygon polygon]
- * a Boost.Polygon polygon_with_holes_data (requires `#include boost/geometry/geometries/adapted/boost_polygon/polygon.hpp>`)
- [endsect]
|