Rotate an image in java by the specified angle

后端 未结 2 866
Happy的楠姐
Happy的楠姐 2020-12-02 01:21

Here\'s the function which draws a shape at the given coordinates:

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

   graphic.setColor(Col         


        
2条回答
  •  余生分开走
    2020-12-02 01:56

    Precedence matters...

    In your second example, you're apply a rotation AFTER you've drawn everything. This is not how graphics works. You need to apply the transformation first, then everything that follows will use that transformation.

    enter image description here

    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();
    
            }
    
        }
    
    }
    

    You might like to take a look at Transforming Shapes, Text and Images for more information

提交回复
热议问题