2015-09-05 2 views
-1

Я делаю игру на Java, но у меня проблема при повороте изображения.Java graphics2D rotating

Когда я поворачиваю изображение с использованием графики2D, X и Y изображения меняются на экране. Тем не менее, когда я получаю изображение X и Y, значение такое же, как и перед поворотом. Однако на экране он отображается в другой позиции.

Любой, кто знает метод или формулу, которые могут вернуть изображение в исходное положение?

+0

Возможно, вам необходимо установить опорную точку, вокруг которой изображение можно вращать – MadProgrammer

ответ

0

Вам необходимо установить точку вращения в середину вашего изображения (или любой объект, который вы вращаете).

Например, если изображение, которое вы хотите повернуть, составляет 20x20px, тогда точка поворота должна быть в (X_POS + 10, Y_POS + 10);

X_POS и Y_POS - это координаты верхней левой вершины вашего изображения на экране.

0

Обычно, когда вы рисуете изображение, вы указываете верхнюю/левую координату для рисования изображения. Однако по мере поворота не прямоугольного изображения размер изображения будет изменяться, и поэтому местоположение x/y изменится.

Так что вам нужно подумать о повороте изображения о его центральной точке. Поэтому для каждого поворота необходимо пересчитать местоположение x/y относительно центра.

В приведенном ниже примере изображения будет поворачиваться вокруг точки (300, 300):

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 класса, так как этот класс управляет изменяющимися размерами изображение при его повороте.

Кроме того, если вы используете «круговой» значок, вы можете использовать setCircularIcon(true), и размер не будет пересчитан, поэтому вы можете указать значения x/y как верхние/левые.