extend approach. need to switch to segment comparison w/ angles
This commit is contained in:
parent
f8180fe79a
commit
78d4d606a4
2 changed files with 83 additions and 26 deletions
|
|
@ -2326,7 +2326,7 @@ export class Polygon {
|
||||||
|
|
||||||
// split long straight lines into segments no longer than max
|
// split long straight lines into segments no longer than max
|
||||||
// and return a new polygon
|
// and return a new polygon
|
||||||
segment(max = 1, mark) {
|
segment(max = 1, mark, wrap) {
|
||||||
const newp = [];
|
const newp = [];
|
||||||
const points = this.points;
|
const points = this.points;
|
||||||
const length = points.length;
|
const length = points.length;
|
||||||
|
|
@ -2358,6 +2358,9 @@ export class Polygon {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newp.length > length) {
|
if (newp.length > length) {
|
||||||
|
if (wrap) {
|
||||||
|
newp.push(newp[0]);
|
||||||
|
}
|
||||||
return newPolygon().addPoints(newp.map(p => p.clone(['segment']))).setOpenValue(this.open);
|
return newPolygon().addPoints(newp.map(p => p.clone(['segment']))).setOpenValue(this.open);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,9 @@ export function slicePost(data, options) {
|
||||||
|
|
||||||
function offset_default(params) {
|
function offset_default(params) {
|
||||||
let { z, top, count, top_poly, offset1, offsetN, wasm, last, gaps } = params;
|
let { z, top, count, top_poly, offset1, offsetN, wasm, last, gaps } = params;
|
||||||
|
|
||||||
|
let first;
|
||||||
|
|
||||||
// standard wall offsetting strategy
|
// standard wall offsetting strategy
|
||||||
POLY.offset(
|
POLY.offset(
|
||||||
top_poly,
|
top_poly,
|
||||||
|
|
@ -81,6 +84,7 @@ function offset_default(params) {
|
||||||
outs: top.shells,
|
outs: top.shells,
|
||||||
flat: true,
|
flat: true,
|
||||||
call: (polys, onCount) => {
|
call: (polys, onCount) => {
|
||||||
|
first = first || polys;
|
||||||
last = polys;
|
last = polys;
|
||||||
// mark each poly with depth (offset #) starting at 0
|
// mark each poly with depth (offset #) starting at 0
|
||||||
for (let p of polys) {
|
for (let p of polys) {
|
||||||
|
|
@ -99,37 +103,87 @@ function offset_default(params) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
// look for close points on segmented polys
|
|
||||||
|
// look for close points on adjacent segmented polys and merge
|
||||||
|
let test_polys = first !== last ? [ ...first, ...last ] : last;
|
||||||
|
let thin_test = POLY.flatten(test_polys).map(poly => {
|
||||||
|
return {
|
||||||
|
poly,
|
||||||
|
points: poly.segment(offset1, true).points
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (false)
|
if (false)
|
||||||
for (let poly of POLY.flatten(last)) {
|
for (let pi=0, pil=thin_test.length; pi<pil; pi++) {
|
||||||
let ps = poly.segment(offset1, true);
|
for (let pj=pi; pj<pil; pj++) {
|
||||||
let pp = ps.points;
|
let prec0 = thin_test[pi];
|
||||||
let moved = false;
|
let prec1 = thin_test[pj];
|
||||||
pp.push(pp[0]);
|
let pp0 = prec0.points;
|
||||||
for (let i=0; i<pp.length; i++) {
|
let pp1 = prec1.points;
|
||||||
let p0 = pp[i];
|
let moved = false;
|
||||||
if (p0.moved) continue;
|
for (let i=0; i<pp0.length; i++) {
|
||||||
for (let j=i+1; j<pp.length; j++) {
|
let p0 = pp0[i];
|
||||||
let p1 = pp[j];
|
if (p0.moved) continue;
|
||||||
if (p1.moved) continue;
|
for (let j=0; j<pp1.length; j++) {
|
||||||
if (p0.segment === p1.segment) {
|
let p1 = pp1[j];
|
||||||
continue;
|
if (p1.moved) continue;
|
||||||
}
|
if (p0 === p1 || p0.segment === p1.segment) {
|
||||||
if (p0.distTo2D(p1) < offset1) {
|
continue;
|
||||||
// merge points marking point offset and skip
|
}
|
||||||
let mid = p0.midPointTo(p1);
|
let dist = p0.distTo2D(p1);
|
||||||
let inc = p0.distTo2D(mid);
|
if (dist < offset1) {
|
||||||
moved = p0.moved = p1.moved = inc;
|
// merge points marking point offset and skip
|
||||||
p1.skip = true;
|
let mid = p0.midPointTo(p1);
|
||||||
p0.x = p1.x = mid.x;
|
let inc = p0.distTo2D(mid);
|
||||||
p0.y = p1.y = mid.y;
|
moved = p0.moved = p1.moved = inc;
|
||||||
|
p1.skip = true;
|
||||||
|
p0.x = p1.x = mid.x;
|
||||||
|
p0.y = p1.y = mid.y;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if (moved) {
|
||||||
if (moved) {
|
prec0.moved = prec1.moved = true;
|
||||||
poly.points = pp;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (let rec of thin_test) {
|
||||||
|
if (rec.moved) {
|
||||||
|
rec.poly.points = rec.points;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for (let poly of poly.segment(offset1, true)) {
|
||||||
|
// let ps = poly.segment(offset1, true);
|
||||||
|
// let pp = ps.points;
|
||||||
|
// let moved = false;
|
||||||
|
// pp.push(pp[0]);
|
||||||
|
// for (let i=0; i<pp.length; i++) {
|
||||||
|
// let p0 = pp[i];
|
||||||
|
// if (p0.moved) continue;
|
||||||
|
// for (let j=i+1; j<pp.length; j++) {
|
||||||
|
// let p1 = pp[j];
|
||||||
|
// if (p1.moved) continue;
|
||||||
|
// if (p0.segment === p1.segment) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// if (p0.distTo2D(p1) < offset1) {
|
||||||
|
// // merge points marking point offset and skip
|
||||||
|
// let mid = p0.midPointTo(p1);
|
||||||
|
// let inc = p0.distTo2D(mid);
|
||||||
|
// moved = p0.moved = p1.moved = inc;
|
||||||
|
// p1.skip = true;
|
||||||
|
// p0.x = p1.x = mid.x;
|
||||||
|
// p0.y = p1.y = mid.y;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (moved) {
|
||||||
|
// poly.points = pp;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
return { last, gaps };
|
return { last, gaps };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue