内置功能,找到距离

时间:2012-11-14 15:18:51

标签: c++ c

c ++或c库中是否有任何内置函数可用于查找二维空间中两点之间的距离

PS:我知道如何自己实施。

5 个答案:

答案 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声称具有笛卡尔和非笛卡尔距离的函数。