我正在实现一个 java swing 应用程序,它有一个用作绘图表面的 JPanel。表面呈现(活动)不同的元素。每个元素都有自己的形状和用于渲染和碰撞检测的仿射变换(每个元素都是用局部坐标绘制的,然后用仿射变换进行变换——比如 opengl)。
元素可以在表面上移动和旋转(这是通过变换完成的)。每次应用变换时,都会使用形状和变换创建一个 Area 对象(用于准确的碰撞检测)。
问题是当我旋转元素(45 度)然后将其移动 10 像素时。当我移动它时,元素会沿我不想要的旋转方向移动。
有什么简单的方法可以克服这个问题吗?
(如果我的描述不够,我会发布一些示例代码)。
编辑:
class Element
{
private AffineTransform transform = new AffineTransform();
private Shape shape = new Rectangle(0,0,100,100);
private Area boundingBox;
public void onMouseDrag(MouseEvent e)
{
translate(dx,dy); // dx,dy are calculated from event
}
public void onMouseMove(MouseEvent e)
{
rotate(Math.atan2(dx/dy); // dx,dy are calculated from event
}
public void translate(int dx,int dy)
{
transform.translate(dx,dy);
boundingBox = new Area(shape);
boundingBox.transform(transform);
}
public void rotate(double angle)
{
transform.rotate(Math.toRadians(angle));
boundingBox = new Area(shape);
boundingBox.transform(transform);
}
public void draw(Graphics2D g2d)
{
g2d.setTransform(transform);
g2d.draw(shape);
...
}
}