Escalamiento / Traducción de una forma a un rectángulo dado usando AffineTransform
-
27-09-2019 - |
Pregunta
Estoy tratando de escala / traducir un java.awt. Forma AffineTransform con el fin de dibujar en un rectángulo envolvente.
definidoPor otra parte, quiero pintarlo en un área de dibujo que tiene un ' zoom ' parámetro.
He intentado varias concatenaciones de AffineTransform pero no pude encontrar la secuencia correcta. Por ejemplo, la siguiente solución estaba mal:
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);
Cualquier idea sobre el AffineTransform correcta?
Muchas gracias
Pierre
Solución
Tenga en cuenta que AffineTransform
transformaciones se concatenan "de la forma más comúnmente útil", que puede considerarse como última en , primero en salir orden. El efecto puede ser visto en este ejemplo . Dada debajo de la secuencia, la Shape
resultante se hace girar en primer lugar, a continuación, a escala y, finalmente, traducido.
at.translate(SIZE/2, SIZE/2);
at.scale(60, 60);
at.rotate(Math.PI/4);
return at.createTransformedShape(...);
Otros consejos
Inspirado por la respuesta de trashgod, la secuencia correcta era:
AffineTransform transforms[]=
{
AffineTransform.getScaleInstance(zoom, zoom),
AffineTransform.getTranslateInstance(viewRect.getX(),viewRect.getY()),
AffineTransform.getScaleInstance(ratioW, ratioH),
AffineTransform.getTranslateInstance(-bounds.getX(),-bounds.getY())
};
AffineTransform tr=new AffineTransform();
for(int i=0;i< transforms.length;++i)
{
tr.concatenate(transforms[i]);
}