【问题标题】:Java: Rotate image towards mouse position?Java:将图像旋转到鼠标位置?
【发布时间】:2014-10-28 12:05:59
【问题描述】:

所以我要了这个人:

我们就叫他鲍勃吧。

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

提前致谢!

【问题讨论】:

  • 你在用什么? AWT 画布? JPanel?
  • 我正在使用 JLabel 在 JPanel 上显示图像。
  • 看看this question 及其答案。
  • 我还是不明白:/
  • 发布您的代码将极大地帮助我们。据我们所知,Bob 可能是 Android 应用程序或 Swing 或其他应用程序的一部分,而在所有这些应用程序中轮换他是非常不同的。

标签: java image


【解决方案1】:

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

相反,您应该手动绘制图像,在 JPanel 的覆盖 paintComponent 方法中。还有一些细节需要考虑。例如,图像应该有一定的位置,而位置应该是指图像的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();
    }


}

【讨论】:

  • 如果我想让他朝那个位置移动怎么办?
  • 您只需相应地更新imagePosition。如有疑问,您可以尝试将其表述为一个新的(后续)问题。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 2011-06-19
  • 2021-12-23
  • 1970-01-01
  • 2013-09-08
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多