From 8141a3aa12a05394481f0d1a717b71c26f225784 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Tue, 22 Jun 2021 11:23:45 -0400 Subject: [PATCH] slightly better poly equivalence check --- src/geo/polygon.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/geo/polygon.js b/src/geo/polygon.js index f5c22757..79af23dd 100644 --- a/src/geo/polygon.js +++ b/src/geo/polygon.js @@ -1772,6 +1772,16 @@ return tl; }; + PRO.areaDiff = function(poly) { + let a1 = this.area(), + a2 = poly.area(); + return (a1 > a2) ? a2 / a1 : a1 / a2; + }; + + PRO.areaOrLength = function(poly) { + return this.length === poly.length || this.areaDiff(poly) > 0.98; + }; + /** * return logical OR of two polygons' enclosed areas * @@ -1812,16 +1822,16 @@ 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 + src[0].poly.areaOrLength(dst[0].poly) && + src[1].poly.areaOrLength(dst[1].poly) ) { return null; } else if (debug) { console.log("union debug", { src, dst, - d0: Math.abs(src[0].poly.area() - dst[0].poly.area()), - d1: Math.abs(src[1].poly.area() - dst[1].poly.area()), + d0: src[0].poly.areaDiff(dst[0].poly), + d1: src[1].poly.areaDiff(dst[1].poly), m0: src[0].isEqual2D(dst[0]), m1: src[1].isEqual2D(dst[1]) });