Как вычислить евклидово расстояние между двумя точками на плоскости (например, на экране) в C++?

«Как вычислить евклидово расстояние между двумя точками на плоскости (например, на экране) в C++?» — вопрос из категории Алгоритмы и структуры данных, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Расстояние вычисляется по формуле: distance = sqrt((x2 - x1)² + (y2 - y1)²).

Базовая реализация:

#include <cmath> // для std::sqrt, std::hypot
#include <iostream>

struct Point {
    double x;
    double y;
};

double distance_simple(const Point& a, const Point& b) {
    double dx = b.x - a.x;
    double dy = b.y - a.y;
    return std::sqrt(dx * dx + dy * dy);
}

int main() {
    Point p1{1.0, 2.0};
    Point p2{4.0, 6.0};
    std::cout << "Distance: " << distance_simple(p1, p2) << std::endl; // 5.0
    return 0;
}

Практические улучшения и замечания:

  1. Используйте std::hypot (C++11): Эта функция специально предназначена для вычисления гипотенузы, она предотвращает переполнение и потерю точности.
    double distance_better(const Point& a, const Point& b) {
        return std::hypot(b.x - a.x, b.y - a.y);
    }
  2. Избегайте извлечения квадратного корня, если это возможно: Во многих алгоритмах (например, для сравнения расстояний) достаточно квадрата расстояния, что экономит ресурсы.
    double squared_distance(const Point& a, const Point& b) {
        double dx = b.x - a.x;
        double dy = b.y - a.y;
        return dx * dx + dy * dy;
    }
    // Сравнение: if (squared_distance(p1, p2) < radius*radius) ...
  3. Шаблонная реализация для разных типов данных:
    template<typename T>
    auto distance(const T& x1, const T& y1, const T& x2, const T& y2) -> decltype(std::hypot(x1, y1)) {
        return std::hypot(x2 - x1, y2 - y1);
    }
    // Работает с float, double, long double.
  4. Для целочисленных координат: Используйте double или long double для результата, чтобы избежать потери точности, но будьте осторожны с переполнением при вычислении квадратов больших чисел (используйте long long для промежуточных вычислений).