atan(location1 - location2)返回不正确的值

时间:2015-06-24 17:30:34

标签: java math

我试图计算一个实体在查看另一个实体时必须要考虑的角度。

l是第一个实体的位置。

o是另一个实体的位置。

每个实体在3D空间中都有一个3D X,Y和Z坐标。

我目前正在使用double angXZ = Math.toDegrees(Math.atan2(((l.getZ()) - o.getZ()), ((l.getX()) - o.getX())));正确计算X和Z的度数。

但是,当我尝试将Y转换为度数时,它会给出完全错误的读数。

我目前正在尝试使用double angY = Math.toDegrees(Math.atan(l.getY() - o.getY()));来获取两个Y坐标之间的角度,但它似乎并没有起作用。

为什么不呢?这里出了什么问题?我该如何解决?

最终目标是能够遍历第一个实体和第二个实体之间的所有坐标,并检查其间是否有任何对象。

例如,Math.toDegrees(Math.atan(51 - 50));等于58,这显然不正确。

1 个答案:

答案 0 :(得分:1)

据我所知,你试图计算(1)通过点lo的线以及(2)XZ平面之间的角度。我们将Y方向称为垂直方向。然后你将需要两条信息:从lo的水平距离(即投影到XZ平面后两点之间的距离)和垂直距离从lo(Y坐标的差异)。就目前而言,看起来好像你正试图根据垂直差异来计算角度。这显然是有问题的:两点之间的高度差异不足以确定你所追求的角度。

您需要的水平差异可以使用Math.hypot以及X和Z坐标的差异来计算。因此,计算角度的代码如下所示:

/* Compute the components of the vector from o to l. */
double diffX = l.getX() - o.getX();
double diffY = l.getY() - o.getY();
double diffZ = l.getZ() - o.getZ();

/* Find the horizontal distance from o to l (assuming that
   Y is the vertical direction. */
double distXZ = Math.hypot(diffX, diffZ);

/* Compute the angle in degrees using the vertical distance
   and the horizontal distance. */
double pitch = Math.toDegrees(Math.atan2(diffY, distXZ));