2010-01-26 9 views
2

J'ajoute la "rotation de la souris" à mon programme de dessin 2D. J'ai tout le code qui fonctionne, en calculant fondamentalement l'angle de rotation du clic original de la souris à l'endroit où se trouve la souris.Rotation d'image 2D, quelques problèmes

Je dessine également un rectangle transparent qui tourne, au lieu de faire tourner l'image sur chaque mouvement de souris.

Maintenant, mon problème est le dessin de ce rectangle. Je dessine le rectangle à partir de la position x/y de l'image, sa largeur/hauteur étant ce que l'image rapporte.

Cependant, après la rotation d'une image rectangulaire, sa nouvelle largeur et la hauteur est beaucoup plus grande, car ces deux captures d'écran devraient aider à clarifier: During rotation et after rotating then rotating again - le petit « poignées » montrer où les images' x/y/width/height extends to

Dans la deuxième capture d'écran, en raison de la rotation, l'image a été complétée, en quelque sorte avec des espaces (difficile à décrire avec du texte!). Par exemple. une image de 200x100 peut finir comme 150x150 (environ) après la rotation, ce qui semble un peu étrange lors du redimensionnement de la 2ème fois.

Est-ce que quelqu'un a une idée pour résoudre ce problème?

Répondre

3

En règle générale, ne jamais tourner/redimensionner une image précédemment tourné que les petites erreurs commencera en rampant.

En général, il est plus facile de conserver une copie de l'image originale et la base toutes les modifications ce image.

Par exemple, la première rotation est de 5 degrés. La deuxième rotation est de 15 degrés. Pour rendre la deuxième image, faites pivoter la copie originale de 20 degrés et affichez-la.

Je ne sais pas si cela aide ou si j'ai mal lu votre question.

+0

Salut, merci, je pensais que c'était la façon de le faire. Je garde une image originale, et baser toute mise à l'échelle/rotation de cela. Ce qui conduit à un autre problème ... J'ai aussi du code pour la mise à l'échelle, mais je ne suis pas sûr de savoir comment l'incorporer avec le code de rotation. Chaque classe Image conserve les variables de rotation/d'échelle des instances, mais dois-je faire une rotation ou une remise à l'échelle en premier? –

+0

Un autre problème est que j'utilise essentiellement le code de rotation d'image de wxWidgets - et mes "poignées de rééchelonnement" aux coins de l'image sont tirées des valeurs renvoyées par GetWidth/Height. Devrais-je maintenant suivre le rectangle (contour) x/y/largeur/hauteur après la rotation, et utiliser ces valeurs pour déterminer le positionnement de la poignée? –

+1

Peu importe que vous effectuiez une rotation ou une mise à l'échelle en premier, si la mise à l'échelle est uniforme et si le centre de mise à l'échelle et de rotation est le même. Cependant, si vous étirez X et Y à des rapports différents, ou si la mise à l'échelle a une origine différente de la rotation, alors l'ordre est important – comingstorm

0

Vous devriez probablement garder une trace de la rotation actuelle de l'image, de sorte que vous puissiez redessiner le rectangle autour de l'image à sa rotation actuelle. Si vous devez faire pivoter plus d'une chose, vous devrez suivre les calques et la rotation de chacun.

0

Vous devez stocker les dimensions d'origine de l'image et l'angle de rotation actuel afin de pouvoir annuler les rotations correctement. En outre, vous devrez enregistrer les données d'image d'origine.

Ce qui se passe maintenant, c'est que votre programme perd l'information sur la taille de l'image d'origine, donc il utilise ce qu'il voit (correctement). Ce que vous voulez, c'est un nouveau rafraîchissement à partir des données d'image originales, juste avec une rotation différente.