web-dev-qa-db-ja.com

Java Graphics2D Rectangle?

私はどこでも検索しましたが、答えが見つかりません。
JavaでRectangleを回転するにはどうすればよいですか?

これが私のコードの一部です:

package net.chrypthic.Space;

import javax.swing.*;
import Java.awt.*;
import Java.awt.event.*;

public class Space extends JPanel implements ActionListener{
    Timer time;
    public Space()
    {
        setVisible(true);
        setFocusable(true);
        addMouseMotionListener(new ML());
        addMouseListener(new ML());
        addKeyListener(new AL());
        time=new Timer(5, this);
        time.start();
    }
    public void Paint(Graphics g)
    {
        super.Paint(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(Color.WHITE);
        Rectangle rect2 = new Rectangle(100, 100, 20, 20);

        g2d.draw(rect2);
        g2d.fill(rect2);
    }
    public void actionPerformed(ActionEvent ae) {
        repaint();
    }
    public class AL extends KeyAdapter
    {
        public void keyPressed(KeyEvent e) {
        }

        public void keyReleased(KeyEvent e) {
        }
    }
    public class ML extends MouseAdapter
    {
        public void mouseMoved(MouseEvent e) {
        }

        public void mousePressed(MouseEvent e){
        }
    }
}

G2d.rotate(100D)を試しました。しかし、うまくいきませんでした。前もって感謝します。

編集したコードは次のとおりです。

package net.chrypthic.Space;
import Java.awt.*;
import Java.awt.event.*;
import javax.swing.*;

public class Space extends JPanel implements ActionListener{
    Timer time;
    public Space()
    {
        setVisible(true);
        setFocusable(true);
        setSize(640, 480);
        setBackground(Color.BLACK);
        time=new Timer(5, this);
        time.start();
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        Rectangle rect1 = new Rectangle(100, 100, 20, 20);
        g2d.setColor(Color.WHITE);
        g2d.translate(rect1.x+(rect1.width/2), rect1.y+(rect1.height/2));
        g2d.rotate(Math.toRadians(90));
        g2d.draw(rect1);
        g2d.fill(rect1);
    }
    public void actionPerformed(ActionEvent e) 
    {
        repaint();
    }
}
15
chrypthic

画像の場合は、 drawImage Graphics2Dのメソッドを相対 AffineTransform とともに使用する必要があります。

形状については、Graphics2D自体を回転できます。

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;
    g2d.setColor(Color.WHITE);
    Rectangle rect2 = new Rectangle(100, 100, 20, 20);

    g2d.rotate(Math.toRadians(45));
    g2d.draw(rect2);
    g2d.fill(rect2);
}

そして、ペイントの代わりにpaintComponentメソッドをオーバーライドする必要があります。

引用 JComponent のAPI:

コンポーネントを描画するためにSwingによって呼び出されます。アプリケーションはPaintを直接呼び出すべきではなく、代わりにrepaintメソッドを使用してコンポーネントの再描画をスケジュールする必要があります。

このメソッドは、実際にペイントの作業を、paintComponent、paintBorder、paintChildrenの3つの保護されたメソッドに委任します。これらは、コンポーネント自体の上に子が表示されるように、リストされている順序で呼び出されます。一般的に、コンポーネントとその子は、ボーダーに割り当てられたインセット領域にペイントするべきではありません。サブクラスは、常にこのメソッドをオーバーライドできます。 UI(ルックアンドフィール)デリゲートのPaintメソッドを特殊化するだけのサブクラスは、paintComponentをオーバーライドする必要があります。

また、回転などのアフィン変換を実行すると、オブジェクトは軸Originを中心に暗黙的に回転することも覚えておいてください。したがって、任意のポイントを中心に回転させる場合は、原点に移動して元に戻し、回転してから目的のポイントに再変換する必要があります。

13
Heisenbug
_public void draw(Graphics2D g) {
    Graphics2D gg = (Graphics2D) g.create();
    gg.rotate(angle, rect.x + rect.width/2, rect.y + rect.height/2);
    gg.drawRect(rect.x, rect.y, rect.width, rect.height);
    gg.dispose();

    gg = (Graphics2D) g.create();
    ... other stuff
}
_

Graphics.create()およびGraphics.dispose()を使用すると、現在の変換パラメーター(および現在のフォント、ストローク、ペイントなど)を保存し、後で復元することができます。 OpenGLのglPushMatrix()およびglPopMatrix()と同等です。

長方形を描いたら、逆回転を適用して、変換マトリックスを初期状態に戻すこともできます。ただし、減算中の浮動小数点近似は、誤った結果につながる可能性があります。

10
Aurelien Ribon

別の方法は、Path2D、これを使用すると、グラフィックオブジェクト全体ではなく、パスのみを回転できます。

Rectangle r = new Rectangle(x, y, width, height);
Path2D.Double path = new Path2D.Double();
path.append(r, false);

AffineTransform t = new AffineTransform();
t.rotate(angle);
path.transform(t);
g2.draw(path);
6
Daniel De León