Введение
- В этом посте я покажу, как сделать это с помощью 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} километров.");
}
}
}
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;
}
}
}
Объяснение кода
- Ввод данных: Программа запрашивает у пользователя ввод широты и долготы двух точек. Формула гаверсина:
- Мы используем формулу гаверсина для вычисления расстояния, чтобы учесть кривизну Земли. Вывод результата:
- После вычислений программа выводит результат — расстояние между двумя точками в километрах.
Как это работает?
- Мы конвертируем широту и долготу из градусов в радианы, так как многие математические функции работают с радианами.
- Затем используем саму формулу гаверсина для вычисления большого окружного расстояния между двумя точками на сфере. В конце программа возвращает результат в километрах.
Если у вас есть вопросы или предложения по улучшению программы, обязательно оставляйте комментарии!
Top comments (0)