From 8fce4f38a44b61586f70bf8ae829108e15a888fa Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Thu, 8 Aug 2024 17:44:47 -0400 Subject: [PATCH] change layer poly fingerprinting to handle more complex repeating patterns --- src/geo/polygons.js | 58 ++++++++++++++++++++++++++++++++------------- src/kiri/main.js | 10 +++++++- web/kiri/index.css | 8 +++++-- web/kiri/index.html | 2 +- 4 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/geo/polygons.js b/src/geo/polygons.js index 469b8e45..2b61d41d 100644 --- a/src/geo/polygons.js +++ b/src/geo/polygons.js @@ -323,12 +323,11 @@ function setContains(setA, poly) { return false; } -function flatten(polys, to, crush) { - to = to || []; - polys.forEach(function(poly) { +function flatten(polys, to = [], crush) { + for (let poly of polys) { poly.flattenTo(to); if (crush) poly.inner = null; - }); + } return to; } @@ -990,18 +989,36 @@ function rayIntersect(start, slope, polygons, for_fill) { return points; } +function pd(a,b) { + return a > b ? Math.abs(1-b/a) : Math.abs(1-a/b); +} + function fingerprint(polys) { - let finger = []; - flatten(polys).sort((a,b) => { - return a.area() > b.area(); - }).forEach(p => { - finger.push({ - c: p.circularityDeep(), - p: p.perimeterDeep(), + let recs = flatten(polys).map(p => { + return { + l: p.length, + a: p.area(), + p: p.perimeter(), + c: p.circularity(), b: p.bounds - }); + } }); - return finger; + recs.sort((a,b) => { + if (pd(a.a, b.a) > 0.005) { + return b.a - a.a; + } + if (pd(a.p, b.p) > 0.005) { + return b.p - a.p; + } + if (pd(a.c, b.c) > 0.02) { + return b.c - a.c; + } + if (Math.abs(a.b.minx - b.b.minx) > 0.1) { + return b.b.minx - a.b.minx; + } + return b.b.miny - a.b.miny; + }) + return recs; } // compare fingerprint arrays @@ -1021,16 +1038,25 @@ function fingerprintCompare(a, b) { for (let i=0; i 1) { + console.log('area', Math.abs(ra.a - rb.a)); + return false; + } // test circularity - if (Math.abs(ra.c - rb.c) > 0.001) { + if (pd(ra.c, rb.c) > 0.02) { return false; } // test perimeter - if (Math.abs(ra.p - rb.p) > 0.01) { + if (pd(ra.p, rb.p) > 0.005) { return false; } // test bounds - if (ra.b.delta(rb.b) > 0.01) { + if (ra.b.delta(rb.b) > 0.1) { + return false; + } + // test poly point count + if (a.length < 20 && pd(ra.l, rb.l) > 0.05) { return false; } } diff --git a/src/kiri/main.js b/src/kiri/main.js index 4ad006c3..09acbcfe 100644 --- a/src/kiri/main.js +++ b/src/kiri/main.js @@ -316,7 +316,15 @@ gapp.register("kiri.main", [], (root, exports) => { function setProgress(value = 0, msg) { value = (value * 100).round(4); UI.progress.width = value+'%'; - if (msg) UI.prostatus.innerHTML = msg; + if (self.debug) { + // console.log(msg, value.round(2)); + UI.prostatus.style.display = 'flex'; + if (msg) { + UI.prostatus.innerHTML = msg; + } else { + UI.prostatus.innerHTML = ''; + } + } } function bound(v,min,max) { diff --git a/web/kiri/index.css b/web/kiri/index.css index 0ad3a793..14a85746 100644 --- a/web/kiri/index.css +++ b/web/kiri/index.css @@ -1427,13 +1427,17 @@ th, tr, td, label { } #progtxt { display: none; - color: white; + position: absolute; + left: 0; + right: 0; + top: 200%; + color: #888; margin: 0 5px 0 5px; padding: 0 5px 2px 5px; white-space: nowrap; flex-direction: row; align-items: center; - vertical-align: middle; + justify-content: center; } #modal { diff --git a/web/kiri/index.html b/web/kiri/index.html index 32bb0627..0c566351 100644 --- a/web/kiri/index.html +++ b/web/kiri/index.html @@ -225,7 +225,7 @@ -
loading
+
loading