2014-09-19 127 views
11

Ich versuche herauszufinden, wie ich Koordinaten auf einem Kreis berechnen könnte. Zur Vereinfachung habe ich ein paar Bilder gemacht.Wie berechne ich die Position auf einem Kreis mit einem bestimmten Winkel?

http://i.stack.imgur.com/y1F2y.png

, dass der Start mit Informationen ist ich habe. Jetzt muss ich die neuen Koordinaten berechnen, wenn sich der Kreis zum Beispiel um 90 Grad nach rechts dreht. Genau wie das nächste Bild:

http://i.stack.imgur.com/ckopK.png

muss ich die Koordinaten des neuen roten Punkt berechnen. (Ich brauche das auch mit verschiedenen Graden wie 20 Grad).

diesen meinen Plan zu tun war, folgendes zu tun:

  • Berechnen Sie den Abstand zwischen den beiden Punkten
  • Berechnen Sie den Grad zwischen dem Norden (oben) und dem gegebenen Punkt
  • Berechnen Sie den neuen Ort mit dem Grad (von einem Schritt zurück) + die Grad, die es drehen muss (in den Bildern 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)) 

Der Teil der neuen Grad zu berechnen ist:

double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x); 
theta += Math.PI/2.0; 

Und der letzte Teil der neuen Position zu berechnen wäre:

double x = mMiddleView.getX() + distance * Math.cos(Math.toRadians(theta)); 
double y = mMiddleView.getY() + distance * Math.sin(Math.toRadians(theta)); 

Allerdings wenn ich diese Berechnungen mit zum Beispiel mache 0 Grad gibt es immer noch einen anderen Wert als die ursprünglichen Koordinaten.

Jede Hilfe wäre willkommen!

Edit 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, so ist der Punkt nicht sollte sich drehen. Es sollte die 490, 728 Koordinaten behalten, aber es behält diese nicht.

+3

Warum können Sie nicht die ganze Zeit in Polarkoordinaten arbeiten? Nur für die Anzeigestufe in Kartesisch konvertieren. – Bathsheba

+0

Ansonsten könnte dieser Link Ihnen helfen: http://en.wikipedia.org/wiki/Rotation_matrix – Bathsheba

+0

Sie verwenden 'x' und' y' das gleiche. Achten Sie darauf, dass 'x' nach rechts ansteigt, während' y' nach unten ansteigt, so dass Ihr 'targetPt.y - centerPt.y' Teil das Gegenteil von – Eypros

Antwort

14

Das ist, wie:

private PointF getPosition(PointF center, float radius, float angle) { 

    PointF p = new PointF((float) (center.x + radius * Math.cos(Math.toRadians(angle))), 
    (float) (center.y + radius* Math.sin(Math.toRadians(angle)))); 

    return p; 
} 

Diese Methode die Position um das Zentrum eines Kreises (Mitte Ihrer Ansicht), je nach Radius und Winkel berechnet. Winkel in Grad.

Der zurückgegebene PointF enthält die x- und y-Koordinate der berechneten Position.

Beachten Sie, dass 0 Grad an der östlichsten Position des Kreises ist, beträgt 270 Grad im äußersten Norden Lage des Kreises:

enter image description here

Also, wenn das Zentrum Ihrer Ansicht bei x: 100, y: 100 und berechnen Sie die Position mit einem Winkel von 0 Grad und einem Radius von 50, das Ergebnis wird x sein: 150, y: 100

Wenn Sie Winkel 90 Grad und Radius 50 verwenden, Das Ergebnis ist x: 100, y: 150

Es ist here in meiner Charting-Bibliothek verwendet, und es funktioniert.

+0

Ich versuchte dies, aber stieß auf ein Problem. Ich setze meine Werte in den oberen Post, weil ich keinen Code in die Kommentare schreiben kann. – Marc

+0

Sehen Sie sich mein Update an. 0 Grad ist im Osten des Kreises. Also ist deine Berechnung korrekt. –

+0

Haben Sie Ihr Problem gelöst? –

0

Dies braucht etwas Mathematik hier. Sie müssen wissen, ob zwei Linien senkrecht zueinander stehen. Die Multiplikation dieser zwei Linien Gradienten sollte gleich -1 sein.

Dann

m1=(770-500)/(540-400)=27/14 

gleiche Weise

m2=(y-770)/(x-540) 

(x,y) ist der Punkt, den Sie finden möchten. Jetzt

m1*m2=-1 

Jetzt haben wir eine Gleichung. Sie benötigen eine andere, da zwei Variablen benötigt werden, um

zu finden. Sie können eine andere erhalten, indem Sie den Radius des Kreises berücksichtigen.

r=sqrt((540-400)^2+(770-500)^2) 

gleiche Weise

r=sqrl((x-540)^2+(y-770)^2) 

Jetzt haben Sie zwei Gleichung und braucht nur zu lösen. Dadurch erhalten Sie zwei Koordinaten. Da kann es -90 und 90 Grad sein.

0

Ein eleganter Weg, um dies zu erreichen, ist die Verwendung komplexer Zahlen, zum Beispiel here.

In Pseudo-Code:

z = (x_old + I*y_old)*exp(I*angle); 
x_new = real(z); 
y_new = imag(z); 

HINWEIS: die Rotation angle in Radiant sein muss. HINWEIS2: Dies setzt einen Kreis um (0,0) voraus. Fügen Sie einfach eine Verschiebung hinzu, wenn das Zentrum nicht vorhanden ist.

Verwandte Themen