Повернуть изображение в java на указанный угол

Вот функция, которая рисует фигуру по заданным координатам:

public void drawTank(int x,int y){
   int h = 50;
   int w = 50;

   graphic.setColor(Color.darkGray);
   graphic.drawRect(x, y, h, w);
   graphic.fillRect(x, y, h, w);
   graphic.setColor(Color.GRAY);
   graphic.drawRect(x+50, y+20, 35, 10);
   graphic.fillRect(x+50, y+20, 35, 10);
}

Я хочу добавить еще одну переменную к вышеупомянутой функции, называемой «угол», чтобы изображение также поворачивалось на указанный угол (drawTank (int x, int y, int angle).

Обновлено с примером

Что я пытался сделать, так это то, что я инициализировал Graphics2D и соответственно изменил свой код:

g2D.setColor(Color.darkGray);
g2D.drawRect(x, y, h, w);
g2D.fillRect(x, y, h, w);
g2D.setColor(Color.red);
g2D.drawRect(x+50, y+20, 35, 10);
g2D.fillRect(x+50, y+20, 35, 10);
g2D.rotate((Math.toRadians(angle)));

Но на самом деле это ничего не делает. :/


person Manas Bajaj    schedule 14.02.2013    source источник
comment
1) Если графическая переменная является объектом Graphics2D, рассмотрите возможность использования AffineTransform для объекта Graphics. 2) Разве этот метод не должен иметь параметр Graphics или лучше параметр Graphics2D, чтобы текущий активный объект Graphics можно было передать из метода paintComponent(Graphics g) JComponent (если Swing)?   -  person Hovercraft Full Of Eels    schedule 15.02.2013


Ответы (2)


Приоритет имеет значение...

Во втором примере вы применяете вращение ПОСЛЕ того, как вы все нарисовали. Это не то, как работает графика. Сначала вам нужно применить преобразование, а затем все последующие будут использовать это преобразование.

введите здесь описание изображения

public class TestRotateImage {

    public static void main(String[] args) {
        new TestRotateImage();
    }

    public TestRotateImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JSlider slider;
        private Rectangle rectangle;

        public TestPane() {
            setLayout(new BorderLayout());
            rectangle = new Rectangle(0, 0, 100, 100);
            slider = new JSlider();
            slider.setMinimum(0);
            slider.setMaximum(360);
            slider.setMinorTickSpacing(5);
            slider.setMajorTickSpacing(10);
            slider.setValue(0);
            add(slider, BorderLayout.SOUTH);
            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    repaint();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        public double getAngle() {

            return Math.toRadians(slider.getValue());

        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g.create();

            g2d.setColor(Color.RED);
            g2d.drawLine(getWidth() / 2, 0, getWidth() / 2, getHeight());
            g2d.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2);

            g2d.setColor(Color.BLACK);
            int x = (getWidth() - rectangle.width) / 2;
            int y = (getHeight() - rectangle.height) / 2;
            AffineTransform at = new AffineTransform();
            at.setToRotation(getAngle(), x + (rectangle.width / 2), y + (rectangle.height / 2));
            at.translate(x, y);
            g2d.setTransform(at);
            g2d.draw(rectangle);
            g2d.dispose();

        }

    }

}

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

person MadProgrammer    schedule 14.02.2013
comment
Да, скопируйте Graphics, чтобы вам не пришлось переустанавливать преобразование. - person Hovercraft Full Of Eels; 15.02.2013
comment
@HovercraftFullOfEels Да, +1 за лень;) - person MadProgrammer; 15.02.2013

Вот грубый способ сделать это. Взгляните на Java.lang.Math и java.awt.Graphics (экземпляр которых у вас уже есть). При этом вы можете использовать функцию рисования многоугольника для вычисления точек вашего прямоугольника, что вы можете сделать, используя sin и cos функции в Java.lang.Math

На самом деле вам нужно будет вычислить только две точки таким образом, поскольку вашей отправной точкой будет вершина под углом 90 градусов, из которой вы будете вычислять две соседние координаты. Оттуда это просто вопрос сложения и вычитания с точками, которые у вас есть, и вашими размерными значениями, чтобы получить последнюю точку котенка-угла к вашей начальной точке.

Я бы разобрался с этим для вас и написал пример кода, но тогда какое вам удовольствие это доставит?

person darkpbj    schedule 14.02.2013