Drawing a nice circle in Java

后端 未结 5 886
生来不讨喜
生来不讨喜 2021-02-09 18:06

I\'m using Java Graphics and I keep getting \"ugly\" circles.

Here\'s what my Java program makes \"enter

5条回答
  •  梦谈多话
    2021-02-09 18:46

    Here was the answer. I adapted the majority of the code from this site. Take a look:

    enter image description here

    Here's the code:

    public void paintComponent(Graphics g) {
    
            // Create a translucent intermediate image in which we can perform
            // the soft clipping
            GraphicsConfiguration gc = ((Graphics2D) g).getDeviceConfiguration();
            BufferedImage img = gc.createCompatibleImage(getWidth(), getHeight(), Transparency.TRANSLUCENT);
            Graphics2D g2 = img.createGraphics();
    
            // Clear the image so all pixels have zero alpha
            g2.setComposite(AlphaComposite.Clear);
            g2.fillRect(0, 0, getWidth(), getHeight());
    
            // Render our clip shape into the image.  Note that we enable
            // antialiasing to achieve the soft clipping effect.  Try
            // commenting out the line that enables antialiasing, and
            // you will see that you end up with the usual hard clipping.
            g2.setComposite(AlphaComposite.Src);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(Color.WHITE);
            g2.fillOval(0, 0, getRadius(), getRadius());
    
            // Here's the trick... We use SrcAtop, which effectively uses the
            // alpha value as a coverage value for each pixel stored in the
            // destination.  For the areas outside our clip shape, the destination
            // alpha will be zero, so nothing is rendered in those areas.  For
            // the areas inside our clip shape, the destination alpha will be fully
            // opaque, so the full color is rendered.  At the edges, the original
            // antialiasing is carried over to give us the desired soft clipping
            // effect.
            g2.setComposite(AlphaComposite.SrcAtop);
            g2.setColor(lineColor);
            int gap = LINE_GAP;
            AffineTransform at = g2.getTransform();
    
            g2.setTransform(AffineTransform.getRotateInstance(Math.toRadians(45),getRadius() / 2, getRadius() / 2));
    
            for (int index = 0; index < 10; index++) {
                int x1 = index*gap-(LINE_THICKNESS/2);
                int y1 = 0;
                int x2 = index*gap+(LINE_THICKNESS/2);
                int y2 = getRadius();
                int width = x2 - x1;
                int height = y2 - y1;
    
                g2.fillRect(x1, y1, width, height);
            }
    
            g2.setTransform(at);
            g2.dispose();
    
            // Copy our intermediate image to the screen
            g.drawImage(img, 0, 0, null);
        }
    

提交回复
热议问题