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

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

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

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

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

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

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay