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
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.
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]