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

时间:2013-01-28 18:02:31

标签: 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);

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

3 个答案:

答案 0 :(得分:7)

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

xSqr = double(x1 - x2) * (x1 - x2);
//     ^^^^^^

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

r = sqrt(x^2 + y^2 + z^2)
  = abs(x) * sqrt(1 + (y/x)^2 + (z/x)^2)

其中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]);

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

double distance = hypot(hypot(x1-x2,y1-y2),z1-z2);

虽然这可能在2011年之前的C ++库中不可用。

答案 1 :(得分:2)

试试这个:

long double myDistance=sqrt(pow(x1-x2,2.0)+pow(y1-y2,2.0)+pow(z1-z2,2.0));

答案 2 :(得分:0)

我弄清楚发生了什么,我复制并粘贴了设置x1,y1和z1的代码,忘记将其更改为x2 y2和z2,这对我来说总是最愚蠢的事情:P谢谢你的帮助无论如何球员