Add ol.geom.flat.linearRingsGetInteriorPoint

This commit is contained in:
Tom Payne
2013-12-01 17:46:03 +01:00
parent 6dab67df75
commit e7bf44688d

View File

@@ -326,6 +326,68 @@ ol.geom.flat.linearRingsContainsXY =
};
/**
* Calculates a point that is guaranteed to lie in the interior of the linear
* rings.
* Inspired by JTS's com.vividsolutions.jts.geom.Geometry#getInteriorPoint.
* @param {Array.<number>} flatCoordinates Flat coordinates.
* @param {number} offset Offset.
* @param {Array.<number>} ends Ends.
* @param {number} stride Stride.
* @param {number} y Y.
* @param {Array.<number>=} opt_point Point.
* @return {Array.<number>} A point which is in the interior of the linear
* rings.
*/
ol.geom.flat.linearRingsGetInteriorPoint =
function(flatCoordinates, offset, ends, stride, y, opt_point) {
var i, ii, x, x1, x2, y1, y2;
var intersections = [];
// Calculate intersections with the horizontal line
var end = ends[0];
x1 = flatCoordinates[end - stride];
y1 = flatCoordinates[end - stride + 1];
for (i = offset; i < end; i += stride) {
x2 = flatCoordinates[i];
y2 = flatCoordinates[i + 1];
if ((y <= y1 && y2 <= y) || (y1 <= y && y <= y2)) {
x = (y - y1) / (y2 - y1) * (x2 - x1) + x1;
intersections.push(x);
}
x1 = x2;
y1 = y2;
}
// Find the longest segment of the horizontal line that has its center point
// inside the polygon
var point;
if (goog.isDef(opt_point)) {
point = opt_point;
point[0] = NaN;
point[1] = y;
} else {
point = [NaN, y];
}
var maxSegmentLength = -Infinity;
intersections.sort();
x1 = intersections[0];
for (i = 1, ii = intersections.length; i < ii; ++i) {
x2 = intersections[i];
var segmentLength = Math.abs(x2 - x1);
if (segmentLength > maxSegmentLength) {
x = (x1 + x2) / 2;
if (ol.geom.flat.linearRingsContainsXY(
flatCoordinates, offset, ends, stride, x, y)) {
point[0] = x;
maxSegmentLength = segmentLength;
}
}
x1 = x2;
}
goog.asserts.assert(!isNaN(point[0]));
return point;
};
/**
* @param {Array.<number>} flatCoordinates Flat coordinates.
* @param {number} offset Offset.