我试图计算一个实体在查看另一个实体时必须要考虑的角度。
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,这显然不正确。
答案 0 :(得分:1)
据我所知,你试图计算(1)通过点l
和o
的线以及(2)XZ平面之间的角度。我们将Y方向称为垂直方向。然后你将需要两条信息:从l
到o
的水平距离(即投影到XZ平面后两点之间的距离)和垂直距离从l
到o
(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));