improve union speed with more efficient 2 in 2 out check

This commit is contained in:
Stewart Allen 2021-06-21 22:16:05 -04:00
commit 6f78d07d07
4 changed files with 46 additions and 10 deletions

View file

@ -499,6 +499,10 @@
return this === p || (this.x === p.x && this.y === p.y && this.z === p.z); return this === p || (this.x === p.x && this.y === p.y && this.z === p.z);
}; };
PRO.isEqual2D = function(p) {
return this === p || (this.x === p.x && this.y === p.y);
};
/** /**
* returns true if points are close enough to be considered equivalent * returns true if points are close enough to be considered equivalent
* *

View file

@ -1751,6 +1751,27 @@
return null; return null;
} }
function leftmost(p1, p2) {
if (!p1) {
return p2;
}
if (p1.x <= p2.x) {
if (p1.x < p2.x || (p1.x === p2.x && p1.y < p2.y)) {
return p2;
}
}
return p1;
}
// return top-most, left-post point
PRO.leftmost = function() {
let tl = undefined;
for (let p of this.points) {
tl = leftmost(tl, p);
}
return tl;
};
/** /**
* return logical OR of two polygons' enclosed areas * return logical OR of two polygons' enclosed areas
* *
@ -1778,16 +1799,27 @@
let union = POLY().fromClipperTreeUnion(ctre, poly.getZ(), minarea); let union = POLY().fromClipperTreeUnion(ctre, poly.getZ(), minarea);
if (all) { if (all) {
if (union.length === 2) { if (union.length === 2) {
// TODO look for faster equivalence check. area? perimeter? let src = [ this.leftmost(), poly.leftmost() ];
let src = [this, poly].sort((a,b) => { return a.area() - b.area() }); let dst = [ union[0].leftmost(), union[1].leftmost() ];
let dst = union.sort((a,b) => { return a.area() - b.area() });
if (src[0].isEquivalent(dst[0]) && src[1].isEquivalent(dst[1])) { if (leftmost(src[0], src[1]) === src[1]) {
return null; src.reverse();
} }
// only here is area sorting failed (same sizes) if (leftmost(dst[0], dst[1]) === dst[1]) {
if (src[0].isEquivalent(dst[1]) && src[1].isEquivalent(dst[0])) { dst.reverse();
return null;
} }
if (
src[0].isEqual2D(dst[0]) &&
src[1].isEqual2D(dst[1]) &&
Math.abs(src[0].poly.area() - dst[0].poly.area()) < 0.01 &&
Math.abs(src[1].poly.area() - dst[1].poly.area()) < 0.01
) {
return null;
} else if (debug) {
console.log("union debug", { src, dst });
}
return null;
} }
return union; return union;
} }

View file

@ -255,7 +255,7 @@
let params = slice.params = getRangeParameters(settings, slice.index); let params = slice.params = getRangeParameters(settings, slice.index);
let shellFrac = (params.sliceShells - (params.sliceShells | 0)); let shellFrac = (params.sliceShells - (params.sliceShells | 0));
let sliceShells = params.sliceShells | 0; let sliceShells = params.sliceShells | 0;
if (ctrl.danger && shellFrac) { if (shellFrac) {
let v1 = shellFrac > 0.5 ? 1 - shellFrac : shellFrac; let v1 = shellFrac > 0.5 ? 1 - shellFrac : shellFrac;
let v2 = 1 - v1; let v2 = 1 - v1;
let parts = Math.round(v2/v1) + 1; let parts = Math.round(v2/v1) + 1;
@ -264,11 +264,11 @@
sliceShells += rem >= trg ? 1 : 0; sliceShells += rem >= trg ? 1 : 0;
} }
let first = slice.index === 0; let first = slice.index === 0;
let spaceMult = first ? spro.firstLayerLineMult || 1 : 1;
let isBottom = slice.index < spro.sliceBottomLayers; let isBottom = slice.index < spro.sliceBottomLayers;
let isTop = slice.index > slices.length - spro.sliceTopLayers-1; let isTop = slice.index > slices.length - spro.sliceTopLayers-1;
let isDense = params.sliceFillSparse > 0.98; let isDense = params.sliceFillSparse > 0.98;
let solidWidth = params.sliceFillWidth || 1; let solidWidth = params.sliceFillWidth || 1;
let spaceMult = first ? spro.firstLayerLineMult || 1 : 1;
if ((isBottom || ((isTop || isDense) && !vaseMode)) && !isSynth) { if ((isBottom || ((isTop || isDense) && !vaseMode)) && !isSynth) {
slice.solid = { slice.solid = {
solidWidth, solidWidth,

View file

@ -243,7 +243,7 @@ kiri.lang['en-us'] = {
pt_heal_s: "heal mesh", pt_heal_s: "heal mesh",
pt_heal_l: ["attempt to heal","non-manifold meshes","adds to slicing time"], pt_heal_l: ["attempt to heal","non-manifold meshes","adds to slicing time"],
pt_thrd_s: "threaded", pt_thrd_s: "threaded",
pt_thrd_l: ["use parallel processin","when browser permits"], pt_thrd_l: ["use parallel processing","when browser permits"],
xp_menu: "exports", xp_menu: "exports",