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)
当我运行我的程序时,我得到每个坐标的用户输入,然后在我运行计算后显示距离.
如果您的输入是单精度的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++库.
| 归档时间: |
|
| 查看次数: |
8169 次 |
| 最近记录: |