Как расположить Узел вдоль круговой орбиты вокруг фиксированного центра на основе координат мыши (JavaFX)? - PullRequest
0 голосов
/ 06 ноября 2008

Я пытаюсь приступить к разработке базовой игры на 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 ??

Я знаю, что это должно быть что-то маленькое, но я просто не могу понять, что это такое ...

Спасибо за любую помощь (и нет, это не задание)

Ответы [ 3 ]

3 голосов
/ 06 ноября 2008

atan(height/length) недостаточно, чтобы получить угол. Вам необходимо компенсировать каждый квадрант, а также возможность «деления на ноль». Большинство библиотек языков программирования предоставляют метод с именем atan2, который принимает два аргумента; y и x. Этот метод делает этот расчет за вас.

Дополнительная информация по Википедия: atan2

2 голосов
/ 06 ноября 2008

Вы можете уйти без расчета угла. Вместо этого используйте центр вашего круга (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 будет равен нулю, и мышь окажется втянутой в черную дыру.

0 голосов
/ 06 ноября 2008

Существует замечательная книга под названием "Графика" , которая может помочь в решении подобных проблем. Это поваренная книга алгоритмов и исходного кода (на Си, я думаю), и позволяет быстро решить проблему, используя проверенные функциональные возможности. Я бы настоятельно рекомендовал вам в этом разобраться - это сэкономило мне много времени, когда мне быстро потребовалось добавить код для выполнения довольно сложных операций с нормалями к поверхностям и обнаружения столкновений.

...