Java旋转图像

问题描述:

@Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2=(Graphics2D) g.create(); 

     //rotation of player 
     if(player.newDirection) 
     { 
      int rotationX=player.getImage().getWidth(null)/2; 
      int rotationY=player.getImage().getHeight(null)/2; 

      AffineTransform at=new AffineTransform(); 




       if(player.direction==LEFT) 
       { 
        //graphics.rotate(Math.toRadians(90),bufferedImage.getWidth()/2,bufferedImage.getHeight()/2); 
        //graphics.drawImage(player.getImage(), player.getX(), player.getY(), null); 
        at.setToRotation(Math.toRadians(45), rotationX, rotationY); 
        g2.setTransform(at); 
        g2.drawImage(player.getImage(),player.getX(),player.getY(),null); 
        g2.dispose(); 
        System.out.println("sola"); 
       } 

我想旋转播放器的图像,但它不起作用。哪里有问题?Java旋转图像

+1

你会得到什么结果? “不起作用”不是很具描述性。 – 2014-09-24 16:11:07

我想我明白你的问题。

围绕(0,0)点进行旋转,所以如果您在屏幕中间打印图像,它将显示在离您想象的地方很远的地方。

为了让事情按预期工作,绘制图像以使图像的中心位于(0,0)处,然后翻译它。

所以,你可能需要做转化为如此: - 翻译,使图像中心为(0,0) - 图像旋转 - 翻译你的形象就可以回到所需点

你可以考虑当使用确认变换时,还有两件事...

当您编码g2.setTransform(at);时,您必须非常小心,因为您现在为您的整个图形设置了affirmTransform! (见http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html#setTransform%28java.awt.geom.AffineTransform%29:它说:“这种方法应该从未用来申请新的在现有变换...的顶部坐标变换”),所以不要让任何有错误......

更好地利用g2.drawImage(Image, at, ImageObserver)因为注意到了http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html

另一个常见的错误是创建一个“错误” STARTOF-AffirmeTransform ......我建议你尝试得到一个由AffineTransform at = AffineTransform.getRotateInstance(theta, cx,cy);也许concate之间进行转换的实例at.concatenate(AffineTransform.getTranslateInstance(dx, dy);或者干脆使用at.translate(dx, dy) ...但要记住:在您的affineTransformation上以何种顺序进行转换非常重要(如果您[旋转,然后翻译]或[translat然后旋转] - 就像一个提示)...