From 2fdec7d2e4666cc1644bb30a96aca7011d301b80 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Fri, 6 Jan 2017 16:24:09 -0800 Subject: [PATCH] Try using Wagyu's quick_clip --- Makefile | 2 +- geometry.cpp | 31 +++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 581c541..23e2d71 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,7 @@ PG= H = $(wildcard *.h) $(wildcard *.hpp) C = $(wildcard *.c) $(wildcard *.cpp) -INCLUDES = -I/usr/local/include -I. +INCLUDES = -I../wagyu/include -I/usr/local/include -I. LIBS = -L/usr/local/lib tippecanoe: geojson.o jsonpull/jsonpull.o tile.o pool.o mbtiles.o geometry.o projection.o memfile.o mvt.o serial.o main.o text.o diff --git a/geometry.cpp b/geometry.cpp index 536432c..ed077dc 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "geometry.hpp" #include "projection.hpp" #include "serial.hpp" @@ -520,6 +521,10 @@ static drawvec clip_poly1(drawvec &geom, long long minx, long long miny, long lo drawvec simple_clip_poly(drawvec &geom, long long minx, long long miny, long long maxx, long long maxy) { drawvec out; + mapbox::geometry::point min(minx, miny); + mapbox::geometry::point max(maxx, maxy); + mapbox::geometry::box bbox(min, max); + for (size_t i = 0; i < geom.size(); i++) { if (geom[i].op == VT_MOVETO) { size_t j; @@ -529,19 +534,25 @@ drawvec simple_clip_poly(drawvec &geom, long long minx, long long miny, long lon } } - drawvec tmp; + mapbox::geometry::linear_ring ring; for (size_t k = i; k < j; k++) { - tmp.push_back(geom[k]); + ring.push_back(mapbox::geometry::point(geom[k].x, geom[k].y)); } - tmp = clip_poly1(tmp, minx, miny, maxx, maxy); - if (tmp.size() > 0) { - if (tmp[0].x != tmp[tmp.size() - 1].x || tmp[0].y != tmp[tmp.size() - 1].y) { - fprintf(stderr, "Internal error: Polygon ring not closed\n"); - exit(EXIT_FAILURE); + + optional_linear_ring lr = mapbox::geometry::wagyu::quick_clip::quick_lr_clip(ring, bbox); + + if (lr) { + for (size_t k = 0; k < lr->size(); k++) { + if (k == 0) { + out.push_back(draw(VT_MOVETO, (*lr)[k].x, (*lr)[k].y)); + } else { + out.push_back(draw(VT_LINETO, (*lr)[k].x, (*lr)[k].y)); + } + } + + if (lr->size() > 0 && (*lr)[0] != (*lr)[lr->size() - 1]) { + out.push_back(draw(VT_LINETO, (*lr)[0].x, (*lr)[0].y)); } - } - for (size_t k = 0; k < tmp.size(); k++) { - out.push_back(tmp[k]); } i = j - 1;