Java Graphics.fillPolygon: How to also render right and bottom edges?

后端 未结 3 1606
醉酒成梦
醉酒成梦 2021-01-13 09:09

When drawing polygons, Java2D leaves off the right and bottom edges. I understand why this is done. However, I would like to draw something that includes those edges. One

3条回答
  •  长情又很酷
    2021-01-13 09:42

    I like the convenience of ImageIcon, shown by @HFOE, but this variation may make it a little easier to see what's happening. From the Graphics API,

    Operations that draw the outline of a figure operate by traversing an infinitely thin path between pixels with a pixel-sized pen that hangs down and to the right of the anchor point on the path. Operations that fill a figure operate by filling the interior of that infinitely thin path.

    In contrast, Graphics2D must follow more complex rules for antialiasing, which allow it to "draw outside the lines."

    PixelView

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridLayout;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    /** @see http://stackoverflow.com/questions/7701097 */
    public class PixelView extends JPanel {
    
        private static final int SIZE = 20;
        private static final int SCALE = 16;
        private BufferedImage img;
    
        public PixelView(Color fill) {
            this.setBackground(Color.white);
            this.setPreferredSize(new Dimension(SCALE * SIZE, SCALE * SIZE));
            img = new BufferedImage(SIZE, SIZE, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = img.createGraphics();
            int[] xPoints = {SIZE / 3, (2 * SIZE) / 3, SIZE / 3};
            int[] yPoints = {0, SIZE / 2, SIZE};
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(Color.green);
            g2.drawLine(0, SIZE - 1, SIZE, SIZE - 1);
            g2.drawLine(0, 0, SIZE, 0);
            g2.drawLine(SIZE / 3, 0, SIZE / 3, SIZE);
            g2.drawLine((2 * SIZE / 3), 0, (2 * SIZE / 3), SIZE);
            g2.setColor(Color.black);
            g2.drawPolygon(xPoints, yPoints, xPoints.length);
            g2.setColor(fill);
            g2.fillPolygon(xPoints, yPoints, xPoints.length);
            g2.dispose();
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
        }
    
        private static void display() {
            JFrame f = new JFrame("PixelView");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setLayout(new GridLayout(1, 0));
            f.add(new PixelView(Color.black));
            f.add(new PixelView(Color.red));
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    display();
                }
            });
        }
    }
    

提交回复
热议问题