Ошибка при поиске угла между двумя точками
Эту проблему сложно объяснить, поэтому я буду использовать изображение, чтобы помочь мне:
http://i39.tinypic.com/2rm4ntd.png
Я пытаюсь найти угол между серединой танка и мышью. Оранжевая точка обозначает положение мыши, красная линия разделяет два экземпляра, а зеленая / известковая линия показывает угол башни танка. Я несколько раз просматривал переполнение стека, но пока безрезультатно нашел решение своей проблемы. Я даже гуглил. В обоих я нашел много групп кода, чтобы "найти угол". Я уверен, что это работает, поэтому я сомневаюсь, что моя проблема заключается в плохом коде. Я угадываю, что ошибка найдена в MouseMotionListener.
Две точки, которые я использую для создания линии псевдо (НЕ зеленой или красной линии), являются средней точкой танка. new Point(Tank.getX() + 16, Tank.getY() + 16)
(размер танков составляет 32x32) и точка мыши (устанавливается при появлении нового события перемещения мыши).
Подробности о моей программе:
- Рамка создана и к ней прикреплен MouseMotionListener.
- JPanel создается и добавляется в кадр.
- Все нарисовано на JPanel.
Короче мой getAngle()
код неправильный, мой MouseMotionListener неправильный, или я задаю неправильные параметры. В чем проблема?...
РЕДАКТИРОВАТЬ: Как просили в комментариях здесь мой код и вывод:
Код:
public static float getAngle(Point source, Point destination) {
System.out.println(source + "\n" + destination);
double xDiff = source.x - destination.x;
double yDiff = source.y - destination.y;
System.out.println((float) Math.toDegrees(Math.atan2(yDiff, xDiff)));
return (float) Math.toDegrees(Math.atan2(yDiff, xDiff));
}
Выход:
java.awt.Point[x=116,y=116] // Source point
java.awt.Point[x=134,y=123] // Destination point
-158.7495
1 ответ
Ну, после долгих поисков, я обнаружил, что ошибки действительно не было. Весь код был правильным, все.. в значительной степени все было правильно. Единственной ошибкой было то, что она была отклонена на 90 градусов. Эта мысль приходила мне в голову несколько раз, но каждый раз, когда я смотрел на точку и линию, это просто казалось неправильным... Фиксированный код ниже:
public static float getAngle(Point source, Point destination) {
System.out.println(source + "\n" + destination);
double xDiff = source.x - destination.x;
double yDiff = source.y - destination.y;
System.out.println((float) Math.toDegrees(Math.atan2(yDiff, xDiff)));
return (float) Math.toDegrees(Math.atan2(yDiff, xDiff)) + 90.0F;
}
По какой-то причине я чувствую, что только что потерял пару баллов IQ за пропуск этого многократного времени.