mirror of
https://github.com/boostorg/geometry.git
synced 2026-02-09 23:22:10 +00:00
Merge branch 'develop' of github.com:boostorg/geometry into develop
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
* [@https://svn.boost.org/trac/boost/ticket/9245 9245] Check for process errors in make_qbk.py
|
||||
* [@https://svn.boost.org/trac/boost/ticket/9081 9081] Booleans create self-intersecting polygons from non-self-intersecting polygons
|
||||
* [@https://svn.boost.org/trac/boost/ticket/8310 8310] Wrong results with overlapping polygons (fixed using point_on_surface for disjoint)
|
||||
* [@https://svn.boost.org/trac/boost/ticket/9871 9871] Remove spike in polygon with only a spike
|
||||
|
||||
[*Bugfixes]
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ struct range_remove_spikes
|
||||
std::size_t const min_num_points = core_detail::closure::minimum_ring_size
|
||||
<
|
||||
geometry::closure<Range>::value
|
||||
>::value;
|
||||
>::value - 1; // subtract one: a polygon with only one spike should result into one point
|
||||
if (n < min_num_points)
|
||||
{
|
||||
return;
|
||||
@@ -104,13 +104,13 @@ struct range_remove_spikes
|
||||
found = false;
|
||||
// Check for spike in first point
|
||||
int const penultimate = 2;
|
||||
while(cleaned.size() > 3 && detail::point_is_spike_or_equal(cleaned.front(), *(cleaned.end() - penultimate), cleaned.back()))
|
||||
while(cleaned.size() >= 3 && detail::point_is_spike_or_equal(cleaned.front(), *(cleaned.end() - penultimate), cleaned.back()))
|
||||
{
|
||||
cleaned.pop_back();
|
||||
found = true;
|
||||
}
|
||||
// Check for spike in second point
|
||||
while(cleaned.size() > 3 && detail::point_is_spike_or_equal(*(cleaned.begin() + 1), cleaned.back(), cleaned.front()))
|
||||
while(cleaned.size() >= 3 && detail::point_is_spike_or_equal(*(cleaned.begin() + 1), cleaned.back(), cleaned.front()))
|
||||
{
|
||||
cleaned.pop_front();
|
||||
found = true;
|
||||
@@ -118,6 +118,13 @@ struct range_remove_spikes
|
||||
}
|
||||
while (found);
|
||||
|
||||
if (cleaned.size() == 2)
|
||||
{
|
||||
// Ticket #9871: open polygon with only two points.
|
||||
// the second point forms, by definition, a spike
|
||||
cleaned.pop_back();
|
||||
}
|
||||
|
||||
// Close if necessary
|
||||
if (geometry::closure<Range>::value == geometry::closed)
|
||||
{
|
||||
|
||||
@@ -134,6 +134,32 @@ void test_polygons()
|
||||
test_geometry<polygon>("spike_with_corner",
|
||||
"POLYGON((0 0,0 4,4 4,4 2,6 2,6 4,6 2,4 2,4 0,0 0))",
|
||||
16, 16);
|
||||
|
||||
test_geometry<polygon>("triangle0",
|
||||
"POLYGON((0 0,0 4,2 0,4 0,0 0))",
|
||||
4, 6 + sqrt(20.0));
|
||||
test_geometry<polygon>("triangle1",
|
||||
"POLYGON((0 4,2 0,4 0,0 0,0 4))",
|
||||
4, 6 + sqrt(20.0));
|
||||
test_geometry<polygon>("triangle2",
|
||||
"POLYGON((2 0,4 0,0 0,0 4,2 0))",
|
||||
4, 6 + sqrt(20.0));
|
||||
test_geometry<polygon>("triangle3",
|
||||
"POLYGON((4 0,0 0,0 4,2 0,4 0))",
|
||||
4, 6 + sqrt(20.0));
|
||||
|
||||
test_geometry<polygon>("only_spike1",
|
||||
"POLYGON((0 0,2 2,0 0))",
|
||||
0, 0);
|
||||
test_geometry<polygon>("only_spike2",
|
||||
"POLYGON((0 0,2 2,4 4,2 2,0 0))",
|
||||
0, 0);
|
||||
test_geometry<polygon>("only_spike3",
|
||||
"POLYGON((0 0,2 2,4 4,0 0))",
|
||||
0, 0);
|
||||
test_geometry<polygon>("only_spike4",
|
||||
"POLYGON((0 0,4 4,2 2,0 0))",
|
||||
0, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user