Как расположить узел по круговой орбите вокруг фиксированного центра на основе координат мыши (JavaFX)?

StackOverflow https://stackoverflow.com/questions/267613

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top