From e19f64c1a2ddeeca6998506975e253b1ec280812 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 11 Feb 2018 16:18:46 -0500 Subject: [PATCH] new fill technique --- js/geo-polygons.js | 27 ++++++++++++++++++++---- js/kiri-print.js | 52 +++++++++++++++++++++++++++++++++------------- 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/js/geo-polygons.js b/js/geo-polygons.js index d56bcd63..30533eda 100644 --- a/js/geo-polygons.js +++ b/js/geo-polygons.js @@ -621,6 +621,7 @@ var gs_base_polygons = exports; // store origin as start/affinity point for fill rayint.origin = newPoint(start.x, start.y, start.z); + rayint.mindex = Infinity; for (i = 0; i < steps; i++) { var p1 = newPoint(start.x - raySlope.dx * 1000, start.y - raySlope.dy * 1000, zpos, NOKEY), @@ -628,7 +629,7 @@ var gs_base_polygons = exports; // store origin line for distance tests in print if (i == 0) rayint.oline = [p1,p2]; - + lines.push([p1,p2]); start.x += stepX; start.y += stepY; @@ -637,6 +638,8 @@ var gs_base_polygons = exports; clip.AddPaths(lines, ptyp.ptSubject, false); clip.AddPaths(toClipper(polys), ptyp.ptClip, true); + lines = []; + if (clip.Execute(ctyp.ctIntersection, ctre, cfil.pftNonZero, cfil.pftEvenOdd)) { ctre.m_AllPolys.forEach(function(poly) { if (minlen || maxlen) { @@ -644,12 +647,28 @@ var gs_base_polygons = exports; if (minlen && plen < minlen) return; if (maxlen && plen > maxlen) return; } - poly.m_polygon.forEach(function(point) { - rayint.push(newPoint(null,null,zpos,null,point)); - }); + var p1 = newPoint(null,null,zpos,null,poly.m_polygon[0]); + var p2 = newPoint(null,null,zpos,null,poly.m_polygon[1]); + var od = Math.round(rayint.origin.distToLine(p1,p2) / spacing); + rayint.mindex = Math.min(rayint.mindex, od); + lines.push([p1, p2, od]); + // poly.m_polygon.forEach(function(point) { + // rayint.push(newPoint(null,null,zpos,null,point)); + // }); }); } + lines.sort(function(a,b) { + return a[2] - b[2]; + }) + + lines.forEach(function(line, index) { + line[0].index = line[2]; + line[1].index = line[2]; + rayint.push(line[0]); + rayint.push(line[1]); + }) + return rayint; } diff --git a/js/kiri-print.js b/js/kiri-print.js index 54aa8cd5..2756134b 100644 --- a/js/kiri-print.js +++ b/js/kiri-print.js @@ -569,8 +569,12 @@ var gs_kiri_print = exports; function outputFills(lines, bounds) { var mindist, p1, p2, dist, point, find, list, len, lastout, origin, lastDist2Origin, skip = false, - pass = 0; - + pass = 0, + marked = 0, + lastIndex = null, + nextIndex = lines.mindex; +var time = new Date().getTime(); +var scans = 0, sorts = 0; while (lines) { list = []; mindist = Infinity; @@ -578,11 +582,23 @@ var gs_kiri_print = exports; // order all points by distance to last point for (i=0; i lines.mindex && point.index > nextIndex) break; if (point.del) continue; dist = origin.distTo2D(point); - list.push({i:i, p:point, d:dist}); + list.push({i:i, p:point, d:origin.distTo2D(point)}); +scans++; + } + // restart near origin if some still unmarked + if (list.length === 0 && marked < lines.length) { + lastIndex = null; + nextIndex = lines.mindex; + continue; } if (list.length > 0) { +// scans += list.length; +sorts++; +console.log({sorting:list.length, ni:nextIndex, ll:lines.lenght}); list.sort(function(a,b) { return a.d - b.d }); find = list[0]; @@ -598,23 +614,28 @@ var gs_kiri_print = exports; dist = startPoint.distTo2D(p1); // find next closest to fill origin on seek - if (antiBacklash) { - var dist2Origin = p1.distToLine(lines.oline[0], lines.oline[1]); - if (!skip) { - if (lastDist2Origin && dist2Origin < lastDist2Origin) { - lastDist2Origin = null; - skip = true; - continue; - } - } - lastDist2Origin = dist2Origin; - } - skip = false; + // if (antiBacklash) { + // var dist2Origin = p1.distToLine(lines.oline[0], lines.oline[1]); + // if (!skip) { + // if (lastDist2Origin && dist2Origin < lastDist2Origin) { + // lastDist2Origin = null; + // skip = true; + // continue; + // } + // } + // lastDist2Origin = dist2Origin; + // } + // skip = false; // mark as used (temporary) p1.del = true; p2.del = true; len = p1.distTo2D(p2); + marked += 2; + + // scan up to next index on next pass + lastIndex = p1.index; + nextIndex = p1.index + 1; // if dist to new segment is less than thinWall // and segment length is less than thinWall then @@ -654,6 +675,7 @@ var gs_kiri_print = exports; } // clear delete marks so we can re-print later if (lines) lines.forEach(function(p) { p.del = false }); +console.log({ftime: new Date().getTime() - time, scans:scans, sorts:sorts}); } /**