polygon-offset
Version:
Polygon offsetting algorithm, aimed for use with leaflet
63 lines (54 loc) • 1.55 kB
JavaScript
/**
* @param {*} arr
* @return {Boolean}
*/
var isArray = module.exports.isArray = Array.isArray || function (arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
};
/**
* @param {*} arr
* @return {Boolean}
*/
var isNonEmptyArray = module.exports.isNonEmptyArray = function (arr) {
return isArray(arr) && arr.length;
};
/**
* @param {Array.<Number>} p1
* @param {Array.<Number>} p2
* @return {Boolean}
*/
module.exports.equals = function equals(p1, p2) {
return p1[0] === p2[0] && p1[1] === p2[1];
};
/**
* @param {*} coordinates
* @param {Number=} depth
* @return {*}
*/
module.exports.orientRings = function orientRings(coordinates, depth, isHole) {
depth = depth || 0;
var i, len;
if (isNonEmptyArray(coordinates) && typeof coordinates[0][0] === 'number') {
var area = 0;
var ring = coordinates;
for (i = 0, len = ring.length; i < len; i++) {
var pt1 = ring[i];
var pt2 = ring[(i + 1) % len];
area += pt1[0] * pt2[1];
area -= pt2[0] * pt1[1];
}
if ((!isHole && area > 0) || (isHole && area < 0)) {
ring.reverse();
}
} else {
for (i = 0, len = coordinates.length; i < len; i++) {
orientRings(coordinates[i], depth + 1, i > 0);
}
}
if (depth === 0 && isNonEmptyArray(coordinates) && isNonEmptyArray(coordinates[0]) && typeof coordinates[0][0][0] === 'number') {
var clone = coordinates[0].slice(0, 1)[0];
coordinates[0].pop();
coordinates[0].push([clone[0], clone[1]]);
}
return coordinates;
};