2011-02-05 102 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可以同時適用。

如果在原點以外的位置嘗試旋轉,則會實現「旋轉」效果 - 其中物體似乎圍繞原點旋轉的效果。

相關問題