2012-11-14 29 views
6

有没有在C任何内置的功能++或可用于查找两点之间的距离在2-d空间内置功能找到距离

PS C库:我知道如何实现它自己。

+5

二维空间中有无限多的有效“距离函数”。任何人都应该知道你想要哪一个? –

+3

甚至没有内置的点数据结构... –

+5

@KerrekSB法国铁路公制,当然。 –

回答

5

好了,你可以在complex numbers使用算术:

using point_t = std::complex<int>; 

double distance(point_t a, point_t b) { 
    std::sqrt(norm(b - a)) 
} 

我知道这并不相当满足您不是在写自己的功能,但实际距离逻辑的要求在std::norm function中实施。它只是返回距离的平方。

+2

从一些有限的经验,我会建议考虑平方根是否实际上是一个必要的操作。通常你可以通过单独的距离平方来解决所有的问题(记住平方是单调的),所以没有必要保持这种昂贵的操作。 –

+1

@KerrekSB *如果*你只需要比较距离,是的。不过,我想保留答案,我不想推定一个特定的用例。 –

+0

如果用'std :: abs(b-a)'代替上面的身体会有什么缺点吗? ([std :: complex'中的'std :: abs']](http://en.cppreference.com/w/cpp/numeric/complex/abs))?比较'std :: norm'和'std :: abs' [在libstdC++](https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00812_source.html)中的实现,它看起来后者在将它们平方之前修改了真实和复杂组件中最长的一个的长度。使用'std :: norm'方法不会做任何这样的“组件标准化”。使用'std :: abs'(impl。)方法的上/下可能是什么? – dfri

1

不,作为2D矢量不是该语言的类型部分。

根据您的需要,可以使用许多数学/游戏/模拟库来实现2D坐标对象,并为您提供查找这些点之间距离的函数。

+0

为什么不只是一个签名为'double distance(x1,x2,y1,y2)'的函数呢? – none

+0

因为这不是“内置的” - 如果内置的意思是“语言或标准库的一部分”,就像我认为它是 – emartel

1

我觉得很容易找到:

三维空间中两点之间的线性距离。

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); 
} 
+2

......但是OP已经指定他们知道如何自己实现它。 –

+2

你不需要曼哈顿距离的“abs”吗? – none

+2

我想曼哈顿距离还是错的,应该是'd = |(x2-x1)| + |(y2-y1)|'而不是。 – none

1

并非如此。二维距离是一个数学函数,如果我们在C/C++中查看可用的数学函数,我们发现它们是以数字运算的。但是这是非特定的:我们实际发现的是,函数具有不同的名称(在C中)或者被重载(在C++中)以在不同的类型(int,float,double,& c。)上操作。要么是这个,要么是演员。

幸运的是,数字的类型是有限的,所以有一般的图书馆来做这种事情是有道理的。

现在,我们能否像构建数学函数一样构造2D距离函数?你会立即看到它更加困难,因为有许多方法来表示这些点。例如,笛卡尔与径向,x-y与i-j,double与float与int。我们的一般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; 
} 

但是,这里假设你说的是欧氏距离。你也可以谈论曼哈顿距离或更具异国情调的指标。语言设计者并没有试图说明我提到的所有可能性,而是选择不实施这个功能。 (或者许多其他许多功能中的任何一个,比如这个人可能会合理地问这个问题)。

编辑: 或者你也可以减去点和C99标准使用hypot功能。见here

0

Boost.Geometry声称具有笛卡儿距离和非笛卡尔距离的函数。