gpt4 book ai didi

java - AffineTransform() 旋转矩形的速度太快

转载 作者:行者123 更新时间:2023-12-01 17:26:02 26 4
gpt4 key购买 nike

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

所以假设场景是这样的:

enter image description here

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

另外注意,矩形旋转了,但是矩形四个角的坐标还没有改变。

当我用java做那些转换任务时我很迷失..

最佳答案

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

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

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

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

recTrans.setToRotation(theta, pivotX, pivotY);

关于java - AffineTransform() 旋转矩形的速度太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14927817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com