web-dev-qa-db-fra.com

Faire pivoter un point sur un autre point en degrés python

Si vous aviez un point (en 2d), comment pourriez-vous faire pivoter ce point par degrés autour de l'autre point (l'origine) en python?

Vous pouvez, par exemple, incliner le premier point autour de l'origine de 10 degrés.

En gros, vous avez un point, PointA et Origin, autour duquel il tourne ... Le code pourrait ressembler à ceci:

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

NewPointA=rotate(Origin,PointA,10) #The rotate function rotates it by 10 degrees
18
user2592835

La fonction rotate suivante effectue une rotation du point point de l'angle angle (dans le sens inverse des aiguilles d'une montre, en radians) autour de Origin, dans le plan cartésien, avec les conventions d'axe habituelles: x croissant de gauche à droite, y croissant verticalement vers le haut. Tous les points sont représentés par des tuples de longueur 2 de la forme (x_coord, y_coord).

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

Si votre angle est spécifié en degrés, vous pouvez d'abord le convertir en radians à l'aide de math.radians. Pour une rotation dans le sens des aiguilles d'une montre, annulez l'angle.

Exemple: faire pivoter le point (3, 4) autour d'une origine de (2, 2) dans le sens antihoraire d'un angle de 10 degrés:

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

Notez qu'il existe des calculs répétés évidents dans la fonction rotate: math.cos(angle) et math.sin(angle) sont calculés deux fois, de même que px - ox et py - oy. Je vous laisse le soin d’en tenir compte si nécessaire.

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