7

AffineTransformを使用して、長方形を中心から拡大縮小しようとしています。解決策は明らかですが、機能させることはできません。これが私がこれまでにテストしたものです...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Test extends JPanel {
    Test()
        {
        super(null);
        setOpaque(true);
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(200,200));
        }
    @Override
    protected void paintComponent(Graphics g1) {
        super.paintComponent(g1);
        Rectangle r= new Rectangle(5,5,getWidth()-10,getHeight()-10);
        double cx= r.getCenterX();
        double cy= r.getCenterY();
        Graphics2D g=(Graphics2D)g1;
        g.setColor(Color.BLACK);
        AffineTransform old= g.getTransform();
        for(double zoom=0.9; zoom>=0.5; zoom-=0.1)
            {
            AffineTransform tr2= new AffineTransform(old);
            tr2.translate(-cx, -cy);
            tr2.scale(zoom, zoom);
            tr2.translate(cx/zoom,cy/zoom);
            g.setTransform(tr2);
            g.draw(r);
            g.setTransform(old);
            }
        }


    public static void main(String[] args) {
        JOptionPane.showMessageDialog(null, new Test());
        }
    }

しかし、それは機能しません....何か提案はありますか?

4

5 に答える 5

6

長方形を扱っているときの意味がわかります。その理由は、変換の最初の計算でコンテナ オブジェクトのサイズが考慮されていなかったためです。

代わりにこれを使用してください:

tr2.translate(
    (this.getWidth()/2) - (r.getWidth()*(zoom))/2,
    (this.getHeight()/2) - (r.getHeight()*(zoom))/2
);
tr2.scale(zoom,zoom);
g.setTransform(tr2);

これが行っていることは、四角形をスケーリングする前にパネルの中央に移動することです。私のテストでは、問題なく動作します。

于 2009-03-30T22:18:16.030 に答える
6

スケーリングによって長方形の左上隅の位置が修正されると仮定すると (これは正しいと思いますが、Java でグラフィックスを作成してから長い時間が経ちました)、長方形をスケーリングとは反対の方向に移動する必要があります。

tr2.translate(
    r.getWidth()*(1-zoom)/2,
    r.getHeight()*(1-zoom)/2
);
tr2.scale(zoom,zoom);
g.setTransform(tr2);

したがって、長方形を左に移動し、幅と高さの変化の半分を上に移動します。

于 2009-03-27T18:24:56.240 に答える