即使使用抗锯齿功能,也能无间隙地显示相邻的 Java Swing 多边形

问题描述 投票:0回答:1

在 Java Swing 中使用抗锯齿填充相邻多边形可能会导致多边形之间出现细小的间隙。除了 fillPolygon 之外,还可以使用 drawPolygon 来闭合间隙,但是多边形会被绘制/填充两次,并且需要花费两倍以上的时间来填充它。

有没有办法只用 fillPolygon 来消除间隙?

这里有一些代码来说明该行为:

import javax.swing.*;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

public class PolygonGap {

    public static void main(String[] args) {
        BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();

        Polygon p1 = new Polygon();
        p1.addPoint(66, 210); p1.addPoint(70, 128); p1.addPoint(160, 152); p1.addPoint(159, 233);


        Polygon p2 = new Polygon();
        p2.addPoint(159, 233); p2.addPoint(160, 152); p2.addPoint(246, 175); p2.addPoint(247, 255);


        Polygon p3 = new Polygon();
        p3.addPoint(70, 128); p3.addPoint(74, 52); p3.addPoint(161, 76); p3.addPoint(160, 152);


        Polygon p4 = new Polygon();
        p4.addPoint(160, 152); p4.addPoint(161, 76); p4.addPoint(245, 99); p4.addPoint(246, 175);


        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

//        g2.setColor(Color.black);
//        g2.drawPolygon(p1); g2.drawPolygon(p2); g2.drawPolygon(p3); g2.drawPolygon(p4);
        g2.setColor(Color.black);
        g2.fillPolygon(p1); g2.fillPolygon(p2); g2.fillPolygon(p3); g2.fillPolygon(p4);
        g2.dispose();

        ImageIcon icon = new ImageIcon(img);
        JLabel label = new JLabel(icon);

        JOptionPane.showMessageDialog(null, label);
    }
}

取消注释绘制多边形线即可看到间隙消失。

这里有间隙的视图:

一种可能的解决方案是在右侧和下部坐标中添加一个像素,以便它们重叠一个像素。在工作时,它感觉有点脏,并带来其他后果,因为它是一个更大项目的一部分,其中计算复杂的表面并在右侧添加一个像素,底部在数学上更复杂。

我也尝试翻译(0.5, 0.5)(在SO的其他地方提到过),但没有帮助。

java swing polygon antialiasing
1个回答
0
投票

但是多边形被绘制/填充了两次,并且需要两倍多的时间来填充它。

不知道为什么绘画会是双重的。

也许你可以使用

Area
来绘画:

import javax.swing.*;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.geom.*;

public class PolygonGap2 {

    public static void main(String[] args) {
        BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = img.createGraphics();

        Polygon p1 = new Polygon();
        p1.addPoint(66, 210); p1.addPoint(70, 128); p1.addPoint(160, 152); p1.addPoint(159, 233);


        Polygon p2 = new Polygon();
        p2.addPoint(159, 233); p2.addPoint(160, 152); p2.addPoint(246, 175); p2.addPoint(247, 255);


        Polygon p3 = new Polygon();
        p3.addPoint(70, 128); p3.addPoint(74, 52); p3.addPoint(161, 76); p3.addPoint(160, 152);


        Polygon p4 = new Polygon();
        p4.addPoint(160, 152); p4.addPoint(161, 76); p4.addPoint(245, 99); p4.addPoint(246, 175);


        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

        Area area = new Area();
        area.add(new Area(p1));
        area.add(new Area(p2));
        area.add(new Area(p3));
        area.add(new Area(p4));

        g2.setColor(Color.BLACK);
        g2.fill(area);

        g2.dispose();

        ImageIcon icon = new ImageIcon(img);
        JLabel label = new JLabel(icon);

        JOptionPane.showMessageDialog(null, label);
    }
}

我无法测量速度,所以我不知道是否更快。

© www.soinside.com 2019 - 2024. All rights reserved.