Как расположить узел по круговой орбите вокруг фиксированного центра на основе координат мыши (JavaFX)?
-
06-07-2019 - |
Вопрос
Я пытаюсь разобраться в какой-то базовой разработке игр на JavaFX, и я начинаю путаться с какой-то математикой кругов.
У меня есть окружность с (x: 250, y: 250) радиусом 50.
Моя цель состоит в том, чтобы сделать меньший круг, который будет помещен по окружности вышеупомянутого круга, в зависимости от положения мыши.
Где я запутываюсь, так это с пространством координат и тригонометрией, стоящей за всем этим.
Мои проблемы возникают из-за того, что пространство X / Y на экране не центрировано на 0,0.Но в левом верхнем углу экрана равно 0,0, а в правом нижнем - 500,500.
Мои расчеты таковы:
var xpos:Number = mouseEvent.getX();
var ypos:Number = mouseEvent.getY();
var center_pos_x:Number = 250;
var center_pos_y:Number = 250;
var length = ypos - center_pos_y;
var height = xpos - center_pos_x;
var angle_deg = Math.toDegrees(Math.atan(height / length));
var angle_rad = Math.toRadians(angle_deg);
var radius = 50;
moving_circ_xpos = (radius * Math.cos(angle_rad)) + center_pos_x;
moving_circ_ypos = (radius * Math.sin(angle_rad)) + center_pos_y;
Я заставил приложение распечатать угол (angle_deg), который я рассчитал при наведении курсора мыши, и мой вывод приведен ниже:
Когда мышь находится (в градусах, перемещающихся против часовой стрелки):
- непосредственно над окружностью и горизонтально на одной линии с центром, угол равен -0
- слева и по центру по вертикали угол равен -90
- непосредственно под окружностью и горизонтально на одной линии с центром угол равен 0
- вправо и по центру по вертикали угол равен 90
Итак, что я могу сделать, чтобы сделать это 0, 90, 180, 270??
Я знаю, это должно быть что-то маленькое, но я просто не могу придумать, что это такое...
Спасибо за любую помощь (и нет, это не задание)
Решение
atan(height/length)
этого недостаточно, чтобы получить нужный угол обзора.Вам необходимо компенсировать каждый квадрант, а также возможность "деления на ноль".Большинство библиотек языков программирования предоставляют метод, называемый atan2
которые принимают два аргумента; y
и x
.Этот метод выполняет этот расчет за вас.
Более подробная информация о Википедия:атан2
Другие советы
Вы можете уйти, не рассчитав угол наклона.Вместо этого используйте центр вашего круга (250,250) и положение мыши (xpos, ypos), чтобы определить линию.Линия пересекает ваш круг, когда ее длина равна радиусу вашего круга:
// Calculate distance from center to mouse. xlen = xpos - x_center_pos; ylen = ypos - y_center_pos; line_len = sqrt(xlen*xlen + ylen*ylen); // Pythagoras: x^2 + y^2 = distance^2 // Find the intersection with the circle. moving_circ_xpos = x_center_pos + (xlen * radius / line_len); moving_circ_ypos = y_center_pos + (ylen * radius / line_len);
Просто убедитесь, что мышь не находится в центре вашего круга, иначе line_len будет равен нулю, и мышь будет засосана в черную дыру.
Там есть отличная книга под названием "Графические жемчужины" это может помочь в решении такого рода проблем.Это кулинарная книга алгоритмов и исходного кода (по-моему, на C), которая позволяет вам быстро решить проблему, используя протестированную функциональность.Я бы настоятельно рекомендовал вам заняться этим - это здорово сэкономило мне время, когда мне быстро понадобилось добавить код для выполнения довольно сложных операций с нормалями к поверхностям и обнаружения столкновений.