¿Cómo colocar un nodo a lo largo de una órbita circular alrededor de un centro fijo basado en las coordenadas del mouse (JavaFX)?

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

Pregunta

Estoy tratando de entrar en un desarrollo básico de juegos JavaFX y me estoy confundiendo con algunas matemáticas de círculo.

Tengo un círculo en (x: 250, y: 250) con un radio de 50.

Mi objetivo es hacer que se coloque un círculo más pequeño en la circunferencia del círculo anterior en función de la posición del mouse.

Donde me estoy confundiendo es con el espacio de coordenadas y el Trig detrás de todo.

Mis problemas provienen del hecho de que el espacio X / Y en la pantalla no está centrado en 0,0. Pero la parte superior izquierda de la pantalla es 0,0 y la parte inferior derecha es 500,500.

Mis cálculos son:

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;

Hice que la aplicación imprima el ángulo (angle_deg) que calculé cuando muevo el mouse y mi salida está debajo:

Cuando el mouse se mueve (en grados hacia la izquierda):

  • directamente encima del círculo y horizontalmente en línea con el centro, el ángulo es -0
  • a la izquierda y centrado verticalmente, el ángulo es -90
  • directamente debajo del círculo y horizontalmente en línea con el centro, el ángulo es 0
  • a la derecha y centrado verticalmente, el ángulo es 90

Entonces, ¿qué puedo hacer para que sea 0, 90, 180, 270?

Sé que debe ser algo pequeño, pero no puedo pensar en qué es ...

Gracias por cualquier ayuda (y no, esto no es una tarea)

¿Fue útil?

Solución

atan (altura / longitud) no es suficiente para obtener el ángulo. Debe compensar cada cuadrante, así como la posibilidad de "división por cero". La mayoría de las bibliotecas de lenguaje de programación proporcionan un método llamado atan2 que toma dos argumentos; y y x . Este método hace este cálculo por usted.

Más información en Wikipedia: atan2

Otros consejos

Puede escapar sin calcular el ángulo. En su lugar, use el centro de su círculo (250,250) y la posición del mouse (xpos, ypos) para definir una línea. La línea intersecta su círculo cuando su longitud es igual al radio de su círculo:

// 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);

Simplemente verifique que el mouse no esté en el centro de su círculo, o line_len será cero y el mouse será absorbido por un agujero negro.

Hay un gran libro llamado " Gemas Gráficas " que puede ayudar con este tipo de problema Es un libro de cocina de algoritmos y código fuente (en C creo), y le permite resolver rápidamente un problema utilizando la funcionalidad probada. Recomiendo totalmente tenerlo en sus manos: me ahorró mucho tiempo cuando rápidamente necesitaba agregar código para realizar operaciones bastante complejas con normales a las superficies y detecciones de colisiones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top