DEV Community

Nomon
Nomon

Posted on

Нахождение дистанции на C# 🌍

Введение

  • В этом посте я покажу, как сделать это с помощью C# и формулы гаверсина, одного из популярных способов расчета расстояния между двумя точками на поверхности Земли.

Что такое формула гаверсина?

  • Формула гаверсина используется для вычисления большой окружности — кратчайшего расстояния между двумя точками на поверхности сферы, в нашем случае — Земли. В отличие от простого "расстояния по прямой линии", эта формула учитывает кривизну Земли и поэтому дает более точные результаты при вычислении расстояний на большие расстояния (например, между городами или странами).
  • Формула принимает в качестве входных данных широту и долготу двух точек и вычисляет расстояние между ними.

Как это работает в C#?
Ниже приведен код, который можно использовать для расчета расстояния между двумя географическими координатами (широта и долгота):

namespace day1{

    class Program (){

        static void Main(string[] args){
            // Запрашиваем ввод у пользователя
            Console.Write("Введите широту первой точки (например, вашего города): ");
            double lat1 = Convert.ToDouble(Console.ReadLine());

            Console.Write("Введите долготу первой точки: ");
            double lon1 = Convert.ToDouble(Console.ReadLine());

            Console.Write("Введите широту второй точки (например, другого города): ");
            double lat2 = Convert.ToDouble(Console.ReadLine());

            Console.Write("Введите долготу второй точки: ");
            double lon2 = Convert.ToDouble(Console.ReadLine());

            // Здесь вычисляем расстояние
            Distance distanceCalculator = new Distance();
            double distance = distanceCalculator.HaversineDistance(lat1, lon1, lat2, lon2);

            // Выводим результат
            Console.WriteLine($"Расстояние между точками: {distance:F2} километров.");
        }
    }


}
Enter fullscreen mode Exit fullscreen mode
namespace day1{

    class Distance{

        const double EarthRadiusKm = 6371.0;

        public double HaversineDistance(double lat1, double lon1, double lat2, double lon2){
            // Переводим градусы в радианы, чтобы программа могла их использовать
            double dLat = DegreesToRadians(lat2 - lat1);
            double dLon = DegreesToRadians(lon2 - lon1);

            // Теперь используем формулу для расчета расстояния
            double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
            Math.Cos(DegreesToRadians(lat1)) * Math.Cos(DegreesToRadians(lat2)) *
            Math.Sin(dLon / 2) * Math.Sin(dLon / 2);

            double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));

            // Возвращаем результат — расстояние в километрах
            return EarthRadiusKm * c;
        }

            // Этот метод просто переводит градусы в радианы
        static double DegreesToRadians(double degrees){
            return degrees * Math.PI / 180;

        }

    }


}
Enter fullscreen mode Exit fullscreen mode

Объяснение кода

  • Ввод данных: Программа запрашивает у пользователя ввод широты и долготы двух точек. Формула гаверсина:
  • Мы используем формулу гаверсина для вычисления расстояния, чтобы учесть кривизну Земли. Вывод результата:
  • После вычислений программа выводит результат — расстояние между двумя точками в километрах.

Как это работает?

  • Мы конвертируем широту и долготу из градусов в радианы, так как многие математические функции работают с радианами.
  • Затем используем саму формулу гаверсина для вычисления большого окружного расстояния между двумя точками на сфере. В конце программа возвращает результат в километрах.

Если у вас есть вопросы или предложения по улучшению программы, обязательно оставляйте комментарии!

Top comments (0)