UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

79 lines 2.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CHEBYSHEV = exports.CANBERRA = exports.MANHATTAN = exports.EUCLIDEAN = exports.HAVERSINE = void 0; const unit_1 = require("./unit"); /** * Haversine formulate to calculate distance of two geographical points * @param {number[]} pointA Point A * @param {number[]} pointB Point B * @returns {number} distance */ function HAVERSINE(pointA, pointB) { const latRadA = unit_1.AngleUnit.DEGREE.convert(pointA[1], unit_1.AngleUnit.RADIAN); const latRadB = unit_1.AngleUnit.DEGREE.convert(pointB[1], unit_1.AngleUnit.RADIAN); const deltaLat = unit_1.AngleUnit.DEGREE.convert(pointB[1] - pointA[1], unit_1.AngleUnit.RADIAN); const deltaLon = unit_1.AngleUnit.DEGREE.convert(pointB[0] - pointA[0], unit_1.AngleUnit.RADIAN); const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(latRadA) * Math.cos(latRadB) * Math.sin(deltaLon / 2) * Math.sin(deltaLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return unit_1.GCS.EARTH_RADIUS_MEAN * c; } exports.HAVERSINE = HAVERSINE; /** * Euclidean distance function * @param {number[]} pointA n-dimensional point * @param {number[]} pointB n-dimensional point * @returns {number} distance */ function EUCLIDEAN(pointA, pointB) { let distance = 0; for (let i = 0; i < pointA.length; i++) { distance += Math.pow(pointA[i] - pointB[i], 2); } distance = Math.sqrt(distance); return distance; } exports.EUCLIDEAN = EUCLIDEAN; /** * Manhattan distance function * @param {number[]} pointA n-dimensional point * @param {number[]} pointB n-dimensional point * @returns {number} distance */ function MANHATTAN(pointA, pointB) { let distance = 0; for (let i = 0; i < pointA.length; i++) { distance += Math.abs(pointA[i] - pointB[i]); } return distance; } exports.MANHATTAN = MANHATTAN; /** * Canberra distance function * @param {number[]} pointA n-dimensional point * @param {number[]} pointB n-dimensional point * @returns {number} distance */ function CANBERRA(pointA, pointB) { let distance = 0; for (let i = 0; i < pointA.length; i++) { distance += Math.abs(pointA[i] - pointB[i]) / (Math.abs(pointA[i]) + Math.abs(pointB[i])); } return distance; } exports.CANBERRA = CANBERRA; /** * Chebyshev distance function * @param {number[]} pointA n-dimensional point * @param {number[]} pointB n-dimensional point * @returns {number} distance */ function CHEBYSHEV(pointA, pointB) { let maxDistance = 0; for (let i = 0; i < pointA.length; i++) { maxDistance = Math.max(maxDistance, Math.abs(pointA[i] - pointB[i])); } return maxDistance; } exports.CHEBYSHEV = CHEBYSHEV; //# sourceMappingURL=DistanceFunction.js.map