c++ 或 c 库中是否有任何内置函数可用于查找二维空间中两点之间的距离
PS:我知道如何自己实现它。
好吧,您可以对复数使用算术:
using point_t = std::complex<int>;
double distance(point_t a, point_t b) {
return std::abs(b - a);
}
我意识到这并不能完全满足您不编写自己的函数的要求,而是在std::norm
函数中实现了实际的距离逻辑。它只返回距离的平方。
在 C++11 中,该hypot
函数已添加到标准库中。它计算sqrt(x^2 + y^2)
,并提供一些防止溢出的保护。这是查找两点之间的欧几里得距离的便捷方法:
#include <cmath>
#include <iostream>
struct Point{double x; double y;};
int main()
{
Point a{0.0, 0.0};
Point b{3.0, 4.0};
double distance = std::hypot(a.x-b.x, a.y-b.y);
std::cout << distance << std::endl;
}
不,因为 2D 向量不是语言的类型部分。
根据您的需要,可以使用许多数学/游戏/模拟库来实现 2D 坐标对象,并为您提供查找这些点之间距离的函数。
好吧,我认为这很容易找到:
3D 空间中两点之间的线性距离。
d = sqrt( ( x2 - x1 )^2 + ( y2 - y1 )^2 + ( z2 - z1 )^2 )
曼哈顿距离不同,在 2D 游戏中非常常用:
d = | ( x2 - x1 ) | + | ( y2 - y1 ) |
typedef struct {
float x, y, z;
} point_t;
typedef struct {
int x, y;
} point2d_t;
double distanceFinder( point_t a, point_t b )
{
return sqrt( pow( a.x-b.x, 2.0 ) + pow( a.y-b.y, 2.0 ) + pow( a.z-b.z, 2.0 ) );
}
int manhattanFinder( point2d_t a, point2d_t b)
{
/* Considering the points have integer coordinates and is a 2D game */
return abs( a.x - b.x ) + abs( a.y - b.y );
}
没那么多。
2D 距离是一个数学函数,如果我们查看 C/C++ 中可用的数学函数,我们会发现它们对数字进行运算。
但这不是特定的:我们实际发现的是函数具有不同的名称(在 C 中)或被重载(在 C++ 中)以对不同类型的数字(int、float、double 等)进行操作。要么执行此操作,要么执行铸造。
幸运的是,数字类型有限,因此有通用库来做这种事情是有意义的。
现在,我们可以像构造数学函数一样构造二维距离函数吗?您会立即发现它更加困难,因为有很多方法可以表示点。例如,笛卡尔与径向、xy 与 ij、double 与 float 与 int。我们一般的 2D 距离需要涵盖所有这些可能性。
大多数具有 2D 距离函数的库都会附带点结构以减少可能性的数量。
但是,至少有一种数据结构可以存储一个点并用于使用标准库查找 2D 距离:复数!
// norm example
#include <iostream>
#include <complex>
using namespace std;
int main ()
{
complex<double> mycomplex (3.0,4.0);
cout << "The norm of " << mycomplex << " is " << norm(mycomplex) << endl;
return 0;
}
但这假设您正在谈论欧几里得距离。您还可以谈论曼哈顿距离或更奇特的指标。语言设计者没有尝试考虑我提到的所有可能性,而是选择不实现此功能。(或许多其他功能中的任何一个,例如人们可能合理地提出这个问题的)。
编辑:或者您可以减去点并使用hypot
C99 标准中的函数。见这里。
Boost.Geometry声称具有笛卡尔和非笛卡尔距离的功能。