2011-02-05 86 views
2

我是一个在Java Swing上旋转和平移形状的命令模式。 翻译和旋转运行很好,但是当我做一个60度的旋转时,旋转然后翻译,翻译遵循新的旋转坐标。 这意味着如果我拖动鼠标,形状从鼠标运动矢量 移动60度间隙有没有简单的解决方案?请大家帮忙,我'击中墙壁这里如何使用AffineTransform旋转并保持原有的坐标系?

我对旋转

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); 
    } 
} 

任何帮助可以执行方法真的很感激

回答

1

您正在使用一种特殊的旋转功能,该功能将考虑到形状的偏移以便正确地围绕其中心旋转。但是,为了考虑形状的方向,你需要为翻译功能做类似的事情。

试试这个,而不是你的翻译功能:

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); 
    } 
} 

原来这个坐标系中执行该翻译。

5

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

  1. 对象转换为原点
  2. 应用旋转
  3. 转换回原来的位置
  4. 应用所需的翻译

注意步骤3和4可以同时适用。

如果在原点以外的位置尝试旋转,则会实现“旋转”效果 - 其中物体似乎围绕原点旋转的效果。