我正在尝试使用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度)矩形到右侧时,矩形甚至旋转到枢轴点的底部。
另外注意,矩形旋转但矩形的四个角的坐标已经改变。
在使用java进行转换任务时我很失落。
答案 0 :(得分:5)
我认为问题在于你为每个鼠标运动事件累积旋转:当你将鼠标移动10度时,你不会在运动结束时只得到一个事件,你得到一堆一路上的事件。似乎你在同一个变换中累积所有这些旋转,所以当你达到10度时,你实际上已经1 + 2 + 3 + 4...
得到了这个想法。
解决方案很简单:在应用旋转之前重置转换:
recTrans.setToIdentity();
recTrans.rotate(theta, pivotX, pivotY);
或等效但更好,使用此函数不会累积转换。
recTrans.setToRotation(theta, pivotX, pivotY);
答案 1 :(得分:0)
recTrans.rotate(Math.toRadians(theta), pivotX, pivotY);
这会有所帮助。