【问题标题】:Java Rotate Image Towards Point from any X/Y position on screenJava 从屏幕上的任何 X/Y 位置向点旋转图像
【发布时间】:2018-09-29 19:01:28
【问题描述】:

我有一个船舶对象,我希望它能够旋转到我在屏幕上单击的任何特定点(参见船舶和方形点的图片)。我可以让船面向大体方向,但是当它旋转船本身时,它有这种奇怪的行为;图像围绕圆轴移动,而不是从图像本身的中心点旋转。

有人可以请给我从图像中心xy点到目标squaure(鼠标单击)的角度的公式吗?

【问题讨论】:

    标签: java object sprite move


    【解决方案1】:

    首先,您必须找到 x 轴上的差异和 y 轴上的差异。由于您似乎说您的船居中,因此您只需要获取点击的 (x,y) 坐标。要找到角度,您必须知道 sin(your angle) = y/sqrt(y^2 + x^2),因此,您的角度 = sin^-1(y/sqrt(y^2 + x^2) )。这是基础数学,但是刷新基础知识总是好的,因为如果你在那里犯了一个小错误,在调试时会很头疼,所以我建议你看看这个页面: https://www.mathsisfun.com/algebra/trig-finding-angle-right-triangle.html

    【讨论】:

      【解决方案2】:

      但它有这种奇怪的行为,因为它会旋转船本身;图像围绕圆轴移动,而不是从图像本身的中心点旋转。

      您需要围绕其中心点旋转图像,这意味着您需要在绘制图像之前将 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);
                      }
                  }
              });
          }
      }
      

      【讨论】:

      • 谢谢!我会试试这个。
      猜你喜欢
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多