Flipping shape (not image)

前端 未结 1 1167
抹茶落季
抹茶落季 2020-12-21 11:07

Solved: Thanks @MadProgrammer

I replaced g2.rotate(Math.toRadians(180.0)); by g2.scale(1, -1); thanks^^


I wr

相关标签:
1条回答
  • 2020-12-21 11:48

    You have lots-o-choices depending on what you want to achieve...

    You can...

    • Create a PathIterator from the shape object, using a AffineTransform matching your rotational requirements. This will require you to create a new path, appending the PathIterator to it so you can paint it ... or
    • Create a new Path2D using the shape to be rotated as the base for the new path and passing the AffineTransform to it. This is pretty much the same as the first option, but requires less code...

    Here's an example....

    public class SpinningTriangle {
    
        public static void main(String[] args) {
            new SpinningTriangle();
        }
    
        public SpinningTriangle() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new SpinPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class SpinPane extends JPanel {
    
            private Triangle triangle;
            private float angle = 0;
    
            public SpinPane() {
                triangle = new Triangle(50, 100);
                Timer timer = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        angle += 2;
                        repaint();
                    }
                });
                timer.setRepeats(true);
                timer.setCoalesce(true);
                timer.start();
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(110, 110);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                Rectangle bounds = triangle.getBounds();
    //            PathIterator pi = triangle.getPathIterator(AffineTransform.getRotateInstance(Math.toRadians(angle), bounds.width / 2, bounds.height / 2));
    //            Path2D path = new Path2D.Float();
    //            path.append(pi, true);
                Path2D path = new Path2D.Float(triangle, AffineTransform.getRotateInstance(Math.toRadians(angle), bounds.width / 2, bounds.height / 2));
                int x = (getWidth() - bounds.width) / 2;
                int y = (getHeight() - bounds.height) / 2;
                g2d.translate(x, y);
                g2d.setColor(Color.RED);
                g2d.fill(path);
                g2d.setColor(Color.YELLOW);
                g2d.draw(path);
                g2d.dispose();
            }
    
        }
    
        public class Triangle extends Path2D.Float {
    
            public Triangle(int width, int height) {
    
                moveTo(width / 2f, 0);
                lineTo(width, height);
                lineTo(0, height);
                closePath();
    
            }
    
        }
    
    }
    

    UPDATED

    If all you want to do is "mirror" the shape, you can scale the axis by -1...

    public class SpinningTriangle {
    
        public static void main(String[] args) {
            new SpinningTriangle();
        }
    
        public SpinningTriangle() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new FlipPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class FlipPane extends JPanel {
    
            private Triangle triangle;
            private boolean flip;
    
            public FlipPane() {
                triangle = new Triangle(50, 100);
                Timer timer = new Timer(500, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        flip = !flip;
                        repaint();
                    }
                });
                timer.setRepeats(true);
                timer.setCoalesce(true);
                timer.start();
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(110, 110);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                Rectangle bounds = triangle.getBounds();
    
                double scale = flip ? -1 : 1;
    
                Path2D path = new Path2D.Float(triangle, AffineTransform.getScaleInstance(scale, scale));
                int x = (getWidth() - bounds.width) / 2;
                int y = (getHeight() - bounds.height) / 2;
                if (flip) {
    
                    y += bounds.height;
                    x += bounds.width;
    
                }
                g2d.translate(x, y);
                g2d.setColor(Color.RED);
                g2d.fill(path);
                g2d.setColor(Color.YELLOW);
                g2d.draw(path);
                g2d.dispose();
            }
    
        }
    
        public class Triangle extends Path2D.Float {
    
            public Triangle(int width, int height) {
    
                moveTo(width / 2f, 0);
                lineTo(width, height);
                lineTo(0, height);
                closePath();
    
            }
    
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题