"use strict";
/*global coordinateFactory*/
/**
* Creates a polygon, with the given array of coordinates in in format
* [lng, lat].
*
* @exports Polygon
*
* @params {Array} An array of coordinates in format [lng, lat].
* @returns {Polygon} A Polygon Object.
*
* @example
* //From https://developers.google.com/maps/documentation/javascript/examples/polygon-simple
* const myPolygon = polygonFactory([
* [-80.190, 25.774],
* [-66.118, 18.466],
* [-64.757, 32.321],
* [-80.190, 25.774]
* ]);
*
* let {
* lat,
* lng
* } = myPolygon.getPolygonCenter();
* consle.log(`Center is: ${lat}, ${lng}`);
*
* myPolygon.getCoordinates().forEach(elem => {
* console.log(`Coord is ${elem.lat}, ${elem.lng}`);
* });
*/
const polygonFactory = function(theCoordinates) {
/**
* Takes an array containing the coordinates in format [lng, lat] and
* transforms it into an array of Coordinates.
*
* @private
*
* @returns {Array} An array containing the coordinates of the polygon.
*
* @see {@link http://stackoverflow.com/a/16282685/1337392}
* @see {@link https://en.wikipedia.org/wiki/Centroid}
*/
const transformCoordinates = (coords) => {
return coords.reduce((prev, curr) => {
prev.push(coordinateFactory(curr[1], curr[0]));
return prev;
}, []);
};
const coordinates = transformCoordinates(theCoordinates);
/**
* Calculates the center of this polygon, defined by its array of
* coordinates.
*
* @private
*
* @returns {Coordinate} The coordinate representing this polygon's
* geometric center.
*
* @see {@link http://stackoverflow.com/a/16282685/1337392}
* @see {@link https://en.wikipedia.org/wiki/Centroid}
*/
const calculatePolygonCenter = () => {
let minX, maxX, minY, maxY;
coordinates.forEach(coordinate => {
minX = (coordinate.lng < minX || minX === undefined) ? coordinate.lng : minX;
maxX = (coordinate.lng > maxX || maxX === undefined) ? coordinate.lng : maxX;
minY = (coordinate.lat < minY || minY === undefined) ? coordinate.lat : minY;
maxY = (coordinate.lat > maxY || maxY === undefined) ? coordinate.lat : maxY;
});
return coordinateFactory((minY + maxY) / 2, (minX + maxX) / 2);
};
const polyCenter = calculatePolygonCenter();
/**
* Returns the array of coordinates of this polygon. It is calculated only
* once during the polygon's creation.
*
* @public
*
* @returns {Array} The array of coordinates from the polygon.
*/
const getCoordinates = () => coordinates;
/**
* Returns the center coordinate of this polygon. It is calculated only
* once during the polygon's creation.
*
* @public
*
* @returns {Coordinate} The coordinate that represents the geometric
* center of the polygon.
*/
const getPolygonCenter = () => polyCenter;
return Object.freeze({
getPolygonCenter,
getCoordinates
});
};