3

java.awtをスケーリング/変換しようとしています。定義された境界長方形に描画するために、 AffineTransformを使用してシェイプします。

さらに、「ズーム」パラメータを持つ描画領域にペイントしたいと思います。

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について何か考えはありますか?

どうもありがとう

ピエール

4

2 に答える 2

8

変換は「最も一般的に有用な方法で」連結されていることに注意してください。これは、後入れ先出し順序AffineTransformと見なすことができます。こので効果を確認できます。以下のシーケンスを考えると、結果は最初に回転され、次にスケーリングされ、最後に変換されます。Shape

at.translate(SIZE/2, SIZE/2);
at.scale(60, 60);
at.rotate(Math.PI/4);
return at.createTransformedShape(...);
于 2010-10-01T23:06:44.853 に答える
1

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]);
 }
于 2010-10-02T12:23:44.550 に答える