web-dev-qa-db-de.com

Punkt um einen anderen Punkt in Grad Python drehen

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
18
user2592835

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.

38
Mark Dickinson
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]
2
Gabriel Eng