0

java awtで長方形を描き、マウスをドラッグしてマウスカーソルで回転させようとしています。

私がそれをテストしていたとき、長方形は途方もなく速く回転していました。

私の長方形():

private Rectangle2D rec = new Rectangle2D.Float(x0,y0,w,h);
AffineTransform recTrans = new AffineTransform();
int pivotX = x0+w/2, pivotY = y0+h;
// (0,0) is at the top-left corner

私のpaintComponent():

 public void paintComponent(Graphics g) {
    Graphics2D graph = (Graphics2D) g;
            graph.translate(x,y);
            graph.transform(recTrans);
            graph.fill(rec);
            graph.setColor(Color.blue);
            graph.draw(rec);
}

私のマウスドラッグイベント:

 addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
            previousX = e.getX();
            previousY = e.getY();
        }
    });
 addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent e) {
        currentX = e.getX();
        currentY = e.getY();

        double angle1 = Math.atan2(currentY-pivotY, currentX-pivotX);
        double angle2 = Math.atan2(previousY-pivotY, previousX-pivotX);
        double theta = angle2 - angle1;
        recTrans.rotate(theta, pivotX, pivotY);
        }
    });

したがって、おそらくシナリオは次のようになります。

ここに画像の説明を入力してください

しかし、長方形を少し右側にドラッグすると(シータが10度未満)、長方形はピボットポイントの一番下まで回転します。

別の注意点として、長方形は回転しますが、長方形の4つの角の座標はまだ変更されています。

javaでこれらの変換タスクを実行すると、私はかなり迷子になります。

4

2 に答える 2

5

問題は、取得した各マウスモーションイベントの回転を蓄積していることだと思います: マウスを 10 度動かすと、移動の最後に 1 つのイベントだけが取得されず、一連のイベントがずっと取得されます。道。そして、同じ変換でそれらすべての回転を累積しているように見えるので、10 度に達すると、実際に1 + 2 + 3 + 4...アイデアが得られます。

解決策は簡単です。回転を適用する前に変換をリセットします。

recTrans.setToIdentity();
recTrans.rotate(theta, pivotX, pivotY);

または同等ですが、変換を累積しないこの関数を使用します。

recTrans.setToRotation(theta, pivotX, pivotY);
于 2013-02-18T01:54:10.887 に答える
0
recTrans.rotate(Math.toRadians(theta), pivotX, pivotY);

これは役に立ちます。

于 2014-07-27T19:30:06.207 に答える