Calcola la distanza tra due punti in C++

Jinku Hu 12 ottobre 2023
  1. Usa le funzioni std::sqrt e std::pow per calcolare la distanza tra due punti in C++
  2. Usa la funzione std::hypot per calcolare la distanza tra due punti in C++
Calcola la distanza tra due punti in C++

Questo articolo introdurrà come calcolare la distanza tra due punti in C++.

Usa le funzioni std::sqrt e std::pow per calcolare la distanza tra due punti in C++

In generale, possiamo calcolare la distanza tra due punti applicando il teorema di Pitagora. Quindi, se conosciamo i parametri x e y di due punti, la loro distanza è uguale alla radice quadrata della somma delle distanze orizzontale e verticale, ciascuna elevata alla potenza di 2. Le stesse distanze orizzontali e verticali possono essere facilmente calcolate costruendo un triangolo rettangolo attorno alla retta che collega i due punti, dove quest’ultimo è l’ipotenusa.

In questo caso, utilizziamo le funzioni della libreria matematica standard C disponibili in C++ sotto lo spazio dei nomi std, vale a dire la funzione sqrt che calcola la radice quadrata dell’argomento dato e pow, che calcola il numero elevato al dato energia. Nota che entrambe queste funzioni restituiscono numeri in virgola mobile come tipi float o double.

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

double calculateDistance(std::pair<int, int> &x, std::pair<int, int> &y) {
  return sqrt(pow(x.first - y.first, 2) + pow(x.second - y.second, 2));
}

double calculateDistance(std::pair<double, double> &x,
                         std::pair<double, double> &y) {
  return sqrt(pow(x.first - y.first, 2) + pow(x.second - y.second, 2));
}

int main() {
  vector<std::pair<int, int>> vec = {
      {3, 4},
      {4, 3},
  };

  cout << "Distance between points (" << vec[0].first << ", " << vec[0].second
       << ") and (" << vec[1].first << ", " << vec[1].second << ") is "
       << calculateDistance(vec[0], vec[1]) << endl;

  return EXIT_SUCCESS;
}

Produzione:

Distance between points (3, 4) and (4, 3) is 1.41421

Si noti che è possibile implementare una variante di overload della funzione per i punti con coordinate rappresentate con numeri a virgola mobile, come illustrato nel codice di esempio seguente.

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

double calculateDistance(std::pair<int, int> &x, std::pair<int, int> &y) {
  return sqrt(pow(x.first - y.first, 2) + pow(x.second - y.second, 2));
}

double calculateDistance(std::pair<double, double> &x,
                         std::pair<double, double> &y) {
  return sqrt(pow(x.first - y.first, 2) + pow(x.second - y.second, 2));
}

int main() {
  vector<std::pair<double, double>> vec2 = {
      {4.0, 4.5},
      {9.0, 4.5},
  };

  cout << "Distance between points (" << vec2[0].first << ", " << vec2[0].second
       << ") and (" << vec2[1].first << ", " << vec2[1].second << ") is "
       << calculateDistance(vec2[0], vec2[1]) << endl;

  return EXIT_SUCCESS;
}

Produzione:

Distance between points (4, 4.5) and (9, 4.5) is 5

Usa la funzione std::hypot per calcolare la distanza tra due punti in C++

In alternativa, possiamo usare una funzione di libreria matematica - std::hypot che calcola la radice quadrata della somma dei quadrati di due o tre numeri. Questo metodo è consigliato per calcolare la distanza in quanto garantisce l’implementazione robusta e la segnalazione degli errori che sarebbe più difficile per l’utente finale implementare da solo. Si noti che è necessario passare la differenza delle coordinate corrispondenti come argomenti e utilizzare il valore restituito come risultato del calcolo.

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::copy;
using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<std::pair<double, double>> vec2 = {
      {4.0, 4.5},
      {9.0, 4.5},
  };

  cout << "Distance between points (" << vec2[0].first << ", " << vec2[0].second
       << ") and (" << vec2[1].first << ", " << vec2[1].second << ") is "
       << std::hypot(vec2[0].first - vec2[1].first,
                     vec2[0].second - vec2[1].second)
       << endl;

  return EXIT_SUCCESS;
}

Produzione:

Distance between points (4, 4.5) and (9, 4.5) is 5
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ Math