Масштабирование / перевод фигуры в заданный прямоугольник с помощью AffineTransform - PullRequest
3 голосов
/ 02 октября 2010

Я пытаюсь масштабировать / перевести java.awt. Shape с AffineTransform , чтобы нарисовать его в определенном ограничивающем прямоугольнике.

Кроме того,Я хочу нарисовать его в области рисования с параметром ' zoom '.

Я пробовал различные объединения AffineTransform, но не смог найти правильную последовательность.Например, следующее решение было неверным:

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

Есть идеи о правильном AffineTransform?

Большое спасибо

Pierre

Ответы [ 2 ]

7 голосов
/ 02 октября 2010

Обратите внимание, что преобразования AffineTransform объединяются "наиболее часто используемым способом", что можно рассматривать как последний в , первый выход ,Эффект можно увидеть в этом примере .Учитывая последовательность ниже, результирующий Shape сначала поворачивается, затем масштабируется и, наконец, переводится.

at.translate(SIZE/2, SIZE/2);
at.scale(60, 60);
at.rotate(Math.PI/4);
return at.createTransformedShape(...);
1 голос
/ 02 октября 2010

Вдохновленный ответом trashgod, правильная последовательность была:

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]);
 }
...