Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r61701 - in sandbox/geometry/boost/geometry: algorithms extensions/algorithms/buffer util
From: barend.gehrels_at_[hidden]
Date: 2010-04-30 05:11:08


Author: barendgehrels
Date: 2010-04-30 05:11:07 EDT (Fri, 30 Apr 2010)
New Revision: 61701
URL: http://svn.boost.org/trac/boost/changeset/61701

Log:
Changed area behaviour (now using reversible view to support ccw poylgons)
Added some buffer alternatives (all not perfect)
Added:
   sandbox/geometry/boost/geometry/extensions/algorithms/buffer/sectionalizing_buffer.hpp (contents, props changed)
   sandbox/geometry/boost/geometry/extensions/algorithms/buffer/splitting_buffer.hpp (contents, props changed)
   sandbox/geometry/boost/geometry/extensions/algorithms/buffer/traversing_buffer.hpp (contents, props changed)
   sandbox/geometry/boost/geometry/util/order_as_direction.hpp (contents, props changed)
Text files modified:
   sandbox/geometry/boost/geometry/algorithms/area.hpp | 59 ++++++++++++++-------------------------
   1 files changed, 22 insertions(+), 37 deletions(-)

Modified: sandbox/geometry/boost/geometry/algorithms/area.hpp
==============================================================================
--- sandbox/geometry/boost/geometry/algorithms/area.hpp (original)
+++ sandbox/geometry/boost/geometry/algorithms/area.hpp 2010-04-30 05:11:07 EDT (Fri, 30 Apr 2010)
@@ -31,6 +31,9 @@
 #include <boost/geometry/strategies/concepts/area_concept.hpp>
 
 #include <boost/geometry/util/math.hpp>
+#include <boost/geometry/util/order_as_direction.hpp>
+#include <boost/geometry/util/reversible_view.hpp>
+
 
 /*!
 \defgroup area area: calculate area of a geometry
@@ -84,24 +87,8 @@
 };
 
 
-
-
-/*!
- \brief Calculate area of a ring, specialized per order
- */
-template
-<
- typename Ring,
- order_selector Order,
- // closing_selector Closed -- for now assuming CLOSED, p(0) == p(n-1)
- typename Strategy
->
+template<typename Ring, iterate_direction Direction, typename Strategy>
 struct ring_area
-{};
-
-
-template<typename Ring, typename Strategy>
-struct ring_area<Ring, clockwise, Strategy>
 {
     BOOST_CONCEPT_ASSERT( (geometry::concept::AreaStrategy<Strategy>) );
 
@@ -114,7 +101,6 @@
         // Ignore warning (because using static method sometimes) on strategy
         boost::ignore_unused_variable_warning(strategy);
 
-
         // A closed linear_ring has at least four points,
         // if not, there is no (zero) area
         if (boost::size(ring) < 4)
@@ -122,39 +108,32 @@
             return type();
         }
 
- typedef typename boost::range_iterator<Ring const>::type iterator_type;
+ typedef reversible_view<Ring const, Direction> view_type;
+ typedef typename boost::range_iterator<view_type const>::type iterator_type;
 
+ view_type view(ring);
         typename Strategy::state_type state;
+ iterator_type it = boost::begin(view);
 
- iterator_type it = boost::begin(ring);
         for (iterator_type previous = it++;
- it != boost::end(ring);
+ it != boost::end(view);
             previous = it++)
         {
             strategy.apply(*previous, *it, state);
         }
- return strategy.result(state);
 
- }
-};
-
-template<typename Ring, typename Strategy>
-struct ring_area<Ring, counterclockwise, Strategy>
-{
- typedef typename Strategy::return_type type;
- static inline type apply(Ring const& ring, Strategy const& strategy)
- {
- // Counter clockwise rings negate the area result
- return -ring_area<Ring, clockwise, Strategy>::apply(ring, strategy);
+ return strategy.result(state);
     }
 };
 
 
 }} // namespace detail::area
 
+
 #endif // DOXYGEN_NO_DETAIL
 
 
+
 #ifndef DOXYGEN_NO_DISPATCH
 namespace dispatch
 {
@@ -181,13 +160,17 @@
 {};
 
 
-// Area of ring currently returns area of closed rings but it might be argued
-// that it is 0.0, because a ring is just a line.
 template <typename Geometry, order_selector Order, typename Strategy>
 struct area<ring_tag, Geometry, Order, Strategy>
- : detail::area::ring_area<Geometry, Order, Strategy>
+ : detail::area::ring_area
+ <
+ Geometry,
+ order_as_direction<Order>::value,
+ Strategy
+ >
 {};
 
+
 template <typename Polygon, order_selector Order, typename Strategy>
 struct area<polygon_tag, Polygon, Order, Strategy>
     : detail::calculate_polygon_sum
@@ -198,7 +181,7 @@
             detail::area::ring_area
                 <
                     typename ring_type<Polygon>::type,
- Order,
+ order_as_direction<Order>::value,
                     Strategy
>
>
@@ -261,6 +244,8 @@
>::apply(geometry, strategy);
 }
 
+
 }} // namespace boost::geometry
 
+
 #endif // BOOST_GEOMETRY_ALGORITHMS_AREA_HPP

Added: sandbox/geometry/boost/geometry/extensions/algorithms/buffer/sectionalizing_buffer.hpp
==============================================================================
--- (empty file)
+++ sandbox/geometry/boost/geometry/extensions/algorithms/buffer/sectionalizing_buffer.hpp 2010-04-30 05:11:07 EDT (Fri, 30 Apr 2010)
@@ -0,0 +1,162 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands.
+// 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)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_SECTIONALIZING_BUFFER_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_SECTIONALIZING_BUFFER_HPP
+
+#include <cstddef>
+
+#include <boost/foreach.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/buffer_side.hpp>
+#include <boost/geometry/algorithms/detail/buffer/intersecting_inserter.hpp>
+#include <boost/geometry/algorithms/detail/buffer/linestring_buffer.hpp>
+#include <boost/geometry/algorithms/detail/buffer/line_line_intersection.hpp>
+
+#include <boost/geometry/algorithms/detail/sections/get_section.hpp>
+#include <boost/geometry/algorithms/detail/sections/sectionalize.hpp>
+
+#include <boost/geometry/algorithms/dissolve.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+
+
+template
+<
+ typename GeometryOut, typename Geometry,
+ typename DistanceStrategy,
+ typename JoinStrategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+ , typename Mapper
+#endif
+>
+void sectionalizing_buffer(Geometry const& geometry,
+ std::vector<GeometryOut>& buffered,
+ DistanceStrategy const& distance_strategy,
+ JoinStrategy const& join_strategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+ , Mapper& mapper
+#endif
+ )
+{
+ typedef typename point_type<Geometry>::type point_type;
+ typedef geometry::box<point_type> box_type;
+ typedef geometry::sections<box_type, 2> sections_type;
+ typedef typename geometry::ring_type<GeometryOut>::type ring_type;
+
+ // TEMPORARY
+ typedef intersecting_inserter
+ <
+ std::vector<GeometryOut>
+ > inserter_type;
+
+
+ sections_type sections;
+ geometry::sectionalize(geometry, sections);
+
+
+
+ // Buffer all sections separately, and put them in a temporary vector
+ std::vector<GeometryOut> buffered_sections;
+ BOOST_FOREACH(typename sections_type::value_type const& section, sections)
+ {
+ if (! section.duplicate)
+ {
+ typedef typename boost::range_iterator
+ <
+ typename geometry::range_type<Geometry>::type const
+ >::type iterator_type;
+
+
+ inserter_type inserter(buffered_sections);
+
+ iterator_type begin, end;
+ typedef std::pair<iterator_type, iterator_type> section_range;
+ geometry::get_section(geometry, section, begin, end);
+ geometry::detail::buffer::linestring_buffer
+ <
+ section_range, ring_type, DistanceStrategy, JoinStrategy
+ >::apply(std::make_pair(begin, end), inserter,
+ distance_strategy,
+ join_strategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+ , mapper
+#endif
+ );
+ }
+ }
+
+ // IF there are bowl-like shapes, there can still be self-intersections
+ std::vector<GeometryOut> dissolved;
+ BOOST_FOREACH(GeometryOut const& p, buffered_sections)
+ {
+ geometry::dissolve(p, dissolved);
+ }
+
+ /*BOOST_FOREACH(GeometryOut const& p, buffered_sections)
+ {
+ if (geometry::intersects(p))
+ {
+ //std::cout << ".";
+ }
+ }*/
+
+ // TEMP
+ //buffered.swap(dissolved);
+ //return;
+ // END TEMP
+
+
+ BOOST_FOREACH(GeometryOut const& p, dissolved)
+ {
+ if (buffered.empty())
+ {
+ buffered.push_back(p);
+ //geometry::union_inserter<GeometryOut>(geometry, p, std::back_inserter(buffered));
+ }
+ else if (boost::size(buffered) == 1)
+ {
+ std::vector<GeometryOut> unioned;
+ geometry::union_inserter<GeometryOut>(buffered.front(), p, std::back_inserter(unioned));
+ buffered.swap(unioned);
+ }
+ else
+ {
+ std::cerr << " D " << buffered.size();
+ /*std::vector<GeometryOut> dissolved;
+ dissolved.push_back(p);
+ geometry::dissolver(buffered, dissolved);
+ dissolved.swap(buffered);*/
+ }
+ }
+
+ // Output
+}
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_SECTIONALIZING_BUFFER_HPP

Added: sandbox/geometry/boost/geometry/extensions/algorithms/buffer/splitting_buffer.hpp
==============================================================================
--- (empty file)
+++ sandbox/geometry/boost/geometry/extensions/algorithms/buffer/splitting_buffer.hpp 2010-04-30 05:11:07 EDT (Fri, 30 Apr 2010)
@@ -0,0 +1,115 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands.
+// 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)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_SPLITTING_BUFFER_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_SPLITTING_BUFFER_HPP
+
+#include <cstddef>
+
+#include <boost/foreach.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/buffer_side.hpp>
+#include <boost/geometry/algorithms/detail/buffer/intersecting_inserter.hpp>
+#include <boost/geometry/algorithms/detail/buffer/linestring_buffer.hpp>
+#include <boost/geometry/algorithms/detail/buffer/line_line_intersection.hpp>
+
+
+#include <boost/geometry/algorithms/detail/overlay/dissolver.hpp>
+#include <boost/geometry/algorithms/detail/overlay/split_rings.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+
+template
+<
+ typename GeometryOut, typename Geometry,
+ typename DistanceStrategy,
+ typename JoinStrategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+ , typename Mapper
+#endif
+>
+inline void splitting_buffer(Geometry const& geometry,
+ std::vector<GeometryOut>& buffered,
+ DistanceStrategy const& distance_strategy,
+ JoinStrategy const& join_strategy
+
+ , int option
+ )
+{
+ typedef typename ring_type<GeometryOut>::type ring_type;
+ typedef detail::buffer::intersecting_inserter
+ <
+ std::vector<GeometryOut>
+ > inserter_type;
+
+
+ inserter_type inserter(buffered);
+
+ detail::buffer::linestring_buffer
+ <
+ Geometry, GeometryOut, DistanceStrategy, JoinStrategy
+ >::apply(geometry, inserter, distance_strategy, join_strategy);
+
+ if (option == 0)
+ {
+ return;
+ }
+
+ std::vector<ring_type> rings;
+ BOOST_FOREACH(GeometryOut const& polygon, buffered)
+ {
+//std::cout << bg::wkt(polygon) << " ; POLYGON" << std::endl;
+ geometry::split_rings(polygon, rings);
+ }
+
+ if (option == 1)
+ {
+ buffered.resize(rings.size());
+ int i = 0;
+ BOOST_FOREACH(ring_type const& ring, rings)
+ {
+ exterior_ring(buffered[i++]) = ring;
+ }
+ return;
+ }
+
+ std::vector<GeometryOut> buffered_and_unioned;
+ geometry::dissolver(rings, buffered_and_unioned);
+
+ std::vector<GeometryOut> buffered_and_assembled;
+ detail::overlay::assemble<GeometryOut>(buffered_and_unioned,
+ std::map<ring_identifier, int>(),
+ buffered_and_unioned[0], buffered_and_unioned[0], 1, true, true,
+ std::back_inserter(buffered_and_assembled));
+
+ buffered = buffered_and_assembled;
+}
+
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_SPLITTING_BUFFER_HPP

Added: sandbox/geometry/boost/geometry/extensions/algorithms/buffer/traversing_buffer.hpp
==============================================================================
--- (empty file)
+++ sandbox/geometry/boost/geometry/extensions/algorithms/buffer/traversing_buffer.hpp 2010-04-30 05:11:07 EDT (Fri, 30 Apr 2010)
@@ -0,0 +1,90 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands.
+// 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)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TRAVERSING_BUFFER_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TRAVERSING_BUFFER_HPP
+
+#include <cstddef>
+
+#include <boost/foreach.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/strategies/buffer_side.hpp>
+#include <boost/geometry/algorithms/detail/buffer/intersecting_inserter.hpp>
+#include <boost/geometry/algorithms/detail/buffer/linestring_buffer.hpp>
+#include <boost/geometry/algorithms/detail/buffer/line_line_intersection.hpp>
+
+#include <boost/geometry/algorithms/detail/sections/get_section.hpp>
+#include <boost/geometry/algorithms/detail/sections/sectionalize.hpp>
+
+#include <boost/geometry/algorithms/dissolve.hpp>
+
+
+
+namespace boost { namespace geometry
+{
+
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace buffer
+{
+
+
+template
+<
+ typename GeometryOut, typename Geometry,
+ typename DistanceStrategy,
+ typename JoinStrategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+ , typename Mapper
+#endif
+>
+inline void traversing_buffer(Geometry const& geometry,
+ std::vector<GeometryOut>& buffered,
+ DistanceStrategy const& distance_strategy,
+ JoinStrategy const& join_strategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+ , Mapper& mapper
+#endif
+ )
+{
+ typedef typename ring_type<GeometryOut>::type ring_type;
+ typedef detail::buffer::intersecting_inserter
+ <
+ std::vector<GeometryOut>
+ > inserter_type;
+
+
+ inserter_type inserter(buffered);
+
+ detail::buffer::linestring_buffer
+ <
+ Geometry, GeometryOut, DistanceStrategy, JoinStrategy
+ >::apply(geometry, inserter, distance_strategy, join_strategy);
+
+ std::vector<GeometryOut> buffered_and_assembled;
+ detail::overlay::assemble<GeometryOut>(buffered,
+ std::map<ring_identifier, int>(),
+ buffered[0], buffered[0], 1, true, true,
+ std::back_inserter(buffered_and_assembled));
+
+ buffered = buffered_and_assembled;
+}
+
+
+}} // namespace detail::buffer
+#endif // DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_BUFFER_TRAVERSING_BUFFER_HPP

Added: sandbox/geometry/boost/geometry/util/order_as_direction.hpp
==============================================================================
--- (empty file)
+++ sandbox/geometry/boost/geometry/util/order_as_direction.hpp 2010-04-30 05:11:07 EDT (Fri, 30 Apr 2010)
@@ -0,0 +1,42 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+//
+// Copyright Barend Gehrels 2010, Geodan, Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// 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)
+
+#ifndef BOOST_GEOMETRY_UTIL_ORDER_AS_DIRECTION_HPP
+#define BOOST_GEOMETRY_UTIL_ORDER_AS_DIRECTION_HPP
+
+#include <boost/geometry/core/point_order.hpp>
+#include <boost/geometry/util/reversible_view.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+
+template<order_selector Order>
+struct order_as_direction
+{};
+
+
+template<>
+struct order_as_direction<clockwise>
+{
+ static const iterate_direction value = iterate_forward;
+};
+
+
+template<>
+struct order_as_direction<counterclockwise>
+{
+ static const iterate_direction value = iterate_reverse;
+};
+
+
+}} // namespace boost::geometry
+
+
+#endif // BOOST_GEOMETRY_UTIL_ORDER_AS_DIRECTION_HPP


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk