2

我是在 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);  
    }  
} 

任何帮助都将不胜感激

4

2 回答 2

5

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

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

请注意,步骤 3 和 4 可以同时应用。

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

于 2011-02-05T05:48:44.597 回答
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);  
    }  
}

这将在原始坐标系中执行平移。

于 2011-02-05T05:59:31.600 回答