[dissolve] introduce Reverse to be able to (later) apply dissolve in two directions,

not only to support cw/ccw, but more to only use one version (positive area)
instead of processing cw input which is effectively ccw.
This commit is contained in:
Barend Gehrels 2018-01-12 11:18:25 +01:00
parent 5dbe743624
commit 2b59d7c867
4 changed files with 35 additions and 29 deletions

View File

@ -387,10 +387,9 @@ void test_dissolve(std::string const& caseid, Geometry const& geometry,
bg::dispatch::dissolve bg::dispatch::dissolve
< <
typename bg::tag<Geometry>::type,
typename bg::tag<GeometryOut>::type,
Geometry, Geometry,
GeometryOut GeometryOut,
false
>::apply(geometry, robust_policy, std::back_inserter(dissolved1), >::apply(geometry, robust_policy, std::back_inserter(dissolved1),
strategy, visitor); strategy, visitor);

View File

@ -28,7 +28,7 @@ namespace detail { namespace dissolve
for dissolves calls traversal_ring_creator in two phases for dissolves calls traversal_ring_creator in two phases
\ingroup dissolve \ingroup dissolve
*/ */
template <typename Backtrack> template <bool Reverse, typename Backtrack>
class traverse class traverse
{ {
@ -54,7 +54,7 @@ public :
{ {
detail::overlay::traversal_ring_creator detail::overlay::traversal_ring_creator
< <
false, false, overlay_dissolve, Reverse, Reverse, overlay_dissolve,
Geometry, Geometry, Geometry, Geometry,
Turns, TurnInfoMap, Clusters, Turns, TurnInfoMap, Clusters,
IntersectionStrategy, IntersectionStrategy,

View File

@ -113,7 +113,7 @@ public :
} }
}; };
template <typename Geometry, typename GeometryOut> template <typename Geometry, typename GeometryOut, bool Reverse>
struct dissolve_ring_or_polygon struct dissolve_ring_or_polygon
{ {
template <typename Turns> template <typename Turns>
@ -169,8 +169,9 @@ struct dissolve_ring_or_polygon
std::vector<turn_info> turns; std::vector<turn_info> turns;
detail::dissolve::no_interrupt_policy policy; detail::dissolve::no_interrupt_policy policy;
geometry::self_turns detail::self_get_turn_points::self_turns
< <
Reverse,
detail::overlay::assign_null_policy detail::overlay::assign_null_policy
>(geometry, strategy, rescale_policy, turns, policy, 0, false); >(geometry, strategy, rescale_policy, turns, policy, 0, false);
@ -205,7 +206,7 @@ struct dissolve_ring_or_polygon
typename Strategy::side_strategy_type const typename Strategy::side_strategy_type const
side_strategy = strategy.get_side_strategy(); side_strategy = strategy.get_side_strategy();
enrich_intersection_points<false, false, overlay_dissolve>(turns, enrich_intersection_points<Reverse, Reverse, overlay_dissolve>(turns,
clusters, geometry, geometry, rescale_policy, clusters, geometry, geometry, rescale_policy,
side_strategy); side_strategy);
@ -215,7 +216,7 @@ struct dissolve_ring_or_polygon
std::map<ring_identifier, overlay::ring_turn_info> turn_info_per_ring; std::map<ring_identifier, overlay::ring_turn_info> turn_info_per_ring;
detail::dissolve::traverse<backtrack_for_dissolve<Geometry> > detail::dissolve::traverse<Reverse, backtrack_for_dissolve<Geometry> >
::apply(geometry, strategy, rescale_policy, ::apply(geometry, strategy, rescale_policy,
turns, rings, turn_info_per_ring, clusters, visitor); turns, rings, turn_info_per_ring, clusters, visitor);
@ -297,25 +298,26 @@ namespace dispatch
template template
< <
typename GeometryTag,
typename GeometryOutTag,
typename Geometry, typename Geometry,
typename GeometryOut typename GeometryOut,
bool Reverse,
typename GeometryTag = typename tag<Geometry>::type,
typename GeometryOutTag = typename tag<GeometryOut>::type
> >
struct dissolve struct dissolve
: not_implemented<GeometryTag, GeometryOutTag> : not_implemented<GeometryTag, GeometryOutTag>
{}; {};
template<typename Polygon, typename PolygonOut> template<typename Polygon, typename PolygonOut, bool Reverse>
struct dissolve<polygon_tag, polygon_tag, Polygon, PolygonOut> struct dissolve<Polygon, PolygonOut, Reverse, polygon_tag, polygon_tag>
: detail::dissolve::dissolve_ring_or_polygon<Polygon, PolygonOut> : detail::dissolve::dissolve_ring_or_polygon<Polygon, PolygonOut, Reverse>
{}; {};
template<typename Ring, typename RingOut> template<typename Ring, typename RingOut, bool Reverse>
struct dissolve<ring_tag, ring_tag, Ring, RingOut> struct dissolve<Ring, RingOut, Reverse, ring_tag, ring_tag>
: detail::dissolve::dissolve_ring_or_polygon<Ring, RingOut> : detail::dissolve::dissolve_ring_or_polygon<Ring, RingOut, Reverse>
{}; {};
@ -365,10 +367,12 @@ inline OutputIterator dissolve_inserter(Geometry const& geometry,
return dispatch::dissolve return dispatch::dissolve
< <
typename tag<Geometry>::type,
typename tag<GeometryOut>::type,
Geometry, Geometry,
GeometryOut GeometryOut,
detail::overlay::do_reverse
<
geometry::point_order<Geometry>::value
>::value
>::apply(geometry, robust_policy, out, strategy, visitor); >::apply(geometry, robust_policy, out, strategy, visitor);
} }
@ -430,10 +434,12 @@ inline void dissolve(Geometry const& geometry, Collection& output_collection,
dispatch::dissolve dispatch::dissolve
< <
typename tag<Geometry>::type,
typename tag<geometry_out>::type,
Geometry, Geometry,
geometry_out geometry_out,
detail::overlay::do_reverse
<
geometry::point_order<Geometry>::value
>::value
>::apply(geometry, robust_policy, >::apply(geometry, robust_policy,
std::back_inserter(output_collection), std::back_inserter(output_collection),
strategy, visitor); strategy, visitor);

View File

@ -35,7 +35,7 @@ namespace boost { namespace geometry
namespace detail { namespace dissolve namespace detail { namespace dissolve
{ {
template <typename Multi, typename GeometryOut> template <typename Multi, typename GeometryOut, bool Reverse>
struct dissolve_multi struct dissolve_multi
{ {
template template
@ -59,7 +59,8 @@ struct dissolve_multi
dissolve_ring_or_polygon dissolve_ring_or_polygon
< <
polygon_type, polygon_type,
GeometryOut GeometryOut,
Reverse
>::apply(*it, rescale_policy, std::back_inserter(step1), >::apply(*it, rescale_policy, std::back_inserter(step1),
strategy, visitor); strategy, visitor);
} }
@ -96,9 +97,9 @@ namespace dispatch
{ {
template<typename Multi, typename GeometryOut> template<typename Multi, typename GeometryOut, bool Reverse>
struct dissolve<multi_polygon_tag, polygon_tag, Multi, GeometryOut> struct dissolve<Multi, GeometryOut, Reverse, multi_polygon_tag, polygon_tag>
: detail::dissolve::dissolve_multi<Multi, GeometryOut> : detail::dissolve::dissolve_multi<Multi, GeometryOut, Reverse>
{}; {};