2010-01-13 8 views
2

Je dois être en mesure de faire pivoter une image autour d'un point donné afin que toute partie de l'image apparaissant au centre de mon conteneur soit le centre de rotation.Calcul du centre de rotation après la translation

Pour calculer les points centraux, je suis actuellement juste prenant l'inverse de la traduction appliquée à l'image:

Rotate.CenterX = Translate.X * -1; 
Rotate.CenterY = Translate.Y * -1; 

Cependant, le calcul actuel j'utilise ne suffit pas car il ne fonctionne pas si l'image a été traduite après en cours de rotation.

Je suis sûr que c'est une fonction trigonométrique assez simple, je ne peux pas penser à ce que c'est!

Vive

+2

Nous avons besoin d'un peu plus d'informations. Comment faites-vous les transformations? Comment votre système de coordonnées se rapporte-t-il à la position de l'image? –

+0

J'utilise les fonctions WPF Transform intégrées pour gérer mes transformations. Fondamentalement, j'ai un TransformGroup qui contient un TranslateTransform, RotateTransform et ScaleTransform (ajouté dans cet ordre). Chacun d'entre eux est mis à jour chaque fois qu'une transition a lieu plutôt que d'ajouter plus de transformations. Jusqu'à présent, j'ai réussi à éviter de faire quoi que ce soit en coordonnées en plus de capturer la position de la souris ici et là ... J'espère que cela aide! –

Répondre

1

Si vous travaillez avec GDI + puis utilisez les touches suivantes:

double ImWidth = (double)Im.Width; 
double ImHeight = (double)Im.Height; 
double XTrans = -(ImWidth * X); 
double YTrans = -(ImHeight * Y); 

g.TranslateTransform((float)XTrans, (float)YTrans);  
g.TranslateTransform((float)(ImWidth/2.0 - XTrans), (float)(ImHeight/2.0 - YTrans)); 
g.RotateTransform((float)Angle); 
g.TranslateTransform(-((float)(ImWidth/2.0 - XTrans)), -((float)(ImHeight/2.0 - YTrans))); 

Si vous travaillez avec WPF objets graphiques, utilisez le groupe transformation suivante:

TransformGroup TC = new TransformGroup(); 
RotateTransform RT = new RotateTransform(Angle); 
RT.CenterX = Im.Width/2.0; 
RT.CenterY = Im.Height/2.0; 
TranslateTransform TT = new TranslateTransform(-X * Im.PixelWidth, -Y * Im.PixelHeight); 
TC.Children.Add(TT); 
TC.Children.Add(RT); 

X & Y sont les valeurs en pourcentage dans lesquelles vous souhaitez traduire l'image (si l'image est de 1000 pixels et X est 0,1 alors l'image sera traduite 100 pixels). C'est ainsi que j'ai eu besoin de la fonction pour fonctionner mais vous pouvez facilement la changer autrement.

+0

Merci pour votre réponse! Le problème que j'avais était en grande partie dû à la façon dont je traitais les Transforms individuels (j'ai ajouté un de chaque, puis les ai modifiés plutôt que d'accumuler plusieurs Transforms). Je ne suis pas encore là, mais je suis plus proche maintenant et avec beaucoup moins de code! –

Questions connexes