我遇到了一个问题,我的 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);
当我运行我的程序时,我得到每个坐标的用户输入,然后在我运行计算后显示距离。
最佳答案
如果您的输入是单精度float
,那么如果您强制执行 double 运算应该没问题:
xSqr = double(x1 - x2) * (x1 - x2);
// ^^^^^^
如果输入已经是 double 的,并且您没有可用的更大的浮点类型,那么您需要重新安排欧氏距离计算以避免溢出:
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++ 库中可能不可用。
关于c++ - 查找 2 个 3D 点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14568249/