如何使用Graphics2D.rotate()旋转

时间:2012-11-12 17:41:42

标签: java graphics graphics2d

在这个程序中,我想要为火车设置动画,当火车到达某个x坐标时,我想逐个列车每个火车车厢(矩形)。火车包括五辆汽车,一个矩形代表一辆汽车。当火车到达某个位置时,我想为轨道变化设置动画(下行轨道到上轨道)。因此,当它到达轨道更换位置时,​​我想要旋转每辆车。我使用以下代码执行此操作,但它会立即旋转所有汽车,第一辆汽车45度(正确)和第二辆汽车90和第三辆汽车135 ......等。

CODE:

private void drawLineBTrain(Graphics g){

    Graphics2D gg = (Graphics2D) g;

    for(int i = 0; i < b.getSize(); i++){            
        if(rotate){
            gg.rotate(-Math.PI/4, b.getCar(i).getPosX(), b.getCar(i).getPosY());
        }
        gg.fillRect(b.getCar(i).getPosX(), b.getCar(i).getPosY(), 80, 24);
    }
}

public void moveLineBTrain(Train t, boolean goRight){

    if(goRight) {
        b = t;
        int x, y;
        for(int i = 0; i < b.getSize(); i++) {
            x = b.getCar(i).getPosX();
            b.getCar(i).setPosX(++x);
            if(x > ((getWidth() / 2) - 140) && x < ((getWidth() / 2) + 140)){
                y = 490 + (int)( (double) (-100 * x) / 280 );
                b.getCar(i).setPosY(y);
                rotate = true;
            }
        }
    } else {
        b = t;
        int x, y;
        for(int i = 0; i < b.getSize(); i++) {
            x = b.getCar(i).getPosX();
            b.getCar(i).setPosX(--x);
            if(x > ((getWidth() / 2) - 140) && x < ((getWidth() / 2) + 140)){
                y = 490 + (int)( (double) ( -100 * (1344 - x) / 280 ));
                b.getCar(i).setPosY(y);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我猜你的问题是你错了旋转“画布”,旋转“对象”。你在做什么:

  1. 将“画布”旋转45度,然后在其上绘制第一个矩形。结果:旋转45度的矩形。
  2. 将“画布”旋转45度(再次!),然后在其上绘制第二个矩形。结果:旋转45度的矩形和旋转90度的第二个矩形。
  3. 我的猜测是(我现在无法测试代码)您必须将旋转移出for循环并撤消对末尾变换矩阵的更改,以便后续调用{{1方法未被转换(旋转)。试试这个并告诉我们它是否有效,如果没有,我会想到更聪明的东西:

    draw

    这是good text about Graphics2D Transformations,直接来自Sun.他们这样说:

      

    执行其他转换,例如旋转或缩放,   您可以将其他变换添加到Graphics2D上下文。这些   其他变换成为变换管道的一部分   在渲染过程中应用

    这意味着如果你调用private void drawLineBTrain(Graphics g){ Graphics2D gg = (Graphics2D) g; AffineTransform aT = gg.getTransform(); // We store the initial transformation matrix for(int i = 0; i < b.getSize(); i++){ if(rotate){ gg.rotate(-Math.PI/4, b.getCar(i).getPosX(), b.getCar(i).getPosY()); } gg.fillRect(b.getCar(i).getPosX(), b.getCar(i).getPosY(), 80, 24); gg.setTransform(aT); // We restore the transformation matrix } } 方法,Graphics2D上下文(“画布”)将被旋转并保持这种,直到你将其旋转回来(或恢复初始转换矩阵。)