所以我想获得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”。
答案 0 :(得分:2)
您希望使用Math.atan2
而不是Math.atan
。 Math.atan
返回-π/ 2到π/ 2范围内的值(即-90°到90°)。这是因为它需要y
和x
的符号来计算4中的正确象限,这也是atan2
占用y
和{{1}的原因作为单独的参数。
(换句话说,给定一些x
和y
,x
。-y/x == y/-x
将它们分开处理,以便消除这种情况的歧义。)
有关详情,请参阅What is the difference between atan and atan2 in C++?。 (这些原则也适用于Java。)
作为旁注,atan2
中的三角学方法通常以弧度为单位。如果您正在使用学位,则需要进行转换。