From b3be95bc1501842e9aa17c89ec5496476cb0fa5b Mon Sep 17 00:00:00 2001 From: Curran Kelleher Date: Thu, 4 Jun 2020 17:40:06 -0400 Subject: [PATCH] Return Best Distance (#61) * Return best distance. Closes #2 * Move where -0 distance is precluded, based on feedback from @fil. --- polylabel.js | 12 +++++++++--- test/test.js | 20 +++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/polylabel.js b/polylabel.js index bca664d..0c3229b 100644 --- a/polylabel.js +++ b/polylabel.js @@ -25,7 +25,11 @@ function polylabel(polygon, precision, debug) { var cellSize = Math.min(width, height); var h = cellSize / 2; - if (cellSize === 0) return [minX, minY]; + if (cellSize === 0) { + var degeneratePoleOfInaccessibility = [minX, minY]; + degeneratePoleOfInaccessibility.distance = 0; + return degeneratePoleOfInaccessibility; + } // a priority queue of cells in order of their "potential" (max distance to polygon) var cellQueue = new Queue(undefined, compareMax); @@ -73,7 +77,9 @@ function polylabel(polygon, precision, debug) { console.log('best distance: ' + bestCell.d); } - return [bestCell.x, bestCell.y]; + var poleOfInaccessibility = [bestCell.x, bestCell.y]; + poleOfInaccessibility.distance = bestCell.d; + return poleOfInaccessibility; } function compareMax(a, b) { @@ -107,7 +113,7 @@ function pointToPolygonDist(x, y, polygon) { } } - return (inside ? 1 : -1) * Math.sqrt(minDistSq); + return minDistSq === 0 ? 0 : (inside ? 1 : -1) * Math.sqrt(minDistSq); } // get polygon centroid diff --git a/test/test.js b/test/test.js index bc0419c..373e84b 100644 --- a/test/test.js +++ b/test/test.js @@ -8,28 +8,38 @@ var water2 = require('./fixtures/water2.json'); test('finds pole of inaccessibility for water1 and precision 1', function (t) { var p = polylabel(water1, 1); - t.same(p, [3865.85009765625, 2124.87841796875]); + t.same(p, Object.assign([3865.85009765625, 2124.87841796875], { + distance: 288.8493574779127 + })); t.end(); }); test('finds pole of inaccessibility for water1 and precision 50', function (t) { var p = polylabel(water1, 50); - t.same(p, [3854.296875, 2123.828125]); + t.same(p, Object.assign([3854.296875, 2123.828125], { + distance: 278.5795872381558 + })); t.end(); }); test('finds pole of inaccessibility for water2 and default precision 1', function (t) { var p = polylabel(water2); - t.same(p, [3263.5, 3263.5]); + t.same(p, Object.assign([3263.5, 3263.5], { + distance: 960.5 + })); t.end(); }); test('works on degenerate polygons', function (t) { var p = polylabel([[[0, 0], [1, 0], [2, 0], [0, 0]]]); - t.same(p, [0, 0]); + t.same(p, Object.assign([0, 0], { + distance: 0 + })); p = polylabel([[[0, 0], [1, 0], [1, 1], [1, 0], [0, 0]]]); - t.same(p, [0, 0]); + t.same(p, Object.assign([0, 0], { + distance: 0 + })); t.end(); });