2010-02-18 12 views
7

Sto usando i rettangoli definiti in termini delle loro coordinate x y della loro larghezza e altezza. Ho capito come ruotarli in termini di coordinate (x = cos(deg) * x - sin(deg) * yy = sin(deg) * x + cos(deg) * y) ma sono bloccato sull'altezza e la larghezza. Sono sicuro che ci sia una soluzione ovvia che mi manca. Se è importante, sto usando Python.Il modo più semplice per ruotare un rettangolo

modifica Ci scusiamo per la descrizione confusa. La mia intenzione è di ottenere la larghezza e l'altezza invertita o negata a causa di qualunque sia l'angolo. Ad esempio, in una rotazione di 90 gradi i valori cambieranno. In una rotazione di 180 gradi, la larghezza sarebbe negativa. Inoltre, ho intenzione di usare solo multipli di 90 nella mia sceneggiatura. I potrebbe solo utilizzare le istruzioni if, ma ho pensato che ci sarebbe stato un metodo più "elegante".

+0

Cosa intendi per "bloccato su altezza e larghezza"? Che dire dell'altezza e della larghezza? Intendi le coordinate X/Y minime/massime? Ruotare un rettangolo non cambia le sue dimensioni, quindi probabilmente non lo intendi. –

+1

Fai attenzione: continui a utilizzare "deg" nelle funzioni seno e coseno, ma il numero che inserisci deve essere in radianti. 180 gradi = pi radianti, dove pi = 3.14159 .... – duffymo

+0

@duffymo ... che mi fa arrivare alla conclusione che la sintassi familiare e il modo in cui i gradi sono alimentati alle funzioni trigonometriche di radianti fa sembrare che stia usando Python . Bene, stavo cercando di implementarlo in Python :) – Gustavo6046

risposta

1

Dal modo in cui si descrivono solo la rotazione di 90 gradi, e il modo in cui ti sembra di essere la definizione di larghezza e altezza, forse siete alla ricerca di qualcosa di simile

direction = 1  // counter-clockwise degrees 
// or 
direction = -1 // clockwise 90 degrees 

new_height = width * direction 
new_width = -height * direction 
width = new_width 
height = new_height 

Non certo perché si vuole avere valori negativi per larghezza e altezza, però .. perché altrimenti ogni rotazione di 90 gradi scambia semplicemente larghezza e altezza, indipendentemente dal modo in cui si ruota.

+0

Nessun motivo particolare per i valori negativi, diverso da quello che sembrava più semplice e la libreria che sto usando con questo supporta. – tankadillo

5

Basta calcolare quattro angoli del rettangolo:

p1 = (x, y) 
p2 = (x + w, y) 
p3 = (x, y + h) 

e ruotare ogni dall'angolo Volete:

p1 = rotate(p1, angle) 
# and so on... 

e trasformare di nuovo alla tua rappresentazione rettangolo:

x, y = p1 
w = dist(p1, p2) # the same as before rotation 
h = dist(p1, p3) 

dove dist calcola la distanza tra due punti.

Modifica: Perché non provi a applicare la formula Hai scritto a (width, height) coppia?

x1 = cos(deg) * x - sin(deg) * y 
y2 = sin(deg) * x + cos(deg) * y 

E 'facile vedere che se deg == 90 i valori saranno passare:

x1 = -y 
y2 = x 

e se deg == 180 saranno negati:

x1 = -x 
y2 = -y 

e così via ... penso Questo e ciò che stai cercando.

Edit2:

Ecco funzione di rotazione veloce:

def rotate_left_by_90(times, x, y): 
    return [(x, y), (-y, x), (-x, -y), (y, -x)][times % 4] 
1

Il modo corretto sarebbe ricorrere a matrici di trasformazione. Inoltre, a giudicare dalla tua domanda suppongo che tu voglia ruotare rispetto a (x = 0, y = 0), ma se non lo farai dovrai tenerne conto e tradurre prima il tuo rettangolo al centro del piano (e quindi tradurlo indietro quando viene eseguita la rotazione).

M = Matrix da tradurre al centro R = rotazione Matrix

trasformazione di matrice = M^(- 1) * R * M

Ma per dare una risposta facile alla tua domanda, basta prendi gli altri due angoli del tuo rettangolo e applica la stessa trasformazione su di essi.

Per ulteriori informazioni su matrici di trasformazione: http://en.wikipedia.org/wiki/Transformation_matrix

1

rotazione non dovrebbe cambiare width e height. L'equazione è corretta se si desidera ruotare (x, y) circa (0,0) per deg, ma si noti che spesso le funzioni cos e sin prevedono argomenti in radianti anziché in gradi, quindi potrebbe essere necessario moltiplicare deg per pi/180 (radianti per grado).

Se è necessario trovare le posizioni degli altri vertici del rettangolo oltre (x, y) dopo la rotazione, è necessario memorizzarli e ruotarli insieme a (x, y) o mantenere alcune informazioni sull'orientamento del rettangolo (come deg) così puoi ricalcolarli come per es x + larghezza cos (deg), y + altezza sin (deg).

Problemi correlati