4

私はJPanelで長方形を描画しようとしています。この長方形は、車の動きを模倣するために、平行移動してから回転します。長方形を平行移動および回転させることができましたが、(0,0)の原点を中心に回転します。Java GUIを初めて使用するため、長方形を移動および回転させることができたことを非常に嬉しく思いますが、長方形をさらに実験したため、長方形をそれ自体の周りで回転させる方法を理解できないようです。長方形を初期化し、45度回転させました。位置が変更されました。これは、rotateメソッドから追加された変換行列であると想定しています。

これをどのように解決するかをサイトで確認しましたが、長方形を回転させる方法しか見つかりませんでした。シミュレートされた車の動きのように回転したり移動したりする方法は見つかりませんでした。私はそれがその変換行列について懸念していると思いますが、私は推測しているだけです。だから私の質問は、どうすれば長方形を回転させて、JPanelの点に対してではなく、それ自体の周りを移動できるようにすることができるかということです。

これが私がこれまでに思いついたコードです:

public class Draw extends JPanel implements ActionListener {


private int x = 100;
private int y = 100;
private double theta = Math.PI;

Rectangle rec = new Rectangle(x,y,25,25);

Timer timer = new Timer(25,this);

Draw(){
    setBackground(Color.black);
    timer.start();
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D)g;     
    g2d.setColor(Color.white);
    rec.x = 100;
    rec.y = 100;
    g2d.rotate(theta);
    g2d.draw(rec);
    g2d.fill(rec);

}

public void actionPerformed(ActionEvent e) {
    x = (int) (x + (Math.cos(theta))*1);
    y = (int) (y + (Math.sin(theta))*1);
    theta = theta - (5*Math.PI/180);
    repaint();
}
4

2 に答える 2

7

2つのアプローチのいずれかが一般的に使用されます。

  • ここに示すように、の中心(xy)を中心にグラフィックスコンテキストを回転させます。Shape

    rotate(double theta, double x, double y)
    
  • ここに示すように、原点に移動し、回転して元に戻します。

    g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
    g2d.rotate(theta);
    g2d.translate(-image.getWidth(null) / 2, -image.getHeight(null) / 2);
    

2番目の例では、連結の見かけの逆順に注意してください。

補遺:例を詳しく見ると、次の変更によりRectangle、パネルの中心を中心に回転します。

g2d.rotate(theta, getWidth() / 2, getHeight() / 2);

また、@Override注釈を使用して、パネルに適切な推奨サイズを指定します。

@Override
public Dimension getPreferredSize() {
    return new Dimension(640, 480);
}
于 2013-01-01T06:05:25.867 に答える
1

アフィン変換を使用して長方形を回転し、回転した多項式に変換します。以下のコードを確認してください。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.white);
    /* rotate rectnagle around rec.x and rec.y */
    AffineTransform at = AffineTransform.getRotateInstance(theta, 
        rec.x, rec.y);
    /* create the plunomial */
    Polygon p = new Polygon();
    /* path interator of the affine transformed polynomial */
    PathIterator i = rec.getPathIterator(at);
    while (!i.isDone()) {
        double[] points = new double[2];
        i.currentSegment(points);
        p.addPoint((int) points[0], (int) points[1]);

        i.next();
    }
    g2d.fill(p);
}
于 2013-01-01T04:35:16.123 に答える