Skip to content

Commit

Permalink
Merge pull request #1052 from OpenGeoscience/speed-up-point-in-polygon
Browse files Browse the repository at this point in the history
Speed up the pointInPolygon function.
  • Loading branch information
manthey authored Jun 3, 2020
2 parents 6ac9829 + cd7dd47 commit 6d1f99b
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 4 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
- Added a track feature (#1040)
- Added a geo.gui.scaleWidget.formatUnit utility function (#1048)

### Improvements
- The pointInPolygon2D function is faster (#1052)

## Version 0.19.8

### Changes
Expand Down
10 changes: 6 additions & 4 deletions src/util/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ var util = {
return false;
}
}
return util.distanceToPolygon2d(point, inner ? {outer: outer, inner: inner} : outer) > 0;
return util.distanceToPolygon2d(point, inner ? {outer: outer, inner: inner} : outer, true) > 0;
},

/**
Expand Down Expand Up @@ -680,10 +680,12 @@ var util = {
*
* @param {geo.geoPosition} pt The point.
* @param {geo.polygonObject} poly The polygon.
* @param {boolean} [onlySign] If truthy, only the sign of the answer is
* significant.
* @returns {number} The signed distance.
* @memberof geo.util
*/
distanceToPolygon2d: function (pt, poly) {
distanceToPolygon2d: function (pt, poly, onlySign) {
let outer = poly.outer || poly;
let inside = false,
minDistSq, distSq, dist;
Expand All @@ -693,14 +695,14 @@ var util = {
if (((p0.y > pt.y) !== (p1.y > pt.y)) && (pt.x < (p1.x - p0.x) * (pt.y - p0.y) / (p1.y - p0.y) + p0.x)) {
inside = !inside;
}
distSq = util.distance2dToLineSquared(pt, p0, p1);
distSq = onlySign ? 1 : util.distance2dToLineSquared(pt, p0, p1);
if (minDistSq === undefined || distSq < minDistSq) {
minDistSq = distSq;
}
}
if (poly.inner) {
poly.inner.forEach(inner => {
let innerDist = util.distanceToPolygon2d(pt, inner);
let innerDist = util.distanceToPolygon2d(pt, inner, onlySign);
if (innerDist * innerDist < minDistSq) {
minDistSq = innerDist * innerDist;
}
Expand Down

0 comments on commit 6d1f99b

Please sign in to comment.