Java使用Graphics2d旋转和绘图

时间:2012-10-02 18:53:40

标签: java rotation graphics2d

    AffineTransform at;
    Graphics2D g2 = (Graphics2D)g;

    g2.setColor(Color.black);

    at = new AffineTransform();
    at.setToTranslation(x, y);
    at.setToRotation(theta);
    g2.setTransform(at);
    g2.drawPolygon(points);

我的代码在x和y处绘制一个三角形...当我按a和d时,三角形旋转..但是当我按下w和s时,三角形不会改变它的x和y。

变量是正确的..这是翻译例程..我不知道我哪里出错了..

如果我这样做:

    AffineTransform at;
    Graphics2D g2 = (Graphics2D)g;

    g2.setColor(Color.black);

    at = new AffineTransform();
    at.setToTranslation(x, y);
    g2.setTransform(at);
    g2.drawPolygon(points);

    at.setToRotation(theta);
    g2.setTransform(at);
    g2.drawPolygon(points);

一个旋转,一个移动..所以为什么我不能在绘制之前应用两个翻译?

3 个答案:

答案 0 :(得分:0)

来自Oracle docs:

  

要添加坐标变换,请使用变换,旋转,缩放或   剪切方法。 setTransform方法仅用于还原   渲染后的原始Graphics2D变换。

只能有一个变换,在这个变换中你可以为旋转方法设置新的变换:

  

将当前的Graphics2D Transform与已翻译的连接   旋转变换。通过变换转换后续渲染   通过翻译到指定位置构建,   按指定的弧度旋转,然后向后平移   金额作为原始翻译。

还有一个警告:

  

警告:永远不应该使用此方法来应用新坐标   因为Graphics2D可能会在现有转换之上进行转换   已经有了其他目的所需的转换,例如   渲染Swing组件或应用缩放转换   调整打印机的分辨率。

答案 1 :(得分:0)

我认为你需要将两个转换连接成一个AffineTransformation。

AffineTransform at, toConcatenate;
Graphics2D g2 = (Graphics2D)g;

g2.setColor(Color.black);

at = new AffineTransform();
toConcatenate = new AffineTransform();

at.setToTranslation(x,y);
toConcatenate.setToRotation(theta);
at.concatenate(toConcatenate);
g2.setTransform(at)
g2.drawPolygon(points);

我基于在http://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html

的Oracles网站上找到的教程

我认为你的代码不起作用的原因是'setTransform方法覆盖了Graphics2D对象的当前变换'你用第二个变换覆盖第一个变换而不是连接两个变换。

希望这有帮助

答案 2 :(得分:0)

    AffineTransform at;
    Graphics2D g2 = (Graphics2D)g;

    g2.setColor(Color.black);

    at = new AffineTransform();

    at.translate(x, y);     
    at.rotate(theta);
    g2.setTransform(at);
    g2.drawPolygon(points);

我使用了错误的东西..旋转和翻译是我需要的功能。