From d8219a81efe8e85558276799f7822f86558e7721 Mon Sep 17 00:00:00 2001 From: danzel Date: Wed, 18 Jul 2012 11:37:33 +1200 Subject: [PATCH] Refactor QuickHull to use L.LatLng internally to save copying everything back and forth --- src/MarkerCluster.QuickHull.js | 61 ++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/MarkerCluster.QuickHull.js b/src/MarkerCluster.QuickHull.js index db2f3a771..8f033bce3 100644 --- a/src/MarkerCluster.QuickHull.js +++ b/src/MarkerCluster.QuickHull.js @@ -27,19 +27,21 @@ Retrieved from: http://en.literateprograms.org/Quickhull_(Javascript)?oldid=1843 (function () { L.QuickHull = { getDistant: function (cpt, bl) { - var vY = bl[1][0] - bl[0][0]; - var vX = bl[0][1] - bl[1][1]; - return (vX * (cpt[0] - bl[0][0]) + vY * (cpt[1] - bl[0][1])); + var vY = bl[1].lat - bl[0].lat, + vX = bl[0].lng - bl[1].lng; + return (vX * (cpt.lat - bl[0].lat) + vY * (cpt.lng - bl[0].lng)); }, - findMostDistantPointFromBaseLine: function (baseLine, points) { - var maxD = 0; - var maxPt = new Array(); - var newPoints = new Array(); - for (var idx in points) { - var pt = points[idx]; - var d = this.getDistant(pt, baseLine); + findMostDistantPointFromBaseLine: function (baseLine, latLngs) { + var maxD = 0, + maxPt = null, + newPoints = [], + i, pt, d; + + for (i = latLngs.length - 1; i >= 0; i--) { + pt = latLngs[i]; + d = this.getDistant(pt, baseLine); if (d > 0) { newPoints.push(pt); @@ -56,10 +58,11 @@ Retrieved from: http://en.literateprograms.org/Quickhull_(Javascript)?oldid=1843 return { 'maxPoint': maxPt, 'newPoints': newPoints }; }, - buildConvexHull: function (baseLine, points) { - var convexHullBaseLines = new Array(); - var t = this.findMostDistantPointFromBaseLine(baseLine, points); - if (t.maxPoint.length) { // if there is still a point "outside" the base line + buildConvexHull: function (baseLine, latLngs) { + var convexHullBaseLines = [], + t = this.findMostDistantPointFromBaseLine(baseLine, latLngs); + + if (t.maxPoint) { // if there is still a point "outside" the base line convexHullBaseLines = convexHullBaseLines.concat( this.buildConvexHull([baseLine[0], t.maxPoint], t.newPoints) @@ -74,24 +77,25 @@ Retrieved from: http://en.literateprograms.org/Quickhull_(Javascript)?oldid=1843 } }, - getConvexHull: function (points) { + getConvexHull: function (latLngs) { //find first baseline - var maxX = false, minX = false; - var maxPt = null, minPt = null; + var maxLat = false, minLat = false, + maxPt = null, minPt = null, + i; - for (var idx in points) { - var pt = points[idx]; - if (maxX === false || pt[0] > maxX) { + for (i = latLngs.length - 1; i >= 0; i--) { + var pt = latLngs[i]; + if (maxLat === false || pt.lat > maxLat) { maxPt = pt; - maxX = pt[0]; + maxLat = pt.lat; } - if (minX === false || pt[0] < minX) { + if (minLat === false || pt.lat < minLat) { minPt = pt; - minX = pt[0]; + minLat = pt.lat; } } - var ch = [].concat(this.buildConvexHull([minPt, maxPt], points), - this.buildConvexHull([maxPt, minPt], points)); + var ch = [].concat(this.buildConvexHull([minPt, maxPt], latLngs), + this.buildConvexHull([maxPt, minPt], latLngs)); return ch; } }; @@ -106,14 +110,13 @@ L.MarkerCluster.include({ for (i = childMarkers.length - 1; i >= 0; i--) { p = childMarkers[i].getLatLng(); - points.push([p.lat, p.lng]); + points.push(p); } hull = L.QuickHull.getConvexHull(points); - for (i = 0; i < hull.length; i++) { - p = hull[i]; - hullLatLng.push(new L.LatLng(p[0][0], p[0][1])); + for (i = hull.length - 1; i >= 0; i--) { + hullLatLng.push(hull[i][0]); } return hullLatLng;