如何使用仿射变换旋转并保持原始坐标系?

时间:2011-02-05 05:10:08

标签: java rotation 2d translation affinetransform

我是一个在Java Swing上旋转和转换形状的命令模式 翻译和旋转分离得很好,但是当我做60度时。旋转然后平移,平移跟随新的旋转坐标。 这意味着如果我拖动鼠标,形状会与鼠标移动矢量间隔60度移动 有什么简单的解决方案吗?请帮忙,我在这里碰墙了

我的旋转执行方法

public void execute() {  
    System.out.println("command: rotate " + thetaDegrees );       
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();           
        mt.addMememto(shape);             
        AffineTransform t =  shape.getAffineTransform();      
        t.rotate(Math.toRadians(thetaDegrees), shape.getCenter().x, shape.getCenter().y);  
        shape.setAffineTransform(t);              
    }  
}  

我的翻译执行方法

public void execute() {  
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();  
        mt.addMememto(shape);  
        AffineTransform t = shape.getAffineTransform();  
        System.out.println("Translation x :"+x + ", Translation y :"+y);  
        t.translate(x,y);  
        shape.setAffineTransform(t);  
    }  
} 

可以非常感谢任何帮助

2 个答案:

答案 0 :(得分:5)

要完成“就地”旋转(对象围绕其自身轴旋转),您必须:

  1. 将对象翻译为原点
  2. 应用轮换
  3. 转回原来的位置
  4. 应用所需的翻译
  5. 请注意,步骤3和4可以立即应用。

    如果在原点以外的位置尝试旋转,则会实现“旋转”效果 - 对象看起来围绕原点旋转。

答案 1 :(得分:1)

您正在使用特殊的旋转功能,该功能将考虑形状的偏移,以便围绕其中心正确旋转。但是,您需要为translate函数执行类似操作,以便考虑形状的方向。

尝试使用此功能代替您的翻译功能:

public void execute() {  
    Iterator iter = objects.iterator();  
    Shape shape;  
    while(iter.hasNext()){  
        shape = (Shape)iter.next();  
        mt.addMememto(shape);  
        AffineTransform t = new AffineTransform();
        System.out.println("Translation x :"+x + ", Translation y :"+y);
        t.translate(x,y);
        t.concatenate(shape.getAffineTransform());
        shape.setAffineTransform(t);  
    }  
}

这将在原始坐标系中执行转换。