From 7896c3c2c94afba7680b2fed43876524d2e17cdb Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Thu, 10 Mar 2016 17:07:22 -0800 Subject: [PATCH] Don't get stuck in a loop if subdividing a complex polygon fails --- geometry.cc | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/geometry.cc b/geometry.cc index eb0b8ae..a3af1ac 100644 --- a/geometry.cc +++ b/geometry.cc @@ -995,16 +995,29 @@ std::vector chop_polygon(std::vector &geoms) { midx /= count; midy /= count; + drawvec c1, c2; + if (maxy - miny > maxx - minx) { // printf("clipping y to %lld %lld %lld %lld\n", minx, miny, maxx, midy); - out.push_back(simple_clip_poly(geoms[i], minx, miny, maxx, midy)); + c1 = simple_clip_poly(geoms[i], minx, miny, maxx, midy); // printf(" and %lld %lld %lld %lld\n", minx, midy, maxx, maxy); - out.push_back(simple_clip_poly(geoms[i], minx, midy, maxx, maxy)); + c2 = simple_clip_poly(geoms[i], minx, midy, maxx, maxy); } else { // printf("clipping x to %lld %lld %lld %lld\n", minx, miny, midx, maxy); - out.push_back(simple_clip_poly(geoms[i], minx, miny, midx, maxy)); + c1 = simple_clip_poly(geoms[i], minx, miny, midx, maxy); // printf(" and %lld %lld %lld %lld\n", midx, midy, maxx, maxy); - out.push_back(simple_clip_poly(geoms[i], midx, miny, maxx, maxy)); + c2 = simple_clip_poly(geoms[i], midx, miny, maxx, maxy); + } + + if (c1.size() >= geoms[i].size()) { + fprintf(stderr, "Subdividing complex polygon failed\n"); + } else { + out.push_back(c1); + } + if (c2.size() >= geoms[i].size()) { + fprintf(stderr, "Subdividing complex polygon failed\n"); + } else { + out.push_back(c2); } again = true;