diff --git a/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp b/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp index 1978e8309..09a0d3745 100644 --- a/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp +++ b/include/boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp @@ -87,11 +87,13 @@ public: is_acceptable_turn > interrupt_policy; + // Calculate self-turns, skipping adjacent segments detail::self_get_turn_points::self_turns(geometry, strategy, robust_policy, turns, - interrupt_policy); + interrupt_policy, + 0, true); if (interrupt_policy.has_intersections) { diff --git a/include/boost/geometry/algorithms/detail/overlay/overlay.hpp b/include/boost/geometry/algorithms/detail/overlay/overlay.hpp index e52d3741a..6bda53e93 100644 --- a/include/boost/geometry/algorithms/detail/overlay/overlay.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/overlay.hpp @@ -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::apply(geometry1)) + if (! turns.empty() || OverlayType == overlay_dissolve) { - self_get_turn_points::self_turns(geometry1, - strategy, robust_policy, turns, policy, 0); - } - if (needs_self_turns::apply(geometry2)) - { - self_get_turn_points::self_turns(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::apply(geometry1)) + { + self_get_turn_points::self_turns(geometry1, + strategy, robust_policy, turns, policy, 0); + } + if (needs_self_turns::apply(geometry2)) + { + self_get_turn_points::self_turns(geometry2, + strategy, robust_policy, turns, policy, 1); + } } #endif diff --git a/include/boost/geometry/extensions/algorithms/dissolve.hpp b/include/boost/geometry/extensions/algorithms/dissolve.hpp index 080371bdc..902531cbc 100644 --- a/include/boost/geometry/extensions/algorithms/dissolve.hpp +++ b/include/boost/geometry/extensions/algorithms/dissolve.hpp @@ -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(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( - exterior_out, interior_out, rescale_policy, out); + exterior_out, interior_out, out); } };