8

2次元空間の2点間の距離を見つけるために使用できる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::normfunctionに実装されています。距離の 2 乗を返すだけです。

于 2012-11-14T15:24:23.443 に答える
3

C++11 では、hypot関数が標準ライブラリに追加されました。を計算sqrt(x^2 + y^2)し、オーバーフローに対する保護を提供します。これは、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

Boost.Geometryは、デカルト距離と非デカルト距離の関数を持っていると主張しています。

于 2012-11-14T15:31:28.483 に答える
1

いいえ、2D ベクトルは言語の型の一部ではないためです。

必要に応じて、2D 座標オブジェクトを実装し、そのようなポイント間の距離を見つける関数を提供する、使用できる数学/ゲーム/シミュレーション ライブラリが多数あります。

于 2012-11-14T15:19:59.773 に答える
1

それほどでもない。

2D 距離は数学関数であり、C/C++ で使用できる数学関数を見ると、それらが数値を操作していることがわかります。

しかし、それは具体的ではありません。実際にわかっているのは、関数が異なる名前 (C の場合) を持っているか、(C++ の場合) オーバーロードされて、異なる型 (int、float、double、&c.) の数値を操作することです。これ、またはキャストが実行されます。

幸いなことに、数値の種類は限られているため、この種のことを行うための一般的なライブラリを用意することは理にかなっています。

では、数学関数を作成するのと同じ方法で 2D 距離関数を作成できますか? ポイントを表す方法はたくさんあるので、すぐに難しいことがわかります。たとえば、デカルト対放射状、xy 対 ij、double 対 float 対 int などです。一般的な 2D 距離は、これらすべての可能性をカバーする必要があります。

2D 距離関数を持つほとんどのライブラリには、可能性の数を減らすために付随する点構造があります。

ただし、点を格納し、標準ライブラリを使用して 2D 距離を見つけるために使用できる実装されているデータ構造が少なくとも 1 つあります: 複素数です!

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

ただし、これはユークリッド距離について話していることを前提としています。また、マンハッタン距離またはよりエキゾチックなメトリックについて話している可能性もあります。私が言及したすべての可能性を説明しようとするのではなく、言語設計者はこの機能を実装しないことを選択しました. (または、この質問を合理的に尋ねる可能性のある、このような多くの他の機能のいずれか)。

EDIT : または、ポイントを差し引いてhypot、C99 標準から関数を使用することもできます。ここを参照してください。

于 2012-11-14T15:27:21.107 に答える
1

Well I think it's easy to find:

The linear distance between two points in a 3D Space.

d = sqrt( ( x2 - x1 )^2 + ( y2 - y1 )^2 + ( z2 - z1 )^2 )

The Manhattan distance is different, very used in 2D games:

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 に答える