From 177517778cb28973e89498912b1df85ae4fc4776 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 31 May 2021 22:44:13 -0400 Subject: [PATCH] stop gap until new function is ready --- src/geo/base.js | 20 +++++++++------ src/mode/fdm/export.js | 55 +++++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/src/geo/base.js b/src/geo/base.js index 0660808a..a4341352 100644 --- a/src/geo/base.js +++ b/src/geo/base.js @@ -323,15 +323,19 @@ let yDelta_b = C.y - B.y; let xDelta_b = C.x - B.x; let center = {z: A.z}; - if (!xDelta_a) xDelta_a = 0.00000000001; // cheat! - if (!xDelta_b) xDelta_b = 0.00000000001; // cheat! + let cheat = 0; + if (!xDelta_a) { xDelta_a = 0.00000000001; cheat++ } // cheat! + if (!xDelta_b) { xDelta_b = 0.00000000001; cheat++ } // cheat! + if (!yDelta_a) { yDelta_a = 0.00000000001; cheat++ } // cheat! + if (!yDelta_b) { yDelta_b = 0.00000000001; cheat++ } // cheat! let aSlope = yDelta_a / xDelta_a; let bSlope = yDelta_b / xDelta_b; - center.x = (aSlope*bSlope*(A.y - C.y) + bSlope*(A.x + B.x) - aSlope*(B.x+C.x) )/(2* (bSlope-aSlope) ); - center.y = -1*(center.x - (A.x+B.x)/2)/aSlope + (A.y+B.y)/2; - // if (isNaN(center.x)) { - // console.log({xDelta_a, xDelta_b, aSlope, bSlope}); - // } + center.x = (aSlope * bSlope * (A.y - C.y) + bSlope * (A.x + B.x) - aSlope*(B.x+C.x)) / (2 * (bSlope-aSlope)); + center.y = (-1 * (center.x - (A.x + B.x) / 2)) / aSlope + ((A.y+B.y) / 2); + if (cheat > 1 || [center.x,center.y].hasNaN()) { + // console.log({xDelta_a, xDelta_b, aSlope, bSlope, cheat}); + return undefined; + } return center; } @@ -341,7 +345,7 @@ */ function center2d(A,B,C,rad) { let center = circleCenter(A,B,C); - if (rad) { + if (center && rad) { let dx = center.x - A.x; let dy = center.y - A.y; center.r = Math.sqrt(dx*dx + dy*dy) diff --git a/src/mode/fdm/export.js b/src/mode/fdm/export.js index d46eb6c7..fcfdc818 100644 --- a/src/mode/fdm/export.js +++ b/src/mode/fdm/export.js @@ -525,35 +525,40 @@ let e2 = arcQ[el-2]; // second last in arcQ let e3 = arcQ[el-1]; // last in arcQ let cc = BASE.util.center2d(e1, e2, e3, 1); // find center - if ([cc.x,cc.y,cc.z,cc.r].hasNaN()) { - console.log({cc, e1, e2, e3}); - } let dc = 0; - if (arcQ.length === 3) { - arcQ.center = [ cc ]; - } else { - // check center point delta - let dx = cc.x - arcQ.center[0].x; - let dy = cc.y - arcQ.center[0].y; - dc = Math.sqrt(dx * dx + dy * dy); - } - // if new point is off the arc - if (deem || depm || desp || dc > arcDist || cc.r >= arcMax) { - // console.log({dc, depm, desp}); - if (arcQ.length === 4) { - // not enough points for an arc, drop first point and recalc center - emitQrec(arcQ.shift()); - arcQ.center = [ BASE.util.center2d(arcQ[0], arcQ[1], arcQ[2], 1) ]; + if (cc) { + if ([cc.x,cc.y,cc.z,cc.r].hasNaN()) { + console.log({cc, e1, e2, e3}); + } + if (arcQ.length === 3) { + arcQ.center = [ cc ]; } else { - // enough to consider an arc, emit and start new arc - let defer = arcQ.pop(); - drainQ(); - // re-add point that was off the last arc - arcQ.push(defer); + // check center point delta + let dx = cc.x - arcQ.center[0].x; + let dy = cc.y - arcQ.center[0].y; + dc = Math.sqrt(dx * dx + dy * dy); + } + // if new point is off the arc + if (deem || depm || desp || dc > arcDist || cc.r >= arcMax) { + // console.log({dc, depm, desp}); + if (arcQ.length === 4) { + // not enough points for an arc, drop first point and recalc center + emitQrec(arcQ.shift()); + arcQ.center = [ BASE.util.center2d(arcQ[0], arcQ[1], arcQ[2], 1) ]; + } else { + // enough to consider an arc, emit and start new arc + let defer = arcQ.pop(); + drainQ(); + // re-add point that was off the last arc + arcQ.push(defer); + } + } else { + // new point is on the arc + arcQ.center.push(cc); } } else { - // new point is on the arc - arcQ.center.push(cc); + // drainQ on invalid center + drainQ(); } } } else {