2014-02-17 32 views
0

因此,我绘制一个BufferedImage'鸟',但我想根据它正在下降的角度旋转它。我有一个包含BufferedImage的小鸟对象和一个render()方法,它使它旋转。获取正确的图像观察者旋转图像

public void render(Graphics2D g, ImageObserver io) { 

    double theta = Math.tan((height - pastHeight)/.875); 
    System.out.println(theta); 
    Graphics2D g2 = (Graphics2D) bird.getGraphics(); 

    g2.drawImage(bird, 100, (int) height, null); 

    g2.rotate(theta); 

    g2.drawImage(bird, 100, (int) height, io); 
} 

我在的paintComponent方法在我的JComponent调用此这样

bird.render(g2, ???); 

唯一的问题是我不知道用什么作为我的ImageObserver ...我试着传递我的JFrame和我的JComponent,但是当我这样做时图像不再出现......我会传递什么图像出现在我的窗口和/或我将如何实现这种旋转?

回答

1

假设你的东西扩展JComponent这样做,你应该使用

bird.render(g2, this); 

由于JComponent工具ImageObserver

与图像消失的问题是不是与ImageObserver但问题旋转发生的位置,我相信这是Graphics上下文的顶部/左侧角落。

尝试使用Graphics2D#rotate(double, int, int)这将允许您指定旋转的原点(轴心点)。

不要忘记重置您的翻译,因为它们会影响您供应后绘制的所有东西,并可能在后续的油漆周期中重新使用。

更新用简单的例子

这是演示的rotate不同用途的基本示例。

首先,我只是用Graphics#rotate(double)

rotate

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class RotateImage { 

    public static void main(String[] args) { 
     new RotateImage(); 
    } 

    public RotateImage() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage img; 
     private double angel = 0d; 

     public TestPane() { 
      try { 
       img = ImageIO.read(...); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 

      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        angel += 5; 
        repaint(); 
       } 
      }); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (img != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.rotate(Math.toRadians(angel)); 
       int x = (getWidth() - img.getWidth())/2; 
       int y = (getHeight() - img.getHeight())/2; 
       g2d.drawImage(img, x, y, this); 
       g2d.dispose(); 
      } 
     } 
    } 

} 

然后我取代g2d.rotate(Math.toRadians(angel));g2d.rotate(Math.toRadians(angel), getWidth()/2, getHeight()/2);,其中所用的部件的中心位置(或Graphics上下文)作为锚点在其周围会发生旋转...

Center

现在,因为你只想旋转你的图像,你将需要计算图像中心位置的当前位置周围的锚点(假设你想要它绕中间旋转)

+0

这就是第一个我试过的东西,图像没有显示,没有错误或异常抛出 – Acor74u

+0

您是否尝试使用'rotate(double,int,int)'而不是? – MadProgrammer

+0

嗯,我可以......我只需要输入整数? – Acor74u