java - Java 从屏幕上的任何 X/Y 位置向点旋转图像
问题描述
我有一个船舶对象,我希望它能够旋转到我在屏幕上单击的任何特定点(参见船舶和方形点的图片)。我可以让船面向大体方向,但是当它旋转船本身时,它有这种奇怪的行为;图像围绕圆轴移动,而不是从图像本身的中心点旋转。
有人可以请给我从图像中心xy点到目标squaure(鼠标单击)的角度的公式吗?
解决方案
但它有这种奇怪的行为,因为它使船本身旋转;图像围绕圆轴移动,而不是从图像本身的中心点旋转。
您需要围绕其中心点旋转图像,这意味着您需要在绘制图像之前将 Graphics 对象平移到图像的中心。
这个例子围绕一个固定点旋转:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
public class Rotation2 extends JPanel
{
BufferedImage image;
int degrees;
int point = 250;
public Rotation2(BufferedImage image)
{
this.image = image;
setDegrees( 0 );
setPreferredSize( new Dimension(600, 600) );
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g.create();
double radians = Math.toRadians( degrees );
g2.translate(point, point);
g2.rotate(radians);
g2.translate(-image.getWidth(this) / 2, -image.getHeight(this) / 2);
g2.drawImage(image, 0, 0, null);
g2.dispose();
g.setColor(Color.RED);
g.fillOval(point - 5, point - 5, 10, 10);
}
public void setDegrees(int degrees)
{
this.degrees = degrees;
repaint();
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
String path = "mong.jpg";
// String path = "dukewavered.gif";
ClassLoader cl = Rotation2.class.getClassLoader();
BufferedImage bi = ImageIO.read(cl.getResourceAsStream(path));
final Rotation2 r = new Rotation2(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);
}
}
});
}
}
推荐阅读
- javascript - 在 React 组件之外访问 Redux Store 返回初始值
- javascript - Js中forEach赋值
- javascript - Yargs 模块:没有提供足够的参数。预期 1 但收到 0
- r - 无法根据闪亮仪表板中的文本输入呈现表格
- db2 - 如何在 DB2 中检索存储在 CLOB 数据类型中的 JSON 数据?
- python - 如何使用 Zappa 从命令行将事件发送到 lambda_handler 函数
- oracle - Oracle sava clob 从 utf8 到文件 WE8ISO8859P1
- css - 样式未对齐使用
和 在一个 关于材料 VueJS - python - 当 numpy 数组输入 OpenCv 时引发错误
- delphi - 我可以在 TIdTCPServer.OnExecute 事件中使用 Exit