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.
Dies ist in C++, aber ist genau die gleiche Frage https://stackoverflow.com/questions/2259476/rotating-a-point-about-another-point-2d – CoryKramer
Bitte zeigen Sie Ihren Code. Es gibt keine Definition von "Punkt" in Python, also müssen Sie klären. – iled
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