Java仿射变换

时间:2013-07-06 13:22:43

标签: java swing awt java-2d affinetransform

我有一个简单的问题要问。

是否可以在paint / paintComponent上下文之外进行仿射变换? 例如,假设我想创建一个由GeneralPath构成的Shape,然后将其旋转45°。 是否可以创建该对象,然后始终在类构造函数中旋转它而不是创建对象,然后在paint / paintComponent方法中旋转它?

非常感谢。


更新

非常感谢信息人员。 所以今天我按照你的建议做了一个简单的测试,并且它有效。

这是使用paintComponent方法中的Affine变换,注释:

public void paintComponent(Graphics g){
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    g2.setColor(new Color(230, 230, 230));
    g2.fill(enne.getNuvola());//enne.getNuvola(): code from an omitted class. returns a Shape of a cloud
    g2.setColor(new Color(20, 20, 20));

    /*
    AffineTransform t = AffineTransform.getTranslateInstance(400,400);
    g2.transform(t);          
    */

    g2.fill(rock.getRocket());

}//paintComponent

这是GeneralPath

的类构造函数中的仿射变换
public class Rocket {

GeneralPath rocket;

public Rocket(){

    rocket = new GeneralPath();
    rocket.moveTo(10,10);
    rocket.lineTo(15,15);
    rocket.lineTo(15,50);
    rocket.lineTo(5,50);
    rocket.lineTo(5,15);
    rocket.lineTo(10,10);
    rocket.closePath();

    AffineTransform t = AffineTransform.getTranslateInstance(400,400);
    rocket.transform(t);


}//Rocket Costruttore

public GeneralPath getRocket(){
    return this.rocket;
}

}//Rocket

但现在我有另一个问题:

我是否必须保护Rocket类中当前trasform的当前状态,就像建议对java transforming tutorial中的paintComponent方法一样?

  1. 使用getTransform方法获取当前转换。
  2. 使用变换,平移,缩放,剪切或旋转来连接变换。
  3. 执行渲染。
  4. 使用setTransform方法恢复原始变换。
  5. 再次,非常感谢您的答案:-)

1 个答案:

答案 0 :(得分:1)

不,只应重置转换以恢复Graphics对象的状态,因为系统可以为其他图形重用该Graphics对象。如果在没有Graphics对象的情况下进行转换,则无需担心。

请注意,您不应该通过编辑旧问题来提出新问题,因为这会令人困惑。你应该发一个全新的问题(可能链接你的旧问题)。