La seguente funzione rotate
esegui una rotazione del punto point
dall'angolo angle
(in senso antiorario, in radianti) intorno origin
, nel piano cartesiano, con le solite convenzioni asse : x crescente da sinistra a destra, y crescente verticalmente verso l'alto. Tutti i punti sono rappresentati come tuple di lunghezza 2 del modulo (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
Se il vostro angolo viene specificato in gradi, è possibile convertirlo in radianti primo utilizzo math.radians
. Per una rotazione in senso orario, annullare l'angolo.
Esempio: ruotando il punto (3, 4)
intorno un'origine di (2, 2)
antiorario di un angolo di 10 gradi:
>>> point = (3, 4)
>>> origin = (2, 2)
>>> rotate(origin, point, math.radians(10))
(2.6375113976783475, 4.143263683691346)
Nota che c'è qualche evidente calcolo ripetuto nella funzione rotate
: math.cos(angle)
e math.sin(angle)
sono ciascuno calcolato due volte, così come lo sono px - ox
e py - oy
. Lascio a te di farlo notare, se necessario.
fonte
2015-12-19 19:18:10
Questo è in C++ ma è esattamente la stessa domanda https://stackoverflow.com/questions/2259476/rotating-a-point-about-another-point-2d – CoryKramer
Si prega di mostrare il codice. Non esiste una definizione di 'point' in Python, quindi è necessario chiarire. – iled
La rotazione è una riga di codice. Ma: 2D o 3D, come definisci il tuo punto, come definisci i tuoi angoli di rotazione (specialmente se 3D), ecc.? Si tratta di un gran numero di piastre per la caldaia che sicuramente non corrisponderanno al caso d'uso se lo scriviamo da zero. – tom10