7
votes

Moyen le plus simple de faire pivoter un rectangle

J'utilise des rectangles définis en termes de coordonnées X Y et de largeur et de hauteur. J'ai compris comment les faire pivoter en termes de coordonnées ( x = cos (deg) * x - péché (deg) * y y = 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 cela importe, j'utilise Python.

edit désolé pour la description déroutante. Mon intention est d'obtenir la largeur et la hauteur inversée ou niée en raison de l'angle. Par exemple, dans une rotation de 90 degrés, les valeurs changent. Dans une rotation de 180 degrés, la largeur serait négative. En outre, je n'ai que l'intention d'utiliser des multiples de 90 dans mon script. Je pourrait utiliser si déclarations, mais j'ai supposé qu'il y aurait une méthode plus "élégante".


4 commentaires

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 minimales / maximales X et Y et Y? La rotation d'un rectangle ne change pas ses dimensions, donc vous ne voulez probablement pas dire cela.


Soyez prudent - vous continuez à utiliser "DEG" dans vos fonctions sinusoïdales et cosines, mais le nombre que vous avez adopté doit être des radians. 180 deg = PI Radians, où pi = 3.14159 ....


@duffymo ... ce qui me fait venir à la conclusion que la syntaxe familière et la manière dont les diplômes sont alimentés vers des fonctions trigonométriques intimes des radians le font ressembler à un python. Bon, je cherchais à mettre en œuvre cela à Python :)


Non, chaque langue que je connaisse utilise des radians pour les fonctions de Trig. Cela inclut le python.


4 Réponses :


5
votes

Calculez simplement quatre coins de votre rectangle: xxx pré>

et faire pivoter chaque angle que vous souhaitez: p> xxx pré>

et revenir à votre Représentation rectangle: p> xxx pré>

dist code> calcule la distance entre deux points. p>

edit: strong> pourquoi N'essayez pas d'appliquer une formule que vous avez écrite dans (largeur, hauteur) code> paire? p> xxx pré>

Il est facile de voir que si DEG == 90 code> Les valeurs commuteront: p>

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


0 commentaires

2
votes

La bonne voie serait de recourir à des matrices de transformation. Aussi, à en juger de votre question, je suppose que vous souhaitez faire pivoter à titre (x = 0, y = 0), mais sinon vous aurez besoin de prendre cela en compte et de traduire votre rectangle au centre du plan en premier (et puis traduisez-le lorsque la rotation est effectuée).

m = matrice à traduire au centre R = matrice de rotation

matrice de transformation = m ^ (- 1) * r * m

Mais pour vous donner une réponse facile à votre question, prenez simplement les deux autres coins de votre rectangle et appliquez la même transformation sur eux.

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


0 commentaires

1
votes

La rotation ne doit pas changer largeur et hauteur . Votre équation est correcte si vous souhaitez faire pivoter (x, y) environ (0,0) par deg , mais remarque que souvent cos et sin Fonctions Attendez-vous à des arguments dans les radians plutôt que de degrés, vous devrez peut-être devoir multiplier deg par PI / 180 (radians par degré).

Si vous devez trouver les emplacements d'autres sommets rectangés en plus (x, y) après rotation, vous devez les stocker et les faire pivoter avec (x, y) ou garder des informations sur l'orientation du rectangle (telle que DEG ) afin que vous puissiez les recompaliser comme par exemple x + largeur cos (DEG), y + hauteur sin (deg).


0 commentaires

1
votes

De la façon dont vous décrivez uniquement en rotation de 90 degrés, et votre façon de définir la largeur et la hauteur, peut-être que vous recherchez quelque chose comme xxx

Je ne sais pas pourquoi vous voulez avoir des valeurs négatives pour la largeur et la hauteur, bien que, sinon, chaque rotation de 90 degrés swaps efficacement la largeur et la hauteur, quelle que soit la manière que vous faites pivoter.


1 commentaires

Aucune raison particulière des valeurs négatives, autres que cela semblait la plus simple et la bibliothèque que j'utilise avec des supports.