Comment positionner un nœud sur une orbite circulaire autour d'un centre fixe en fonction des coordonnées de la souris (JavaFX)?

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

Question

J'essaie d'entrer dans le développement de base de jeux JavaFX et je suis confus avec un calcul mathématique circulaire.

J'ai un cercle à (x: 250, y: 250) avec un rayon de 50.

Mon objectif est de créer un cercle plus petit sur la circonférence du cercle ci-dessus en fonction de la position de la souris.

Là où je suis confus, c’est avec l’espace de coordonnées et le déclencheur derrière tout cela.

Mes problèmes viennent du fait que l’espace X / Y à l’écran n’est pas centré à 0,0. Mais le coin supérieur gauche de l'écran est 0,0 et le coin inférieur droit 500 500.

Mes calculs sont les suivants:

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;

J'ai fait en sorte que l'application imprime l'angle (angle_deg) que j'ai calculé lorsque je déplace la souris et que mon résultat est ci-dessous:

Lorsque la souris est (en degrés dans le sens contraire des aiguilles d'une montre):

  • directement au-dessus du cercle et aligné horizontalement avec le centre, l'angle est -0
  • à gauche et centré verticalement, l'angle est égal à -90
  • directement sous le cercle et aligné horizontalement avec le centre, l'angle est égal à 0
  • à droite et verticalement centré, l'angle est 90

Alors, que puis-je faire pour en faire 0, 90, 180, 270 ??

Je sais que ça doit être quelque chose de petit, mais je n'arrive pas à penser à ce que c'est ...

Merci pour toute aide (et non, ce n'est pas une mission)

Était-ce utile?

La solution

atan (hauteur / longueur) n'est pas suffisant pour obtenir l'angle. Vous devez compenser pour chaque quadrant, ainsi que la possibilité de "division par zéro". La plupart des bibliothèques de langages de programmation fournissent une méthode appelée atan2 qui prend deux arguments; y et x . Cette méthode effectue ce calcul pour vous.

Plus d'informations sur Wikipedia: atan2

Autres conseils

Vous pouvez vous en sortir sans calculer l'angle. A la place, utilisez le centre de votre cercle (250 250) et la position de la souris (xpos, ypos) pour définir une ligne. La ligne coupe votre cercle lorsque sa longueur est égale au rayon de votre cercle:

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

Vérifiez que la souris n'est pas au centre de votre cercle, sinon le line_len sera égal à zéro et la souris sera aspirée dans un trou noir.

Il existe un excellent livre intitulé "Graphics Gems & " pouvant vous aider. avec ce genre de problème. C'est un livre de recettes d'algorithmes et de code source (en C, je pense), et vous permet de résoudre rapidement un problème en utilisant des fonctionnalités testées. Je recommanderais tout à fait de mettre la main dessus. Cela m’a fait gagner beaucoup de temps lorsque j’ai rapidement eu besoin d’ajouter du code pour effectuer des opérations assez complexes avec des normales aux surfaces et la détection des collisions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top