Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: distinguish turn to discard in case of start turns #1343

Merged
merged 3 commits into from
Nov 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions doc/release_notes.qbk
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,29 @@
[section:release_notes Release Notes]

[/=================]
[heading Boost 1.88]
[heading Boost 1.87]
[/=================]

[*Improvements]

* Use using instead of typedef in part of the code
* Modernize meta function with alias in part of the code
* Add support for modular build structure
* Complete CMake coverage
* Improve documentation workflow
* Update Qt end WxWidgets examples
* Add enumerate to prepare for 17 and 23

[*Breaking changes]

* Remove deprecated rescaling code

[*Solved issues]

* [@https://github.com/boostorg/geometry/issues/1309 1309] Fix some missing qbk includes
* [@https://github.com/boostorg/geometry/issues/1226 1226] [@https://github.com/boostorg/geometry/issues/1326 1326] Fix extra round on ring

* [@https://github.com/boostorg/geometry/issues/1293 1293] [@https://github.com/boostorg/geometry/issues/1294 1294] [@https://github.com/boostorg/geometry/issues/1295 1295] Fix traversal through non clustered rings
* [@https://github.com/boostorg/geometry/issues/1342 1342] Fix discarding a start turn for combination with touch

[/=================]
[heading Boost 1.85]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,26 +104,31 @@ void discard_duplicate_start_turns(Turns& turns,
return multi_and_ring_id_type{seg_id.multi_index, seg_id.ring_index};
};

for (auto const& turn : turns)
for (auto& turn : turns)
{
// Any turn which "crosses" does not have a corresponding turn.
// Also avoid comparing "start" with itself
if (turn.method == method_crosses || turn.method == method_start)
{
continue;
}
bool const is_touch = turn.method == method_touch;
for (auto const& op : turn.operations)
{
auto it = start_turns_by_segment.find(adapt_id(op.seg_id));
if (it != start_turns_by_segment.end())
if (it == start_turns_by_segment.end())
{
for (std::size_t const& i : it->second)
continue;
}
for (std::size_t const& i : it->second)
{
auto& start_turn = turns[i];
if (start_turn.cluster_id == turn.cluster_id
&& corresponding_turn(turn, start_turn, geometry0, geometry1))
{
if (turns[i].cluster_id == turn.cluster_id
&& corresponding_turn(turn, turns[i], geometry0, geometry1))
{
turns[i].discarded = true;
}
// Discard the start turn, unless there is a touch before.
// In that case the start is used and the touch is discarded.
(is_touch ? turn : start_turn).discarded = true;
barendgehrels marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
Expand Down
12 changes: 12 additions & 0 deletions test/algorithms/overlay/overlay_cases.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1219,6 +1219,18 @@ static std::string issue_1326[2] =
"POLYGON((-8.78625207542057 1.47256621042848,-8.7713880762347 1.56833897112359,-8.54870763952499 1.98231380430185,-8.38536606998748 2.07941797642276,-8.33146477996655 2.0901167844798,-6.33512517561985 2.16974517238479,-5.57210759837464 2.18803744441122,-1.10154617615509 2.18080908730283,-0.182335452668298 1.77473544450602,-0.101072642349846 1.70875977436368,-0.00289004633636303 1.59446412805576,0.123812278264287 1.4079409294325,0.130584672613603 1.37357814410482,0.17646634130118 0.897752998467649,0.184490648597164 0.600369907975512,0.180036363994123 0.284803921497103,0.07694307247317141 0.151908777171867,0.0269420690240159 0.09795742893367709,-0.984492757676803 -0.593037244494384,-1.07964346095732 -0.633124388260264,-8.500679967807759 1.25877844922534,-8.78625207542057 1.47256621042848))"
};

static std::string issue_1342_a[2] =
{
"POLYGON((0 0,2.000000861538488 2.0000008,23.52786548447633 2.0000008,25.3497180322038 1.569919497715026,26 0,0 0))",
"POLYGON((2.000000861538488 0,2.000000861538488 2.0000008,23.52786548447633 2.0000008,23.52786548447633 0,2.000000861538488 0))"
};

static std::string issue_1342_b[2] =
{
"POLYGON((0 2.944711629068049e-16,2.000000861538488 2.0000008,23.52786548447633 2.0000008,25.3497180322038 1.569919497715026,26 2.775557561562891e-15,0 2.944711629068049e-16))",
"POLYGON((2.000000861538488 2.944711629068049e-16,2.000000861538488 2.0000008,23.52786548447633 2.0000008,23.52786548447633 2.944711629068049e-16,2.000000861538488 2.944711629068049e-16))"
};

static std::string ggl_list_20120229_volker[3] =
{
"POLYGON((1716 1554,2076 2250,2436 2352,2796 1248,3156 2484,3516 2688,3516 2688,3156 2484,2796 1248,2436 2352,2076 2250, 1716 1554))",
Expand Down
14 changes: 13 additions & 1 deletion test/algorithms/set_operations/difference/difference.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,16 @@ void test_all()

TEST_DIFFERENCE(issue_1244, 3, 8, 3, 2, 6);

TEST_DIFFERENCE(issue_1293, 1, 1.40999, 1, 2.318951, 2);
{
// The symmetric difference reports an invalidity since the choice of
// discarding start/touch turns.
// This might be a false negative.
// Clockwise: "method: t; operations: u/x"
// CCW: "method: m; operations: i/x"
ut_settings settings;
settings.validity_of_sym = false;
TEST_DIFFERENCE_WITH(issue_1293, 1, 1.40999, 1, 2.318951, 2, settings);
}

#if defined(BOOST_GEOMETRY_TEST_FAILURES)
// Difference fails for this case. This was not reported for this case.
Expand All @@ -635,6 +644,9 @@ void test_all()

TEST_DIFFERENCE(issue_1326, 3, 6.7128537626409130468, 6, 0.00372806966532758478, 9);

TEST_DIFFERENCE(issue_1342_a, 2, 5.762381026454777, 0, 0.0, 2);
TEST_DIFFERENCE(issue_1342_b, 2, 5.762381026454777, 1, 2.55e-14, 3);

TEST_DIFFERENCE(mysql_21977775, 2, 160.856568913, 2, 92.3565689126, 4);
TEST_DIFFERENCE(mysql_21965285, 1, 92.0, 1, 14.0, 1);
TEST_DIFFERENCE(mysql_23023665_1, 1, 92.0, 1, 142.5, 2);
Expand Down
3 changes: 3 additions & 0 deletions test/algorithms/set_operations/intersection/intersection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,9 @@ void test_areal()
TEST_INTERSECTION(issue_1295, 1, -1, 4.90121);
TEST_INTERSECTION(issue_1326, 1, -1, 16.4844);

TEST_INTERSECTION(issue_1342_a, 1, -1, 43.05575);
TEST_INTERSECTION(issue_1342_b, 1, -1, 43.05575);

test_one<Polygon, Polygon, Polygon>("buffer_mp1", buffer_mp1[0], buffer_mp1[1],
1, 31, 2.271707796);
test_one<Polygon, Polygon, Polygon>("buffer_mp2", buffer_mp2[0], buffer_mp2[1],
Expand Down
6 changes: 6 additions & 0 deletions test/algorithms/set_operations/union/union.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,12 @@ void test_areal()
TEST_UNION(issue_1326, 1, 0, -1, 23.201);
TEST_UNION_REV(issue_1326, 1, 0, -1, 23.201);

TEST_UNION(issue_1342_a, 1, 0, -1, 48.81812749462216);
TEST_UNION_REV(issue_1342_a, 1, 0, -1, 48.81812749462216);

TEST_UNION(issue_1342_b, 1, 0, -1, 48.81812749462214);
TEST_UNION_REV(issue_1342_b, 1, 0, -1, 48.81812749462214);

TEST_UNION(geos_1, 1, 0, -1, expectation_limits(3458.0, 3461.3203125));
TEST_UNION(geos_2, 1, 0, -1, expectation_limits(349.0625, 350.55102539));
TEST_UNION(geos_3, 1, 0, -1, 29391548.4998779);
Expand Down
Loading