Java Поворот изображения к точке из любой позиции X / Y на экране - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть объект корабля, который я хочу вращать в направлении любой определенной точки, которую я нажимаю на экране (см. Изображение корабля и квадраты в виде точек).Я могу заставить корабль ориентироваться в общем направлении, но у него странное поведение, так как он вращает сам корабль;изображение движется вокруг круговой оси, а не вращается от центральной точки самого изображения.

Может кто-нибудь, пожалуйста, дайте мне формулу, чтобы получить угол от центральной точки xy изображения до площади назначения (щелчок мыши)?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

но у него странное поведение, поскольку он вращает сам корабль;изображение движется вокруг круговой оси, а не вращается от центральной точки самого изображения.

Вам необходимо повернуть изображение вокруг его центральной точки, а это означает, что вам нужно переместить графический объект в центр вашего изображения, прежде чем рисовать изображение.

В этом примере поворачиваетсяо фиксированной точке:

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);
                }
            }
        });
    }
}
0 голосов
/ 29 сентября 2018

Сначала вы должны найти разницу по оси x и разницу по оси y.Поскольку вы, кажется, говорите, что ваш корабль центрирован, вам нужно только получить координаты (x, y) щелчка.Чтобы найти угол, вы должны знать, что sin (ваш угол) = 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

...