[self_turns] Changes for self-turns and fix dissolve

This commit is contained in:
Barend Gehrels
2019-07-17 16:45:03 +02:00
parent 33ea069ac0
commit eefd70fcb7
3 changed files with 18 additions and 14 deletions

View File

@@ -87,11 +87,13 @@ public:
is_acceptable_turn<Geometry>
> interrupt_policy;
// Calculate self-turns, skipping adjacent segments
detail::self_get_turn_points::self_turns<false, turn_policy>(geometry,
strategy,
robust_policy,
turns,
interrupt_policy);
interrupt_policy,
0, true);
if (interrupt_policy.has_intersections)
{

View File

@@ -318,15 +318,20 @@ std::cout << "get turns" << std::endl;
visitor.visit_turns(1, turns);
#if ! defined(BOOST_GEOMETRY_NO_SELF_TURNS)
if (needs_self_turns<Geometry1>::apply(geometry1))
if (! turns.empty() || OverlayType == overlay_dissolve)
{
self_get_turn_points::self_turns<Reverse1, assign_null_policy>(geometry1,
strategy, robust_policy, turns, policy, 0);
}
if (needs_self_turns<Geometry2>::apply(geometry2))
{
self_get_turn_points::self_turns<Reverse2, assign_null_policy>(geometry2,
strategy, robust_policy, turns, policy, 1);
// Calculate self turns if the output contains turns already,
// and if necessary (e.g.: multi-geometry, polygon with interior rings)
if (needs_self_turns<Geometry1>::apply(geometry1))
{
self_get_turn_points::self_turns<Reverse1, assign_null_policy>(geometry1,
strategy, robust_policy, turns, policy, 0);
}
if (needs_self_turns<Geometry2>::apply(geometry2))
{
self_get_turn_points::self_turns<Reverse2, assign_null_policy>(geometry2,
strategy, robust_policy, turns, policy, 1);
}
}
#endif

View File

@@ -200,12 +200,9 @@ struct dissolve_ring
cluster_type clusters;
// Enrich/traverse the polygons
typename Strategy::side_strategy_type const
side_strategy = strategy.get_side_strategy();
enrich_intersection_points<Reverse, Reverse, overlay_dissolve>(turns,
clusters, input_ring, input_ring, rescale_policy,
side_strategy);
strategy);
visitor.visit_turns(2, turns);
@@ -374,7 +371,7 @@ struct dissolve_polygon
// expect - alternatively, difference could be used to have them pure
// as interior rings only
return detail::sym_difference::sym_difference_insert<GeometryOut>(
exterior_out, interior_out, rescale_policy, out);
exterior_out, interior_out, out);
}
};