"use strict"; /** * @class * @constructor * @param {!number} [longitude = 0] * @param {!number} [latitude = 0] * @returns {void} * @access public * @static */ export const CoordenatesModel = (function(){ /** * @constructs CoordenatesModel * @param {!number} [longitude = 0] * @param {!number} [latitude = 0] * @returns {void} * @access private * @static */ const CoordenatesModel = function(longitude = 0, latitude = 0){ /** @type {CoordenatesModel} */ const self = this; /** @type {number} */ this.latitude = latitude; /** @type {number} */ this.longitude = longitude; /** * @param {...CoordenatesModel} [points] * @returns {number} * @access public */ this.get_distance_to = (...points) => CoordenatesModel.get_points_distance(self, ...points); this.get_point = () => [self.latitude, self.longitude]; }; /** @type {number} */ CoordenatesModel.PI_RADIANS = Math.PI / 180; /** @type {number} */ CoordenatesModel.POLAR_RADIUS = 6356752; // Polar Earth radius- /** @type {number} */ CoordenatesModel.ECUATORIAL_RADIUS = 6378137; // Ecuatorial Earth radius- /** * @param {!CoordenatesModel} from * @param {!CoordenatesModel} to * @param {?number} [radius = null] * @returns {number} * @access public * @static */ CoordenatesModel.get_distance = (from, to, radius = null) => { /** @type {number} */ const angle = ( Math.sin((from.latitude - to.latitude) * CoordenatesModel.PI_RADIANS / 2) ** 2 + Math.cos(from.latitude * CoordenatesModel.PI_RADIANS) * Math.cos(to.latitude * CoordenatesModel.PI_RADIANS) * Math.sin((from.longitude - to.longitude) * CoordenatesModel.PI_RADIANS / 2) ** 2 ); return (radius || (CoordenatesModel.POLAR_RADIUS + Math.sin( (Math.abs(from.latitude) + Math.abs(to.latitude)) * .5 ) * ( CoordenatesModel.ECUATORIAL_RADIUS - CoordenatesModel.POLAR_RADIUS ))) * 2 * Math.atan2(angle ** .5, (1 - angle) ** .5); }; /** * @param {...CoordenatesModel} points * @returns {number} * @access public * @static */ CoordenatesModel.get_points_distance = (...points) => { /** @type {CoordenatesModel|null} */ let last = null; return points.reduce((distance, coordenates) => { last && (distance += CoordenatesModel.get_distance(last, coordenates)); last = coordenates; return distance; }, 0); }; return CoordenatesModel; })();