goog.provide('ol.geom.flat.contains'); goog.require('goog.asserts'); goog.require('ol.extent'); /** * @param {Array.} flatCoordinates Flat coordinates. * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. * @param {ol.Extent} extent Extent. * @return {boolean} Contains extent. */ ol.geom.flat.contains.linearRingContainsExtent = function(flatCoordinates, offset, end, stride, extent) { var outside = ol.extent.forEachCorner(extent, /** * @param {ol.Coordinate} coordinate Coordinate. * @return {boolean} Contains (x, y). */ function(coordinate) { return !ol.geom.flat.contains.linearRingContainsXY(flatCoordinates, offset, end, stride, coordinate[0], coordinate[1]); }); return !outside; }; /** * @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.flat.contains.linearRingContainsXY = function(flatCoordinates, offset, end, stride, x, y) { // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html var contains = false; var x1 = flatCoordinates[end - stride]; var y1 = flatCoordinates[end - stride + 1]; for (; offset < end; offset += stride) { var x2 = flatCoordinates[offset]; var y2 = flatCoordinates[offset + 1]; var intersect = ((y1 > y) != (y2 > y)) && (x < (x2 - x1) * (y - y1) / (y2 - y1) + x1); if (intersect) { contains = !contains; } x1 = x2; y1 = y2; } 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.flat.contains.linearRingsContainsXY = function(flatCoordinates, offset, ends, stride, x, y) { goog.asserts.assert(ends.length > 0, 'ends should not be an empty array'); if (ends.length === 0) { return false; } if (!ol.geom.flat.contains.linearRingContainsXY( flatCoordinates, offset, ends[0], stride, x, y)) { return false; } var i, ii; for (i = 1, ii = ends.length; i < ii; ++i) { if (ol.geom.flat.contains.linearRingContainsXY( 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.flat.contains.linearRingssContainsXY = function(flatCoordinates, offset, endss, stride, x, y) { goog.asserts.assert(endss.length > 0, 'endss should not be an empty array'); 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.flat.contains.linearRingsContainsXY( flatCoordinates, offset, ends, stride, x, y)) { return true; } offset = ends[ends.length - 1]; } return false; };