Wie berechne ich die position auf einen Kreis mit einem bestimmten Winkel?
Ich versuche herauszufinden, wie ich könnte in der Lage sein, um die Berechnung der Koordinaten auf einem Kreis. Für Einfachheit habe ich ein paar Bilder.
Beginnt mit Informationen, die ich habe. Jetzt brauche ich für die Ermittlung der neuen Koordinaten, wenn zum Beispiel der Kreis würde dann 90 Grad nach rechts. Genau wie das nächste Bild:
Brauche ich zur Berechnung der Koordinaten des neuen red dot. (Ich brauche auch diesen mit unterschiedlichen Grad wie 20 Grad).
Dazu mein plan war der folgende:
- Berechnen Sie die Entfernung zwischen den beiden Punkten
- Berechnen den Grad zwischen der Nord - (oben) und den gegebenen Punkt
- Berechnen Sie die neue Position mit der Grad (von einem Schritt zurück) + Grad, die es braucht, um (in die Bilder um 90 Grad).
Mein Erster Schritt ist:
distance = Math.sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y))
Den Teil zur Berechnung der neuen Abschlüsse ist:
double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x);
theta += Math.PI/2.0;
Und der Letzte Teil zum berechnen der neuen Position wäre:
double x = mMiddleView.getX() + distance * Math.cos(Math.toRadians(theta));
double y = mMiddleView.getY() + distance * Math.sin(Math.toRadians(theta));
Jedoch wenn ich diese Berechnungen mit zum Beispiel 0 Grad, die es noch gibt einen anderen Wert als den ursprünglichen Koordinaten.
Jede mögliche Hilfe würde geschätzt!
Bearbeiten für Philipp Jahoda:
Meine Werte sind:
distance +- 70, currentDegree = 0.
PointF point = new PointF((float)mMiddleView.getX(), (float)mMiddleView.getY());
PointF point2 = getPosition(point, (float) distance, currentDegree);
und meine Ergebnisse sind:
center: PointF(490.0, 728.0) radius: 78.0 angle: 0.0
new point: PointF(568.0, 728.0)
Wie Sie sehen können, ist der Grad 0 ist also der Punkt ist eigentlich nicht zu drehen. Es sollte halten die 490, 728 Koordinaten aber nicht halten die.
- Warum kann man nicht die Arbeit in Polarkoordinaten die ganze Zeit? Konvertieren kartesischen nur für die Anzeige der Bühne.
- Ansonsten, dieser link könnte dir helfen: en.wikipedia.org/wiki/Rotation_matrix
- Sie sind mit
x
undy
die gleichen. Seien Sie vorsichtig, dassx
steigt nach rechts, währendy
steigt nach unten, so dass IhretargetPt.y - centerPt.y
Teil sein sollte, das Gegenteil unter anderem - Ein weiteres Problem ist
theta += Math.PI/2.0;
dass dieser Teil dreht sich in die entgegengesetzte Richtung, die in Ihrem Bild. Verwendentheta -= Math.PI/2.0;
statt
Du musst angemeldet sein, um einen Kommentar abzugeben.
So:
Diese Methode berechnet die position um das Zentrum eines Kreises (Mittelpunkt Ihrer Sicht) abhängig von radius und Winkel. Winkel in Grad.
Den zurückgegebenen
PointF
enthalten die x - und y-Koordinate der berechneten position.Sich bewusst sein, dass die 0-Grad-ist der Osten die position des Kreises, 270 Grad, ganz im Norden position des Kreises:
Also, wenn der Mittelpunkt Ihrer Ansicht ist bei x: 100, y: 100 und berechnen Sie die position mit einem Winkel von 0 Grad und einem radius von 50, wird das Ergebnis x: 150, y: 100
Wenn Sie Winkel von 90 Grad und radius 50, wird das Ergebnis x: 100, y: 150
Es wird verwendet, hier in meinem charting-Bibliothek, und es funktioniert.
Diese brauchen ein bisschen Mathematik hier. Sie müssen wissen, wenn zwei Linien senkrecht zueinander sind, wird Die Multiplikation dieser beiden Linien Verlauf sollte gleich
-1
.Dann
gleiche Weise
(x,y)
ist der Punkt, den Sie möchten, zu finden.Nun
Nun haben wir eine Gleichung. Sie brauchen ein anderes, da gibt es zwei Variablen zu finden, braucht
Können Sie andere bekommen, indem man den radius des Kreises.
Gleiche Weise
Nun hast du zwei Gleichung und muss diese nur noch lösen. Dadurch erhalten Sie zwei Satz von Koordinaten. Da kann es
-90
und90
Grad.Einen eleganten Weg dies zu tun ist mit Hilfe von komplexen zahlen, z.B. hier.
In pseudo-code:
HINWEIS: die Drehung
angle
muss im Bogenmaß angegeben werden.ANMERKUNG 2: dies setzt Voraus, einen Kreis, zentriert auf (0,0). Fügen Sie einfach eine Schicht an, wenn der center ist nicht da.