From 2bc9e15975922d96edb020f8d67eecaed6f4b085 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 23 Sep 2016 15:39:19 -0700 Subject: [PATCH] Roll rings around so they start at an intersection transition, if any --- tile.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/tile.cpp b/tile.cpp index 333f5dc..b3073a7 100644 --- a/tile.cpp +++ b/tile.cpp @@ -611,15 +611,8 @@ void find_common_edges(std::vector &partials) { for (size_t i = 0; i < partials.size(); i++) { if (partials[i].t == VT_POLYGON) { for (size_t j = 0; j < partials[i].geoms.size(); j++) { - // following simplify_lines() for (size_t k = 0; k < partials[i].geoms[j].size(); k++) { - if (partials[i].geoms[j][k].op == VT_MOVETO) { - partials[i].geoms[j][k].necessary = 1; - } else if (partials[i].geoms[j][k].op == VT_LINETO) { - partials[i].geoms[j][k].necessary = 0; - } else { - partials[i].geoms[j][k].necessary = 1; - } + partials[i].geoms[j][k].necessary = 0; } for (size_t k = 1; k + 1 < partials[i].geoms[j].size(); k++) { @@ -668,9 +661,74 @@ void find_common_edges(std::vector &partials) { if (e1->second != e2->second) { partials[i].geoms[j][k].necessary = 1; + // printf("%lld,%lld\n", partials[i].geoms[j][k].x, partials[i].geoms[j][k].y); } } } + + // Roll rings that include a necessary point around so they start at one + + for (size_t k = 0; k < partials[i].geoms[j].size(); k++) { + if (partials[i].geoms[j][k].op == VT_MOVETO) { + ssize_t necessary = -1; + size_t l; + for (l = k + 1; l < partials[i].geoms[j].size(); l++) { + if (partials[i].geoms[j][l].op != VT_LINETO) { + break; + } + + if (partials[i].geoms[j][l].necessary) { + necessary = l; + } + } + + if (necessary >= 0) { + printf("roll %lu to %lu with %lu\n", k, l, necessary); + drawvec tmp; + + // l - 1 because the endpoint is duplicated + for (size_t m = necessary; m < l - 1; m++) { + tmp.push_back(partials[i].geoms[j][m]); + } + for (size_t m = k; m < necessary; m++) { + tmp.push_back(partials[i].geoms[j][m]); + } + + // replace the endpoint + tmp.push_back(partials[i].geoms[j][necessary]); + + if (tmp.size() != l - k) { + fprintf(stderr, "internal error shifting ring\n"); + exit(EXIT_FAILURE); + } + + for (size_t m = 0; m < tmp.size(); m++) { + if (m == 0) { + tmp[m].op = VT_MOVETO; + } else { + tmp[m].op = VT_LINETO; + } + + partials[i].geoms[j][k + m] = tmp[m]; + } + } + + k = l - 1; + } + } + +#if 0 + for (size_t k = 0; k < partials[i].geoms[j].size(); k++) { + if (partials[i].geoms[j][k].necessary) { + partial p = partials[i]; + drawvec dv; + dv.push_back(draw(VT_MOVETO, partials[i].geoms[j][k].x, partials[i].geoms[j][k].y)); + p.geoms[0] = dv; + p.t = VT_POINT; + partials.push_back(p); + } + } +#endif } } }