From f2865e6dbf7f3553fcb3526ed2789e74511485a6 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 11 Nov 2013 17:21:48 +0100 Subject: [PATCH] Add coordinate in LinearRing functions --- src/ol/geom/geometry.js | 88 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/src/ol/geom/geometry.js b/src/ol/geom/geometry.js index d5943dd3f0..4c21a53864 100644 --- a/src/ol/geom/geometry.js +++ b/src/ol/geom/geometry.js @@ -312,6 +312,94 @@ ol.geom.deflateCoordinatesss = }; +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {number} end End. + * @param {number} stride Stride. + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ +ol.geom.flatLinearRingContainsXY = + function(flatCoordinates, offset, end, stride, x, y) { + // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html + var contains = false; + var xi = flatCoordinates[offset]; + var yi = flatCoordinates[offset + 1]; + for (offset += stride; offset < end; offset += stride) { + var xj = flatCoordinates[offset]; + var yj = flatCoordinates[offset + 1]; + var intersect = ((yi > y) != (yj > y)) && + (x < (xj - xi) * (y - yi) / (yj - yi) + xi); + if (intersect) { + contains = !contains; + } + xi = xj; + yi = yj; + } + return contains; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.} ends Ends. + * @param {number} stride Stride. + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ +ol.geom.flatLinearRingsContainsXY = + function(flatCoordinates, offset, ends, stride, x, y) { + goog.asserts.assert(ends.length > 0); + if (ends.length === 0) { + return false; + } + if (!ol.geom.flatLinearRingContainsXY( + flatCoordinates, offset, ends[0], stride, x, y)) { + return false; + } + var i, ii; + for (i = 1, ii = ends.length; i < ii; ++i) { + if (ol.geom.flatLinearRingContainsXY( + flatCoordinates, ends[i - 1], ends[i], stride, x, y)) { + return false; + } + } + return true; +}; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {number} offset Offset. + * @param {Array.>} endss Endss. + * @param {number} stride Stride. + * @param {number} x X. + * @param {number} y Y. + * @return {boolean} Contains (x, y). + */ +ol.geom.flatLinearRingssContainsXY = + function(flatCoordinates, offset, endss, stride, x, y) { + goog.asserts.assert(endss.length > 0); + if (endss.length === 0) { + return false; + } + var i, ii; + for (i = 0, ii = endss.length; i < ii; ++i) { + var ends = endss[i]; + if (ol.geom.flatLinearRingsContainsXY( + flatCoordinates, offset, ends, stride, x, y)) { + return true; + } + offset = ends[ends.length - 1]; + } + return false; +}; + + /** * @param {Array.} flatCoordinates Flat coordinates. * @param {number} offset Offset.