Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You have lots-o-choices depending on what you want to achieve...</p> <p>You can...</p> <ul> <li>Create a <code>PathIterator</code> from the shape object, using a <code>AffineTransform</code> matching your rotational requirements. This will require you to create a new path, appending the <code>PathIterator</code> to it so you can paint it ... or</li> <li>Create a new <code>Path2D</code> using the shape to be rotated as the base for the new path and passing the <code>AffineTransform</code> to it. This is pretty much the same as the first option, but requires less code...</li> </ul> <p>Here's an example....</p> <pre><code>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(); } } } </code></pre> <p><strong>UPDATED</strong></p> <p>If all you want to do is "mirror" the shape, you can scale the axis by <code>-1</code>...</p> <pre><code>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 = 1 * (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(); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload