Come posizionare un nodo lungo un'orbita circolare attorno a un centro fisso basato sulle coordinate del mouse (JavaFX)?

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

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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top