From 6c66cdae475c3a6bfe980ffd4f7211381cd08639 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Sun, 11 Feb 2018 22:59:15 -0500 Subject: [PATCH] checkpoint fill refactoring --- js/geo-point.js | 29 +++++++- js/geo-polygons.js | 22 ++---- js/kiri-print.js | 166 ++++++++++++++++++++------------------------- js/kiri-slice.js | 4 ++ 4 files changed, 111 insertions(+), 110 deletions(-) diff --git a/js/geo-point.js b/js/geo-point.js index c561beea..678a8d27 100644 --- a/js/geo-point.js +++ b/js/geo-point.js @@ -138,7 +138,8 @@ var gs_base_point = exports; * @returns {number} */ PRO.distToLine = function(p1, p2) { - return Math.sqrt(this.distToLineSq(p1, p2)); + return p2l(this, p1, p2); + // return Math.sqrt(this.distToLineSq(p1, p2)); }; /** @@ -161,6 +162,32 @@ var gs_base_point = exports; return UTIL.distSqv2(p.x, p.y, p1.x + t * (p2.x - p1.x), p1.y + t * (p2.y - p1.y)); }; + // ---( begin fix distToLine )--- + + function dot(u, v) { + return u.x * v.x + u.y * v.y; + } + + function norm(v) { + return Math.sqrt(dot(v,v)); + } + + function d(u, v) { + return norm({x: u.x - v.x, y: u.y - v.y}); + } + + function p2l(p, l1, l2) { + var v = {x: l2.x - l1.x, y: l2.y - l1.y}; + var w = {x: p.x - l1.x, y: p.y - l1.y}; + var c1 = dot(w, v); + var c2 = dot(v, v); + var b = c1 / c2; + var pb = {x: l1.x + b * v.x, y: l1.y + b * v.y}; + return d(p, pb); + } + + // ---( end fix distToLine )--- + /** * * @param {Point} p1 diff --git a/js/geo-polygons.js b/js/geo-polygons.js index 30533eda..ffaadc42 100644 --- a/js/geo-polygons.js +++ b/js/geo-polygons.js @@ -592,8 +592,8 @@ var gs_base_polygons = exports; // X,Y ray slope derived from angle raySlope = BASE.newSlope(0,0, - UTIL.round(Math.cos(angle * DEG2RAD) * spacing, 7), - UTIL.round(Math.sin(angle * DEG2RAD) * spacing, 7) + Math.cos(angle * DEG2RAD) * spacing, + Math.sin(angle * DEG2RAD) * spacing ); // compute union of top boundaries @@ -621,15 +621,11 @@ 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), p2 = newPoint(start.x + raySlope.dx * 1000, start.y + raySlope.dy * 1000, zpos, NOKEY); - // 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; @@ -649,12 +645,8 @@ var gs_base_polygons = exports; } 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); + var od = rayint.origin.distToLine(p1,p2) / spacing; lines.push([p1, p2, od]); - // poly.m_polygon.forEach(function(point) { - // rayint.push(newPoint(null,null,zpos,null,point)); - // }); }); } @@ -662,13 +654,13 @@ var gs_base_polygons = exports; return a[2] - b[2]; }) - lines.forEach(function(line, index) { - line[0].index = line[2]; - line[1].index = line[2]; + lines.forEach(function(line) { + var dist = Math.round(line[2]); + line[0].index = dist; + line[1].index = dist; rayint.push(line[0]); rayint.push(line[1]); }) - return rayint; } diff --git a/js/kiri-print.js b/js/kiri-print.js index 2756134b..f8a78e05 100644 --- a/js/kiri-print.js +++ b/js/kiri-print.js @@ -567,115 +567,93 @@ 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, + var p, p1, p2, dist, len, found, group, mindist, t1, t2, marked = 0, - lastIndex = null, - nextIndex = lines.mindex; -var time = new Date().getTime(); -var scans = 0, sorts = 0; - while (lines) { - list = []; + start = 0, + lastIndex = -1; + + while (lines && marked < lines.length) { + found = false; + group = null; mindist = Infinity; - origin = skip || (antiBacklash && pass === 0) ? lines.origin : startPoint; + // 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:origin.distTo2D(point)}); -scans++; + for (i=start; i lastIndex) { + group = p.index; + } + if (group !== null) { + if (p.index !== group) break; + if (p.index % 2 === 0) { + t1 = lines[i]; + t2 = lines[i+1]; + } else { + t2 = lines[i]; + t1 = lines[i+1]; + } + dist = Math.min(t1.distTo2D(startPoint), t2.distTo2D(startPoint)); + if (dist < mindist) { + p1 = t1; + p2 = t2; + mindist = dist; + } + start = i; + found = true; + } } - // restart near origin if some still unmarked - if (list.length === 0 && marked < lines.length) { - lastIndex = null; - nextIndex = lines.mindex; + + // go back to start and try again + if (!found) { + start = 0; + lastIndex = -1; 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]; - // order segment by closest to farthest point - if (find.i % 2 === 0) { - p1 = find.p; - p2 = lines[find.i + 1]; - } else { - p1 = find.p; - p2 = lines[find.i - 1]; - } + // set next starting point + lastIndex = p1.index; - dist = startPoint.distTo2D(p1); + // mark as used (temporary) + p1.del = true; + p2.del = true; + marked += 2; - // 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; + dist = startPoint.distTo2D(p1); + len = p1.distTo2D(p2); - // 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 - // just extrude to midpoint of next segment. this is - // to avoid shaking the printer to death. - if (find.d <= thinWall && len <= thinWall) { - p2 = p1.midPointTo(p2); - addOutput(preout, p2, fillMult * (find.d / thinWall), fillSpeed); - lastout = 1; - } else { - // retract if dist trigger or crosses a slice top polygon - if (dist > retractDist && intersectsTop(startPoint, p1)) { - retract(); - } - - // anti-backlash take out slack by moving toward origin - if (antiBacklash && dist > retractDist) { - addOutput(preout, p1.add({x:2,y:-2,z:0}), 0, moveSpeed); - } - - // bridge ends of fill when they're close together - if (dist < thinWall) { - addOutput(preout, p1, fillMult, fillSpeed); - } else { - addOutput(preout, p1, 0, moveSpeed); - } - - addOutput(preout, p2, fillMult, fillSpeed); - lastout = 2; - } - - startPoint = p2; + // if dist to new segment is less than thinWall + // and segment length is less than thinWall then + // just extrude to midpoint of next segment. this is + // to avoid shaking the printer to death. + if (dist <= thinWall && len <= thinWall) { + p2 = p1.midPointTo(p2); + addOutput(preout, p2, fillMult * (dist / thinWall), fillSpeed); } else { - break; + // retract if dist trigger or crosses a slice top polygon + if (dist > retractDist && intersectsTop(startPoint, p1)) { + retract(); + } + + // anti-backlash on longer move + if (antiBacklash && dist > retractDist) { + addOutput(preout, p1.add({x:2,y:-2,z:0}), 0, moveSpeed); + } + + // bridge ends of fill when they're close together + if (dist < thinWall) { + addOutput(preout, p1, fillMult, fillSpeed); + } else { + addOutput(preout, p1, 0, moveSpeed); + } + + addOutput(preout, p2, fillMult, fillSpeed); } - pass++; + + startPoint = p2; } // 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}); } /** diff --git a/js/kiri-slice.js b/js/kiri-slice.js index 426d51c7..0c0e3a8f 100644 --- a/js/kiri-slice.js +++ b/js/kiri-slice.js @@ -366,6 +366,10 @@ var gs_kiri_slice = exports; valid.push(r1[i]); valid.push(r1[i+1]); } + // add index to point for fill order storeSettingsToServer + for (var k=0; k 2 ? valid : []; }