2015-12-19 28 views
10

Wenn Sie einen Punkt (in 2D) hatten, wie könnten Sie diesen Punkt um Grad um den anderen Punkt (den Ursprung) in Python drehen?Punkt um einen anderen Punkt in Grad drehen python

Sie könnten zum Beispiel den ersten Punkt um den Ursprung um 10 Grad kippen.

Grundsätzlich haben Sie einen Punkt PointA und Ursprung, dass es rotiert. Der Code könnte wie folgt aussehen:

PointA=(200,300) 
origin=(100,100) 

NewPointA=rotate(origin,PointA,10) #The rotate function rotates it by 10 degrees 
+2

Dies ist in C++, aber ist genau die gleiche Frage https://stackoverflow.com/questions/2259476/rotating-a-point-about-another-point-2d – CoryKramer

+1

Bitte zeigen Sie Ihren Code. Es gibt keine Definition von "Punkt" in Python, also müssen Sie klären. – iled

+2

Die Drehung ist eine Codezeile. Aber: 2D oder 3D, wie definierst du deinen Punkt, wie definierst du deine Rotationswinkel (vor allem 3D) usw.? Dies ist eine Menge Kesselplatte, die sicherlich nicht Ihren Anwendungsfall entspricht, wenn wir es von Grund auf neu schreiben. – tom10

Antwort

21

Die folgende rotate Funktion eine Drehung des Punktes führt point durch den Winkel angle (gegen den Uhrzeigersinn, in Radiant) um origin, in der kartesischen Ebene, mit den üblichen Achse Konventionen : x von links nach rechts ansteigend, y vertikal nach oben ansteigend. Alle Punkte sind als Länge-2-Tupel der Form (x_coord, y_coord) dargestellt.

import math 

def rotate(origin, point, angle): 
    """ 
    Rotate a point counterclockwise by a given angle around a given origin. 

    The angle should be given in radians. 
    """ 
    ox, oy = origin 
    px, py = point 

    qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy) 
    qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy) 
    return qx, qy 

Wenn Ihr Winkel in Grad angegeben wird, können Sie es in Radiant umwandeln ersten math.radians verwenden. Für eine Drehung im Uhrzeigersinn negieren Sie den Winkel.

Beispiel: Drehen der Punkt (3, 4) um einen Ursprung der (2, 2) gegen den Uhrzeigersinn um einen Winkel von 10 Grad:

>>> point = (3, 4) 
>>> origin = (2, 2) 
>>> rotate(origin, point, math.radians(10)) 
(2.6375113976783475, 4.143263683691346) 

anzumerken, dass einige offensichtliche wiederholte Berechnung in der rotate Funktion gibt es: math.cos(angle) und math.sin(angle) werden jeweils zweimal berechnet werden, wie sind px - ox und py - oy. Ich überlasse es Ihnen, dies bei Bedarf zu berücksichtigen.

+0

das ist eine großartige Lösung. Was würde sich damit ändern, wenn Sie die Richtung der Y-Achse (y vertikal nach unten) transponieren möchten? Vielen Dank. – sosukeinu

+0

Ihr ist die einzige Lösung, die für mich gearbeitet hat und ich habe mehrere seit Tagen versucht. Du bist der Mann – Dantalian