2012-11-14 27 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聲稱具有笛卡兒距離和非笛卡爾距離的函數。