c ++或c库中是否有任何内置函数可用于查找二维空间中两点之间的距离
PS:我知道如何自己实施。
答案 0 :(得分:6)
好吧,你可以在complex numbers使用算术:
using point_t = std::complex<int>;
double distance(point_t a, point_t b) {
std::sqrt(norm(b - a))
}
我意识到这不会完全满足你不写自己的功能的要求,但实际的距离逻辑是在std::norm
function中实现的。它只返回距离的平方。
答案 1 :(得分:1)
不,因为2D矢量不是该语言的类型部分。
根据您的需要,可以使用许多数学/游戏/模拟库来实现2D坐标对象,并为您提供查找这些点之间距离的函数。
答案 2 :(得分:1)
我觉得很容易找到:
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 );
}
答案 3 :(得分:1)
没那么多。
2D距离是一个数学函数,如果我们看一下C / C ++中可用的数学函数,我们发现它们对数字起作用。
但这是非特定的:我们实际发现的是函数具有不同的名称(在C中)或者被重载(在C ++中)以对不同类型(int,float,double和&amp; c。)的数字进行操作。要么这样做,要么进行铸造。
幸运的是,数字类型有限,因此有一般的库可以做这种事情。
现在,我们能否以与构建数学函数相同的方式构建2D距离函数?你会立即发现它更难,因为有很多方法来表示这些点。例如,笛卡儿与径向,x-y与i-j,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;
}
但这假设你在谈论欧氏距离。您也可以谈论Manhatten距离或更多异国情调的指标。语言设计者选择不实现此功能,而不是试图解释我提到的所有可能性。 (或许多其他功能中的任何一个,例如人们可能合理地提出这个问题)。
修改强>:
或者您可以减去这些点并使用C99标准中的hypot
功能。请参阅here。
答案 4 :(得分:0)
Boost.Geometry声称具有笛卡尔和非笛卡尔距离的函数。