Итак, я хочу получить градусы между двумя точками, но когда я хочу, чтобы он возвращал 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».




Похоже, что вы хотите использовать Math.atan2, а не Math.atan. Math.atan возвращает значение в диапазоне от -π / 2 до π / 2 (то есть от -90 ° до 90 °). Это связано с тем, что для вычисления правильного квадранта из 4 потребуются признаки как y, так и x, поэтому atan2 также принимает y и x в качестве отдельных аргументов.
(Другими словами, учитывая некоторые y и x, -y/x == y/-x. atan2 берет их отдельно, чтобы можно было устранить неоднозначность в подобных случаях.)
Также см. В чем разница между atan и atan2 в C++? для получения дополнительной информации. (Эти принципы применимы и к Java.)
Кстати, тригонометрические методы в Math обычно работают в радианах. Если вы используете градусы, вам необходимо выполнить преобразование.