Question

J'écris une fonction pour dessiner des poignées de l'interface utilisateur (faire pivoter, redimensionner et ainsi de suite) dans mon espace client dans une application Windows Forms. La fonction est appelée lorsqu'un objet est sélectionné.

L'appelant me envoie un objet graphique correctement tourné, mis à l'échelle et traduit pour entrer dans le cadre plus large des choses (l'objet sélectionné a sa propre rotation / translation / échelle et la poignée de l'interface utilisateur a une translation relative et la rotation wrt l'objet sélectionné ). Maintenant, je veux que mon gère l'interface utilisateur de la même taille quelle que soit l'échelle de la société mère (objet sélectionné).

Comment éliminer / réinitialiser le facteur d'échelle dans la matrice de transformation? Comment puis-je réinitialiser à une échelle de 1 tout en conservant la traduction précieux et les valeurs de rotation?

Était-ce utile?

La solution

Géométrie Anti-Grain utilise une méthode de base pour déterminer la mise à l'échelle d'une transformation (mise en œuvre trouve dans agg_trans_affine. cpp). Il le fait par:

  1. Calcul de la rotation de la transformation
  2. Duplication la transformation et l'application de la rotation opposé
  3. Transformer deux points connus et calculer l'échelle du résultat

Traduit en C #, cela ressemble à:

Matrix transform = (Matrix)graphics.Transform.Clone();

PointF[] rotationPoints = new PointF[] { new PointF(0, 0), new PointF(1, 0) };
transform.TransformPoints(rotationPoints);

double rotationRadians = Math.Atan2(rotationPoints[1].Y - rotationPoints[0].Y, rotationPoints[1].X - rotationPoints[0].X);
transform.Rotate((float)(-rotationRadians * (180.0 / Math.PI)));

PointF[] scalePoints = new PointF[] { new PointF(0, 0), new PointF(1, 1) };
transform.TransformPoints(scalePoints);

float xScale = scalePoints[1].X - scalePoints[0].X;
float yScale = scalePoints[1].Y - scalePoints[0].Y;

Le code AGG contient également un avertissement qu'il ya des cas dégénérés où cela ne fonctionnera pas correctement, mais il peut être utile pour votre situation.

Autres conseils

Vous devez savoir que l'ordre des transformations est important. Par conséquent, juste enlever l'échelle peut changer le « sens » des traductions suivantes (offset par exemple).

Peut-être juste garder une trace de l'échelle appliquée jusqu'à présent (Appelons cette currentscale) et ajouter une échelle de vos 1/currentscale Transformations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top