Come posizionare un nodo lungo un'orbita circolare attorno a un centro fisso basato sulle coordinate del mouse (JavaFX)?
-
06-07-2019 - |
Domanda
Sto cercando di entrare in qualche sviluppo di base del gioco JavaFX e mi sto confondendo con alcuni circoli matematici.
Ho un cerchio in (x: 250, y: 250) con un raggio di 50.
Il mio obiettivo è creare un cerchio più piccolo da posizionare sulla circonferenza del cerchio sopra in base alla posizione del mouse.
Dove mi sto confondendo è con lo spazio delle coordinate e il Trig dietro tutto.
I miei problemi derivano dal fatto che lo spazio X / Y sullo schermo non è centrato su 0,0. Ma la parte superiore sinistra dello schermo è 0,0 e la parte inferiore destra è 500.500.
I miei calcoli sono:
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;
Ho fatto in modo che l'app stampasse l'angolo (angle_deg) che ho calcolato spostando il mouse e il mio output è inferiore:
Quando il mouse si sposta (in gradi in senso antiorario):
- direttamente sopra il cerchio e in linea orizzontale con il centro, l'angolo è -0
- a sinistra e centrato verticalmente, l'angolo è -90
- direttamente sotto il cerchio e in linea orizzontale con il centro, l'angolo è 0
- a destra e centrato verticalmente, l'angolo è 90
Quindi, cosa posso fare per renderlo 0, 90, 180, 270 ??
So che deve essere qualcosa di piccolo, ma non riesco a pensare a cosa sia ...
Grazie per l'aiuto (e no, questo non è un compito)
Soluzione
atan (altezza / lunghezza)
non è sufficiente per ottenere l'angolo. È necessario compensare ciascun quadrante, nonché la possibilità di "divisione per zero". La maggior parte delle librerie di linguaggi di programmazione fornisce un metodo chiamato atan2
che accetta due argomenti; y
e x
. Questo metodo esegue questo calcolo per te.
Ulteriori informazioni su Wikipedia: atan2
Altri suggerimenti
Puoi scappare senza calcolare l'angolo. Invece, usa il centro del cerchio (250.250) e la posizione del mouse (xpos, ypos) per definire una linea. La linea interseca il tuo cerchio quando la sua lunghezza è uguale al raggio del tuo cerchio:
// 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);
Verifica solo che il mouse non sia al centro del tuo cerchio o che line_len sarà zero e che il mouse verrà risucchiato in un buco nero.
C'è un un grande libro chiamato " Gemme grafiche " che può aiutarti con questo tipo di problema. È un ricettario di algoritmi e codice sorgente (in C credo) e ti consente di risolvere rapidamente un problema utilizzando la funzionalità testata. Consiglio vivamente di mettere le mani su di esso - mi ha fatto risparmiare un sacco di tempo quando avevo rapidamente bisogno di aggiungere codice per fare operazioni abbastanza complesse con normali alle superfici e rilevamenti di collisioni.