繁体   English   中英

Java图形2D旋转

[英]Java graphics2D rotating

我正在用 Java 制作游戏,但在旋转图像时遇到问题。

当我使用 graphics2D 旋转图像时,图像的 X 和 Y 在屏幕上发生变化。 仍然当我获得图像的 X 和 Y 时,该值与旋转前的值相同。 然而,在屏幕上,它显示在另一个位置。

谁知道有什么方法或者公式可以让图片恢复到原来的位置?

您需要将旋转点设置为图像的中间(或您正在旋转的任何对象)。

例如,如果您要旋转的图像为 20x20px,则旋转点应为 (X_POS + 10, Y_POS + 10);

X_POS 和 Y_POS 是屏幕上图像左上角的坐标。

通常,当您绘制图像时,您会指定一个上/左坐标来绘制图像。 但是,当您旋转非矩形图像时,图像的大小会发生变化,因此 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 值指定为顶部/左侧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM