2015-09-05 112 views
-1

我在Java中製作遊戲,但旋轉圖像時出現問題。Java圖形2D旋轉

當我使用graphics2D旋轉圖像時,圖像的X和Y在屏幕上發生變化。仍然當我得到圖像的X和Y時,該值與旋轉之前的值相同。然而,在屏幕上,它顯示在另一個位置上。

任何知道可以將圖像恢復到原始位置的方法或公式的人?

+0

您可能需要提供圖像可以旋轉的錨點 – MadProgrammer

回答

0

您需要將旋轉點設置到圖像中間(或任何旋轉的對象)。例如,如果要旋轉的圖像是20x20像素,那麼旋轉角度應該在(X_POS + 10,Y_POS + 10);

X_POS和Y_POS是屏幕上圖像左上角的座標。

0

通常,當您繪製圖像時,您可以指定一個頂部/左側座標來繪製圖像。然而,當你旋轉一個非矩形的圖像時,圖像的大小將會改變,所以x/y位置會改變。

因此,您需要考慮旋轉圖像的中心點。因此,對於每次旋轉,您都需要重新計算相對於中心的x/y位置。

import java.awt.*; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import javax.swing.event.*; 

public class Rotation3 extends JPanel 
{ 
    private Icon icon; 
    private RotatedIcon rotated; 
    private int degrees; 

    public Rotation3(Image image) 
    { 
     icon = new ImageIcon(image); 
     rotated = new RotatedIcon(icon, 0); 
//  rotated.setCircularIcon(true); 
     setDegrees(0); 
     setPreferredSize(new Dimension(600, 600)); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     // translate x/y so Icon rotated around a specific point (300, 300) 

     int x = 300 - (rotated.getIconWidth()/2); 
     int y = 300 - (rotated.getIconHeight()/2); 
     rotated.paintIcon(this, g, x, y); 

     g.setColor(Color.RED); 
     g.fillOval(295, 295, 10, 10); 
    } 

    public void setDegrees(int degrees) 
    { 
     this.degrees = degrees; 
     rotated.setDegrees(degrees); 
     repaint(); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
//     String path = "dukewavered.gif"; 
        String path = "lunch75.jpg"; 
        ClassLoader cl = Rotation3.class.getClassLoader(); 
        BufferedImage bi = ImageIO.read(Rotation3.class.getResourceAsStream(path)); 
        final Rotation3 r = new Rotation3(bi); 

        final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0); 
        slider.addChangeListener(new ChangeListener() 
        { 
         public void stateChanged(ChangeEvent e) 
         { 
          int value = slider.getValue(); 
          r.setDegrees(value); 
         } 
        }); 

        JFrame f = new JFrame(); 
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        f.add(new JScrollPane(r)); 
        f.add(slider, BorderLayout.SOUTH); 
        f.pack(); 
        f.setLocationRelativeTo(null); 
        f.setVisible(true); 
       } 
       catch(IOException e) 
       { 
        System.out.println(e); 
       } 
      } 
     }); 
    } 
} 

注::

此示例使用Rotated Icon類,因爲這類管理的不斷變化的尺寸

在圖像下面的例子將圍繞點(300,300)被旋轉圖像旋轉。

此外,如果您使用「圓形」圖標,則可以使用setCircularIcon(true),並且不會重新計算大小,因此您可以將x/y值指定爲頂部/左側。