add thin type 3 test

This commit is contained in:
Stewart Allen 2025-02-23 14:50:24 -05:00
commit 91ad27f540
5 changed files with 69 additions and 3 deletions

View file

@ -253,6 +253,40 @@ class Polygon {
return ret; return ret;
} }
setInner(inner) {
this.inner = inner;
return this;
}
// generate a trace path around the inside of a polygon
// including inner polys. return the noodle and the remainder
// of the polygon with the noodle removed (for the next pass)
noodle(width) {
// inset outer polygon
let inner = this.inner;
let inset = this.clone().offset(width);
let noodle = [ this.clone().setInner(inset) ];
let noodin = [];
// subtract inners from the inset
if (inner) {
noodle = POLY.subtract(noodle, inner, []);
// for each inner, offset and subtract noodle + itself
let nood = [];
for (let innie of inner) {
let inexp = innie.clone().offset(-width);
let intrm = POLY.trimTo(inexp, [ this ]);
let inood = POLY.subtract(intrm, [ ...noodle, innie ], []);
nood.push(...inood);
}
noodin = POLY.union(nood, 0, true);
}
// unify inner noodles and outer noodle
noodle = POLY.union([ ...noodle, ...noodin ], 0, true);
// subtract noodle from poly for next noodle calc
let remain = POLY.subtract([ this ], noodle, []);
return { noodle, remain };
}
// generate center crossing point cloud // generate center crossing point cloud
centers(step, z, min, max, opt = {}) { centers(step, z, min, max, opt = {}) {
let cloud = [], let cloud = [],

View file

@ -348,7 +348,7 @@ function subtract(setA, setB, outA, outB, z, minArea, opt = {}) {
let min = numOrDefault(minArea, 0.1), let min = numOrDefault(minArea, 0.1),
out = []; out = [];
function filter(from, to = []) { function filter(from, to = []) {
from.forEach(function(poly) { from.forEach(function(poly) {
if (poly.area() >= min) { if (poly.area() >= min) {
to.push(poly); to.push(poly);
@ -541,7 +541,7 @@ function diff(setA, setB, z) {
/** /**
* Slice.doProjectedFills() * Slice.doProjectedFills()
* *
* @param {Polygon[]} setA source set * @param {Polygon[]} setA target set
* @param {Polygon[]} setB mask set * @param {Polygon[]} setB mask set
* @returns {Polygon[]} * @returns {Polygon[]}
*/ */

View file

@ -167,6 +167,28 @@ function thin_type_2(params) {
return { last, gaps }; return { last, gaps };
} }
function thin_type_3(params) {
let { z, top, count, offsetN, last, gaps } = params;
top.thin_fill = [];
top.fill_sparse = [];
let { noodle, remain } = top.poly.noodle(offsetN);
top.shells = noodle;
top.gaps = remain;
// top.fill_off = noodle;
// if (remain.length) {
// top.gaps = [];
// for (let poly of remain) {
// let { noodle } = poly.noodle(offsetN);
// console.log({ next_noodle: noodle });
// top.gaps.push(...noodle);
// }
// }
return { last, gaps };
}
/** /**
* may run in minion or worker context. performs shell offsetting * may run in minion or worker context. performs shell offsetting
* including thin wall detection when enabled * including thin wall detection when enabled
@ -214,6 +236,10 @@ FDM.doTopShells = function(z, top, count, offset1, offsetN, fillOffset, opt = {}
case "type 2": case "type 2":
ret = thin_type_2({ z, top, count, top_poly, offset1, offsetN, fillOffset, gaps, wasm }); ret = thin_type_2({ z, top, count, top_poly, offset1, offsetN, fillOffset, gaps, wasm });
break; break;
case "type 3":
ret = thin_type_3({ z, top, count, top_poly, offsetN });
fillOffset = 0;
break;
default: default:
ret = offset_default({ z, top, count, top_poly, offset1, offsetN, wasm }); ret = offset_default({ z, top, count, top_poly, offset1, offsetN, wasm });
break; break;

View file

@ -114,7 +114,8 @@ const LISTS = {
thin: [ thin: [
{ name: "off" }, { name: "off" },
{ name: "type 1" }, { name: "type 1" },
{ name: "type 2" } { name: "type 2" },
{ name: "type 3" }
] ]
}; };

View file

@ -1863,6 +1863,11 @@ gapp.register("kiri.init", (root, exports) => {
const current = settings(); const current = settings();
const control = current.controller; const control = current.controller;
if (!control.devel) {
// TODO: hide thin type 3 during development
kiri.consts.LISTS.thin.length = 3;
}
platform.deselect(); platform.deselect();
catalog.addFileListener(updateCatalog); catalog.addFileListener(updateCatalog);
space.view.setZoom(control.reverseZoom, control.zoomSpeed); space.view.setZoom(control.reverseZoom, control.zoomSpeed);