95 lines
2.7 KiB
JavaScript
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;
|
|
})(); |