Java:将图像旋转到鼠标位置?

时间:2014-10-28 12:05:59

标签: java image

所以我有这个人:

Bob

我们叫他鲍勃。

我想让他朝我的鼠标位置旋转。我已经想通过在Bob和鼠标之间画一条线并找到这条线的角度,我可以找出角度是什么,Bob需要面对以便“指向”鼠标。但是我仍然不知道如何完成这项任务。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您不应将图片包含在JLabel中。它根本没有提供太大的灵活性。定位可能是奇数,您无法绘制旋转的图像。 (你只能创建一个旋转的图像并将其放入标签中,但这样效率会很低,而且尺寸和位置问题会让你发疯)。

相反,您应该在paintComponent的重写JPanel方法中手动绘制图像。还有一些细节需要考虑。例如,图像应该具有某个位置,并且位置应该可以引用图像的 center - 即,指出它将会旋转。

但是,当您计算出图像中心和鼠标位置之间的直线角度时,您可以通过

简单地绘制具有所需方向的图像。
  • 移动图像以使其中心位于原点
  • 旋转图像
  • 移动图像以使其中心位于所需位置

这是MCVE

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
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.SwingUtilities;

public class ImageFollowingMouseTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new ImageFollowingMousePanel());
        f.setSize(400,400);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

}

class ImageFollowingMousePanel extends JPanel implements MouseMotionListener
{
    private final BufferedImage image;
    private Point imagePosition = new Point(150,150);
    private double imageAngleRad = 0;

    public ImageFollowingMousePanel()
    {
        BufferedImage i = null;
        try
        {
            i = ImageIO.read(new File("6Wu0b.png"));
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        image = i;
        addMouseMotionListener(this);
    }

    protected void paintComponent(Graphics gr) 
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D)gr;
        g.setRenderingHint(
            RenderingHints.KEY_RENDERING, 
            RenderingHints.VALUE_RENDER_QUALITY);

        int cx = image.getWidth() / 2;
        int cy = image.getHeight() / 2;
        AffineTransform oldAT = g.getTransform();
        g.translate(cx+imagePosition.x, cy+imagePosition.y);
        g.rotate(imageAngleRad);
        g.translate(-cx, -cy);
        g.drawImage(image, 0, 0, null);
        g.setTransform(oldAT);

    }

    @Override
    public void mouseDragged(MouseEvent e)
    {
    }

    @Override
    public void mouseMoved(MouseEvent e)
    {
        double dx = e.getX() - imagePosition.getX();
        double dy = e.getY() - imagePosition.getY();
        imageAngleRad = Math.atan2(dy, dx);
        repaint();
    }


}