2015-09-05 115 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值指定为顶部/左侧。