8

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

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

4

6 回答 6

6

好吧,您可以对复数使用算术:

using point_t = std::complex<int>;

double distance(point_t a, point_t b) {
    return std::abs(b - a);
}

我意识到这并不能完全满足您不编写自己的函数的要求,而是在std::norm函数中实现了实际的距离逻辑。它只返回距离的平方。

于 2012-11-14T15:24:23.443 回答
3

在 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;
}
于 2018-05-23T22:32:12.863 回答
1

不,因为 2D 向量不是语言的类型部分。

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

于 2012-11-14T15:19:59.773 回答
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 );
}
于 2012-11-14T15:24:14.563 回答
1

没那么多。

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;
} 

但这假设您正在谈论欧几里得距离。您还可以谈论曼哈顿距离或更奇特的指标。语言设计者没有尝试考虑我提到的所有可能性,而是选择不实现此功能。(或许多其他功能中的任何一个,例如人们可能合理地提出这个问题的)。

编辑:或者您可以减去点并使用hypotC99 标准中的函数。见这里

于 2012-11-14T15:27:21.107 回答
1

Boost.Geometry声称具有笛卡尔和非笛卡尔距离的功能。

于 2012-11-14T15:31:28.483 回答