Atan返回0,但不是180

时间:2018-06-10 01:34:32

标签: java math bukkit

所以我想获得2点之间的度数,但是当我希望它返回180时,它返回0 ... 0,90和270确实有效,但是当它180时它返回0 ..这是我的代码:

Location loc1 = new Location(Bukkit.getWorld("world"), 1, 0, 0);
Location loc2 = new Location(Bukkit.getWorld("world"), -1, 0, 0);

float pitch = Utils.yawpitch(loc1, loc2).getPitch();


public static Location yawpitch(Location loc, Location toloc) {

    loc = loc.clone();

    double x = toloc.getX() - loc.getX();
    double y = toloc.getY() - loc.getY();
    double z = toloc.getZ() - loc.getZ();

    double dxz = Math.sqrt(Math.pow(x, 2) + Math.pow(z, 2));
    loc.setPitch((float) -Math.atan(y / dxz));
    loc.setPitch(loc.getPitch() * 180f / (float) Math.PI);

return loc;

}

所以我的第一个点在左边,第二个点在右边,所以它应该是180,但这将返回“0”。

1 个答案:

答案 0 :(得分:2)

您希望使用Math.atan2而不是Math.atanMath.atan返回-π/ 2到π/ 2范围内的值(即-90°到90°)。这是因为它需要yx的符号来计算4中的正确象限,这也是atan2占用y和{{1}的原因作为单独的参数。

(换句话说,给定一些xyx-y/x == y/-x将它们分开处理,以便消除这种情况的歧义。)

有关详情,请参阅What is the difference between atan and atan2 in C++?。 (这些原则也适用于Java。)

作为旁注,atan2中的三角学方法通常以弧度为单位。如果您正在使用学位,则需要进行转换。