RoutesMaker/Public/ecma/Models/CoordenatesModel.ecma.js

95 lines
2.7 KiB
JavaScript

"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;
})();