【问题标题】:AffineTransform() rotates rectangle way too fastAffineTransform() 太快地旋转矩形
【发布时间】:2013-02-02 09:11:15
【问题描述】:

我正在尝试使用 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);
        }
    });

所以场景应该是这样的:

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

另一个注意,矩形旋转但矩形的四个角的坐标尚未改变。

在用 java 做这些转换任务时我很迷茫。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 我不是 100%,但可能是您在需要弧度时向 AffineTransform 提供度数...
  • 如果角度直接来自 Math.atan2,它的单位是弧度。

标签: java swing awt java-2d affinetransform


【解决方案1】:

我认为问题在于您正在为获得的每个鼠标运动事件累积旋转:当您将鼠标移动 10 度时,您不会在移动结束时仅获得一个事件,而是会获得一堆一路上的事件。而且看起来你在同一个变换中累积所有它们的旋转,所以当你达到 10 度时,你实际上有1 + 2 + 3 + 4... 你明白了。

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

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

或者等效但更好的是,使用这个不累积转换的函数。

recTrans.setToRotation(theta, pivotX, pivotY);

【讨论】:

  • 行得通! @rodrigo 非常感谢。我刚刚在 Java 中被弄湿了,它已经困扰了我好几天了......
【解决方案2】:
recTrans.rotate(Math.toRadians(theta), pivotX, pivotY);

这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多