AffineTransform()以非常快的速度旋转矩形

jas*_*kim 0 java swing awt java-2d affinetransform

我试图用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
Run Code Online (Sandbox Code Playgroud)

我的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);
}
Run Code Online (Sandbox Code Playgroud)

我的鼠标拖动事件:

 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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

所以假设场景如下:

在此输入图像描述

但是当我将矩形略微拖动(θ小于10度)到右侧时,矩形甚至会旋转到枢轴点的底部.

另一个注意事项,矩形旋转,但矩形的四个角的坐标已经改变.

使用java进行转换任务时我很迷茫.

rod*_*igo 5

我认为问题在于你为每个鼠标运动事件累积旋转:当你将鼠标移动10度时,你不会在运动结束时只获得一个事件,你会得到一堆事件方式.似乎你在同一个变换中累积所有这些旋转,所以当你达到10度时,你实际上已经1 + 2 + 3 + 4...得到了这个想法.

解决方案很简单:在应用旋转之前重置转换:

recTrans.setToIdentity();
recTrans.rotate(theta, pivotX, pivotY);
Run Code Online (Sandbox Code Playgroud)

或者等效但更好,使用不累积转换的函数.

recTrans.setToRotation(theta, pivotX, pivotY);
Run Code Online (Sandbox Code Playgroud)