mirror of
https://github.com/boostorg/geometry.git
synced 2025-05-11 21:44:04 +00:00
[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:
parent
5dbe743624
commit
2b59d7c867
@ -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);
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user