Mise à l'échelle, de la Traduction d'une Forme d'un Rectangle à l'aide de AffineTransform
Je suis en train de l'échelle/traduire un java.awt.Forme avec AffineTransform afin de dessiner dans un Rectangle de délimitation.
En outre, je veux le peindre dans une Zone de dessin ayant une " zoom paramètre.
J'ai essayé divers enchaînements de AffineTransform mais je ne pouvais pas trouver la bonne séquence. Par exemple, la solution suivante a été mauvais:
double zoom=(...);/* current zoom */
Rectangle2D viewRect=(...)/** the rectangle where we want to paint the shape */
Shape shape=(...)/* the original shape that should fit in the rectangle viewRect */
Rectangle2D bounds=shape.getBounds2D();
double ratioW=(viewRect.getWidth()/bounds.getWidth());
double ratioH=(viewRect.getHeight()/bounds.getHeight());
AffineTransform transforms[]=
{
AffineTransform.getScaleInstance(zoom, zoom),
AffineTransform.getTranslateInstance(-bounds.getX(),-bounds.getY()),
AffineTransform.getTranslateInstance(viewRect.getX(),viewRect.getY()),
AffineTransform.getScaleInstance(ratioW, ratioH)
};
AffineTransform tr=new AffineTransform();
for(int i=0;i< transforms.length;++i)
{
tr.concatenate(transforms[i]);
}
Shape shape2=tr.createTransformedShape(shape);
graphics2D.draw(shape2);
Une idée sur la bonne AffineTransform ?
Merci beaucoup
Pierre
OriginalL'auteur Pierre | 2010-10-01
Vous devez vous connecter pour publier un commentaire.
Noter que
AffineTransform
transformations sont concaténés "dans les le plus utile voie", qui peut être considéré comme dernier dans, premier sorti commande. L'effet peut être vu dans cette exemple. Compte tenu de la séquence ci-dessous, le résultatShape
est d'abord tourné, puis mise à l'échelle et enfin traduit.C'est une notion utile pour raisonner sur le résultat; mais, bien sûr, il n'y a pas de file, une seule transformation qui subsume la série d'opérations.
OriginalL'auteur trashgod
Inspiré par trashgod réponse, la séquence correcte est:
OriginalL'auteur Pierre