2

「アフィン変換」を使えばimageA簡単に回転できます。同様に、imageAと一緒に移動しimageBます。imageAしかし、回転させた後、元の位置に戻す方法が見つからないようです。

(私はいくつかのサイトでいくつかの調査を行いましたが、明らかに最良の方法は、アンカーポイントから回転しているように見えるように画像を元の位置に戻すことです。)

これまでの私のコードは次のとおりです。

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    AffineTransform af = new AffineTransform();
    Graphics2D g2d = (Graphics2D) g;


    af.translate(imageBx, imageBy); // moves ImageA to imageb's position
    af.rotate(Math.toRadians(angle), imageB.getHeight(this) / 2, imageB.getWidth(this) / 2);


    g2d.drawImage(imageA, af, null);
    g2d.drawImage(imageB, imageBx, imageBy, null);
  }

誰かが私がimageA元の位置(正しい位置にある)に戻るのを手伝ってくれるならimageB、それは非常に役に立ちます!

4

1 に答える 1

2

私はそれを見ましたが、コードはパネル全体を回転させます。Image固定された回転点で1つだけ回転させたいだけです。

2つのことがあなたの理解を導くのに役立つかもしれません:

  • 引用されたrotate(double theta)では、;を使用しています。原点への変換が先行し、パネルの中心への変換が後続します。操作は、宣言された順序とは明らかに逆の順序で実行されることに注意してください。あなたの例(意図したかもしれません)はを呼び出しrotate(double theta, double anchorx, double anchory)ます。2つは同じ結果をもたらし、後者は前者の便利な代替手段です。

  • このでは、グラフィックスコンテキスト(g2d)または画像自体を変換する方法を対比しています。この例では、を呼び出します。これは、既存のグラフィックス変換drawImage(Image img, AffineTransform xform, ImageObserver obs)に連結されます。xformこれは、後続のすべての描画に影響します。それらを分離しておく方が簡単かもしれません。

于 2012-05-13T23:00:21.657 に答える