找到2个3D点之间的距离

Tot*_*gon 0 c++ 3d distance math.h square-root

我遇到了一个问题,我的X方格总是变得无穷大,导致产生的距离也是无限的,但是我看不出自己的数学有什么问题:

// Claculate distance

xSqr = (x1 - x2) * (x1 - x2);
ySqr = (y1 - y2) * (y1 - y2);
zSqr = (z1 - z2) * (z1 - z2);

double mySqr = xSqr + ySqr + zSqr;

double myDistance = sqrt(mySqr);
Run Code Online (Sandbox Code Playgroud)

当我运行我的程序时,我得到每个坐标的用户输入,然后在我运行计算后显示距离.

Mik*_*our 7

如果您的输入是单精度的float,那么如果强制进行双精度算术,则应该没问题:

xSqr = double(x1 - x2) * (x1 - x2);
//     ^^^^^^
Run Code Online (Sandbox Code Playgroud)

如果输入已经是双精度,并且您没有更大的浮点类型,那么您需要重新排列欧几里德距离计算以避免溢出:

r = sqrt(x^2 + y^2 + z^2)
  = abs(x) * sqrt(1 + (y/x)^2 + (z/x)^2)
Run Code Online (Sandbox Code Playgroud)

x三个坐标距离中最大的是哪里.

在代码中,可能看起来像:

double d[] = {abs(x1-x2), abs(y1-y2), abs(z1-z2)};
if (d[0] < d[1]) swap(d[0],d[1]);
if (d[0] < d[2]) swap(d[0],d[2]);
double distance = d[0] * sqrt(1.0 + d[1]/d[0] + d[2]/d[0]);
Run Code Online (Sandbox Code Playgroud)

或者,使用hypot,使用类似的技术来避免溢出:

double distance = hypot(hypot(x1-x2,y1-y2),z1-z2);
Run Code Online (Sandbox Code Playgroud)

虽然这可能不适用于2011年之前的C++库.