2015-12-19 17 views
10

Se hai un punto (in 2D), come potresti ruotare quel punto di gradi attorno all'altro punto (l'origine) in python?Ruota il punto su un altro punto in gradi python

È possibile, ad esempio, inclinare il primo punto intorno all'origine di 10 gradi.

Fondamentalmente si dispone di un punto PuntoA e origine su cui ruota. Il codice potrebbe essere simile a questo:

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

NewPointA=rotate(origin,PointA,10) #The rotate function rotates it by 10 degrees 
+2

Questo è in C++ ma è esattamente la stessa domanda https://stackoverflow.com/questions/2259476/rotating-a-point-about-another-point-2d – CoryKramer

+1

Si prega di mostrare il codice. Non esiste una definizione di 'point' in Python, quindi è necessario chiarire. – iled

+2

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

risposta

21

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.

+0

questa è un'ottima soluzione. Cosa cambierebbe con questo se volessimo trasporre la direzione dell'asse Y (y crescente verticalmente verso il basso)? Grazie. – sosukeinu

+0

La tua è l'unica soluzione che ha funzionato per me e ho provato diversi giorni. Tu sei l'uomo – Dantalian