Wenn Sie einen Punkt (in 2d) hätten, wie könnten Sie diesen Punkt in Python um den anderen Punkt (den Ursprung) drehen?
Sie könnten beispielsweise den ersten Punkt um 10 Grad um den Ursprung kippen.
Im Grunde haben Sie einen Punkt PointA und Origin, um den er sich dreht. Der Code könnte ungefähr so aussehen:
PointA=(200,300)
Origin=(100,100)
NewPointA=rotate(Origin,PointA,10) #The rotate function rotates it by 10 degrees
Die folgende rotate
-Funktion führt eine Drehung des Punktes point
um den Winkel angle
(gegen den Uhrzeigersinn, im Bogenmaß) um Origin
in der kartesischen Ebene aus, wobei die üblichen Achsenkonventionen gelten: x von links nach rechts, y vertikal nach oben. Alle Punkte werden 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 ihn zuerst mit math.radians
in Radiant konvertieren. Negieren Sie den Winkel für eine Drehung im Uhrzeigersinn.
Beispiel: Den Punkt (3, 4)
um einen Ursprung von (2, 2)
um einen Winkel von 10 Grad gegen den Uhrzeigersinn drehen:
>>> point = (3, 4)
>>> Origin = (2, 2)
>>> rotate(Origin, point, math.radians(10))
(2.6375113976783475, 4.143263683691346)
Beachten Sie, dass es in der rotate
-Funktion einige offensichtliche wiederholte Berechnungen gibt: math.cos(angle)
und math.sin(angle)
werden jeweils doppelt berechnet, ebenso wie px - ox
und py - oy
. Ich überlasse es Ihnen, wenn nötig herauszufiltern.
import math
def rotate(x,y,xo,yo,theta): #rotate x,y around xo,yo by theta (rad)
xr=math.cos(theta)*(x-xo)-math.sin(theta)*(y-yo) + xo
yr=math.sin(theta)*(x-xo)+math.cos(theta)*(y-yo) + yo
return [xr,yr]