Изучение различных методов расчета расстояния между двумя координатами

Вычисление расстояния между двумя координатами — фундаментальная операция в различных областях, таких как математика, физика, информатика и навигация. В этой статье блога мы рассмотрим несколько методов расчета расстояния между двумя координатами, а также примеры кода на популярных языках программирования. Итак, приступим!

  1. Евклидово расстояние:
    Формула евклидова расстояния вычисляет расстояние по прямой между двумя точками на плоскости. Обычно он используется, когда координаты представляют собой точки на плоской поверхности.

Пример кода (Python):

import math
def euclidean_distance(x1, y1, x2, y2):
    return math.sqrt((x2 - x1)2 + (y2 - y1)2)
# Example Usage
distance = euclidean_distance(1, 2, 4, 6)
print(distance)
  1. Манхэттенское расстояние:
    Манхэттенское расстояние, также известное как расстояние такси или расстояние городского квартала, измеряет расстояние между двумя точками путем суммирования абсолютных разностей между их координатами. Он часто используется в сеточных системах.

Пример кода (Java):

public static int manhattanDistance(int x1, int y1, int x2, int y2) {
    return Math.abs(x2 - x1) + Math.abs(y2 - y1);
}
// Example Usage
int distance = manhattanDistance(1, 2, 4, 6);
System.out.println(distance);
  1. Формула гаверсина.
    Формула гаверсина вычисляет расстояние между двумя точками на поверхности сферы (например, Земли), используя их координаты широты и долготы. Он учитывает кривизну Земли и обычно используется в географических приложениях.

Пример кода (JavaScript):

function toRadians(degrees) {
    return degrees * Math.PI / 180;
}
function haversineDistance(lat1, lon1, lat2, lon2) {
    const R = 6371; // Earth's radius in kilometers
    const dLat = toRadians(lat2 - lat1);
    const dLon = toRadians(lon2 - lon1);
    const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
              Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) *
              Math.sin(dLon / 2) * Math.sin(dLon / 2);
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    return R * c;
}
// Example Usage
const distance = haversineDistance(52.5200, 13.4050, 48.8566, 2.3522);
console.log(distance);
  1. Расстояние по большому кругу.
    Расстояние по большому кругу рассчитывает кратчайшее расстояние между двумя точками на поверхности сферы. Она похожа на формулу Хаверсина, но дает более точные результаты на больших расстояниях.

Пример кода (C++):

#include <iostream>
#include <cmath>
double toRadians(double degrees) {
    return degrees * M_PI / 180;
}
double greatCircleDistance(double lat1, double lon1, double lat2, double lon2) {
    const double R = 6371; // Earth's radius in kilometers
    const double dLat = toRadians(lat2 - lat1);
    const double dLon = toRadians(lon2 - lon1);
    const double a = sin(dLat / 2) * sin(dLat / 2) +
                     cos(toRadians(lat1)) * cos(toRadians(lat2)) *
                     sin(dLon / 2) * sin(dLon / 2);
    const double c = 2 * atan2(sqrt(a), sqrt(1 - a));
    return R * c;
}
// Example Usage
int main() {
    double distance = greatCircleDistance(52.5200, 13.4050, 48.8566, 2.3522);
    std::cout << distance << std::endl;
    return 0;
}