2010-02-18 8 views
7

J'utilise des rectangles définis en fonction de leurs coordonnées x y et de leur largeur et hauteur. J'ai compris comment les faire pivoter en termes de coordonnées (x = cos(deg) * x - sin(deg) * yy = sin(deg) * x + cos(deg) * y) mais je suis coincé sur la hauteur et la largeur. Je suis sûr qu'il y a une solution évidente qui me manque. Si c'est important, j'utilise Python.Le moyen le plus simple de faire pivoter un rectangle

Nous sommes désolés pour la description confuse. Mon intention est d'inverser ou d'annuler la largeur et la hauteur, quel que soit l'angle. Par exemple, dans une rotation de 90 degrés, les valeurs changeraient. Dans une rotation de 180 degrés, la largeur serait négative. De plus, j'ai seulement l'intention d'utiliser des multiples de 90 dans mon script. Je pourrait juste utiliser if instructions, mais je supposais qu'il y aurait une méthode plus "élégante".

+0

Que voulez-vous dire par "coincé sur la hauteur et la largeur"? Qu'en est-il de la hauteur et de la largeur? Voulez-vous dire les coordonnées minimum et maximum X et Y? La rotation d'un rectangle ne change pas ses dimensions, donc vous ne le pensez probablement pas. –

+1

Soyez prudent - vous continuez à utiliser "deg" dans vos fonctions sinus et cosinus, mais le nombre que vous passez doit être radians. 180 deg = pi radians, où pi = 3.14159 .... – duffymo

+0

@duffymo ... ce qui me fait arriver à la conclusion que la syntaxe familière et la manière dont les degrés sont alimentés par des fonctions trigonométriques à l'intérieur de radians donnent l'impression qu'il utilise Python . Bon, je cherchais à l'implémenter en Python :) – Gustavo6046

Répondre

1

De la façon que vous décrivez en rotation que par 90 degrés, et la façon dont vous semblez définir la largeur et la hauteur, peut-être que vous cherchez quelque chose comme

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 

Je ne sais pas pourquoi vous voulez avoir des valeurs négatives pour la largeur et la hauteur, cependant .. car sinon, chaque rotation de 90 degrés ne fait qu'échanger la largeur et la hauteur, quel que soit le sens de rotation.

+0

Aucune raison particulière pour les valeurs négatives, sauf qu'il semblait plus simple et la bibliothèque que j'utilise cela avec des supports. – tankadillo

5

Il suffit de calculer quatre coins de votre rectangle:

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

et faites pivoter chacun par l'angle Vous voulez:

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

et retransformer à votre représentation rectangle:

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

dist calcule la distance entre deux points.

Editer: Pourquoi ne pas essayer formule d'application Vous avez écrit à (width, height) paire?

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

Il est facile de voir que si les valeurs deg == 90 basculeront:

x1 = -y 
y2 = x 

et si deg == 180 ils seront réduits à néant:

x1 = -x 
y2 = -y 

et ainsi de suite ... Je pense C'est ce que vous cherchez.

Edit2:

Ici est fonction de rotation rapide:

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

La bonne façon serait de recourir à des matrices de transformation. Aussi, à en juger par votre question, je suppose que vous voulez faire tourner par rapport à (x = 0, y = 0), sinon vous devrez en tenir compte et traduire d'abord votre rectangle au centre du plan (et puis traduisez-le lorsque la rotation est effectuée).

M = Matrice de traduire au centre R = Rotation Matrice

Transformation Matrice = M^(- 1) * R * M

Mais pour vous donner une réponse facile à votre question, juste Prenez les deux autres coins de votre rectangle et appliquez-y la même transformation.

Pour en savoir plus sur les matrices de transformation: http://en.wikipedia.org/wiki/Transformation_matrix

1

Rotation ne devrait pas changer width et height. Votre équation est correcte si vous voulez faire tourner (x, y) environ (0,0) par deg, mais notez que souvent les fonctions cos et sin attendent des arguments en radians plutôt qu'en degrés, vous devrez donc multiplier deg par pi/180 (radians par degré). Si vous avez besoin de trouver les emplacements des autres sommets rectangle après (x, y) après rotation, vous devez les stocker et les faire pivoter avec (x, y) ou conserver des informations sur l'orientation du rectangle (comme deg) de sorte que vous pouvez les recalculer comme par exemple x + largeur cos (deg), y + hauteur sin (deg).

Questions connexes