Pregunta

Estoy tratando de escala / traducir un java.awt. Forma AffineTransform con el fin de dibujar en un rectángulo envolvente.

definido

Por 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

¿Fue útil?

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]);
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top