From 535273b9e0dc263b0f56a059245488817cacf06d Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 18 Mar 2021 19:05:48 -0400 Subject: [PATCH] add smarter route planning when there are multiple tops to choose from --- src/geo/polygons.js | 40 ++++++++++++++++++++++++++++++++++++++++ src/mode/cam/prepare.js | 7 ++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 39aac8cf..e7b324d8 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -29,6 +29,7 @@ trimTo, expand, expand_lines, + route, union, inset, nest, @@ -865,4 +866,43 @@ return true; } + // plan a route through an array of polygon center points + // starting with the polygon center closest to "start" + function route(polys, start) { + let centers = []; + let first, minDist = Infinity; + for (let poly of polys) { + let center = poly.average(); + let rec = {poly, center, used: false}; + let dist = center.distTo2D(start); + if (dist < minDist) { + first = rec; + minDist = dist; + } + centers.push(rec); + } + first.used = true; + let routed = [ first ]; + for (;;) { + let closest; + let minDist = Infinity; + for (let rec of centers) { + if (!rec.used) { + let dist = rec.center.distTo2D(first.center); + if (dist < minDist) { + minDist = dist; + closest = rec; + } + } + } + if (!closest) { + break; + } else { + closest.used = true; + routed.push(first = closest); + } + } + return routed.map(r => r.poly); + } + })(); diff --git a/src/mode/cam/prepare.js b/src/mode/cam/prepare.js index 66cc66f4..ba872983 100644 --- a/src/mode/cam/prepare.js +++ b/src/mode/cam/prepare.js @@ -418,7 +418,12 @@ } let ltops = tops[depth]; let fitted = fit ? ltops.filter(poly => poly.isInside(fit, 0.01)) : ltops; - fitted.filter(top => !top.level_emit).forEach(top => { + let ftops = fitted.filter(top => !top.level_emit); + if (ftops.length > 1) { + console.log({depth, ftops}); + ftops = POLY.route(ftops, start); + } + ftops.forEach(top => { top.level_emit = true; let inside = level.filter(poly => poly.isInside(top)); if (ease) {