Wie ein Knoten entlang einer kreisförmigen Umlaufbahn um einen festen Mittelpunkt zu positionieren, basierend auf Mauskoordinaten (JavaFX)?

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

Frage

Im Versuch, in einige grundlegende JavaFX-Spiele-Entwicklung zu bekommen, und ich bin mit einigen Kreis Mathematik immer verwirrt.

Ich habe einen Kreis an (x: 250, y: 250). Mit einem Radius von 50

Mein Ziel ist es, einen kleineren Kreis zu machen auf dem Umfang des obigen Kreises wird auf der Grundlage der Position der Maus.

Wo Im verwirrt ist mit dem Koordinatenraum und dem Trig dahinter.

Meine Fragen kommen aus der Tatsache, dass der X / Y-Platz auf dem Bildschirm nicht bei 0,0 zentriert ist. Aber die oben links auf dem Bildschirm ist 0,0 und die rechte untere Ecke ist 500.500.

Meine Berechnungen sind:

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;

Ich habe die App aus dem Winkel drucken (angle_deg), die ich berechnet habe, wenn ich die Maus und meine Ausgabe bewege unter:

Wenn die Maus (in Grad bewegt gegen den Uhrzeigersinn):

  • direkt über dem Kreis und horizontal inline mit dem Zentrum, der Winkel -0
  • nach links und vertikal zentriert ist der Winkel -90
  • direkt den Kreis unten und horizontal inline mit dem Zentrum, der Winkel 0
  • nach rechts und vertikal zentriert, der Winkel 90

Also, was kann ich tun, um es 0, 90, 180, 270 ??

Ich weiß, es ist etwas klein sein muss, aber ich kann einfach nicht darüber nachdenken, was es ist ...

Danke für jede Hilfe (Und nein, das ist keine Zuordnung)

War es hilfreich?

Lösung

atan(height/length) ist nicht genug, um den Winkel zu erhalten. Sie müssen für jeden Quadranten, sowie die Möglichkeit der „Division durch Null“ kompensieren. Die meisten Programmiersprache Bibliotheken liefern eine Methode namens atan2, die zwei Argumente; y und x. Diese Methode funktioniert diese Berechnung für Sie.

Weitere Informationen über Wikipedia: atan2

Andere Tipps

Sie können weg, ohne den Winkel zu berechnen. Verwenden Sie stattdessen die Mitte des Kreises (250.250) und die Position der Maus (xpos, ypos) eine Linie zu definieren. Die Linie schneidet Ihren Kreis, wenn seine Länge auf den Radius des Kreises gleich:

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

überprüfen gerade, dass die Maus nicht in der Mitte des Kreises ist, oder die line_len wird gleich Null sein und die Maus in ein schwarzes Loch gesogen werden.

Es gibt ein großes Buch „Graphics Gems“ genannt dass helfen kann diese Art von Problem. Es ist ein Kochbuch von Algorithmen und Quellcode (in C glaube ich), und ermöglicht es Ihnen, schnell ein Problem zu lösen getestet Funktionalität verwenden. Ich würde sehr empfehlen, Ihre Hände auf sie bekommen -. Es hat mich gerettet große Zeit, wenn ich schnell Code hinzuzufügen benötigt ziemlich komplexe Operationen mit Normalen auf Oberflächen zu tun, und Kollisionserkennung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top