Calcule a distância entre dois pontos em C++
-
Use as funções
std::sqrt
estd::pow
para calcular a distância entre dois pontos em C++ -
Use a função
std::hypot
para calcular a distância entre dois pontos em C++
Este artigo irá apresentar como calcular a distância entre dois pontos em C++.
Use as funções std::sqrt
e std::pow
para calcular a distância entre dois pontos em C++
Geralmente, podemos calcular a distância entre dois pontos aplicando o teorema de Pitágoras. Portanto, se conhecermos os parâmetros x
e y
de dois pontos, a distância entre eles é igual à raiz quadrada da soma das distâncias horizontal e vertical, cada uma elevada à potência de 2
. As próprias distâncias horizontais e verticais podem ser facilmente calculadas construindo um triângulo retângulo ao redor da linha que conecta os dois pontos, onde o último é a hipotenusa.
Neste caso, utilizamos funções de biblioteca matemática padrão C disponíveis em C++ sob o namespace std
, ou seja, a função sqrt
que calcula a raiz quadrada do argumento dado e pow
, que calcula o número elevado para o dado potência. Observe que ambas as funções retornam números de ponto flutuante como tipos float
ou 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;
}
Resultado:
Distance between points (3, 4) and (4, 3) is 1.41421
Observe que podemos implementar uma variante sobrecarregada da função para pontos com coordenadas representadas com números de ponto flutuante, conforme demonstrado no código de exemplo a seguir.
#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;
}
Resultado:
Distance between points (4, 4.5) and (9, 4.5) is 5
Use a função std::hypot
para calcular a distância entre dois pontos em C++
Alternativamente, podemos usar uma função de biblioteca matemática - std::hypot
que calcula a raiz quadrada da soma dos quadrados de dois ou três números. Este método é a maneira recomendada de calcular a distância, pois garante a implementação robusta e o relatório de erros que seria mais difícil para o usuário final implementar sozinho. Observe que precisamos passar a diferença das coordenadas correspondentes como argumentos e usar o valor de retorno como o resultado do cálculo.
#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;
}
Resultado:
Distance between points (4, 4.5) and (9, 4.5) is 5
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