Ridimensionamento / conversione di una forma in un determinato rettangolo utilizzando AffineTransform

Sto cercando di ridimensionare / tradurre un java.awt. Modellare con AffineTransform per disegnarlo in un rettangolo di delimitazione definito.

Inoltre, voglio dipingerlo in un’area di disegno con un parametro ‘ zoom ‘.

Ho provato varie concatenazioni di AffineTransform ma non sono riuscito a trovare la sequenza corretta. Ad esempio, la seguente soluzione era sbagliata:

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); 

Qualche idea sul corretto AffineTransform?

Grazie molto

Pierre

Notare che le trasformazioni di AffineTransform sono concatenate “nel modo più comunemente utile”, che può essere considerato come ultimo , primo ordine. L’effetto può essere visto in questo esempio . Data la sequenza di seguito, la Shape risultante viene prima ruotata, quindi ridimensionata e infine tradotta.

 at.translate(SIZE/2, SIZE/2); at.scale(60, 60); at.rotate(Math.PI/4); return at.createTransformsdShape(...); 

Ispirata dalla risposta di trashgod, la sequenza corretta 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]); }