绘制多边形时,Java2D 会忽略右边缘和底边缘。我明白为什么要这样做。然而,我想画一些包含这些边缘的东西。我想到的一件事是遵循fillPolygon
with drawPolygon
具有相同的坐标,但这似乎留下了间隙。 (参见底部的小三角形图像。)有两种可能性,但我不知道是哪一种。为了启用抗锯齿功能,我这样做:
renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
renderHints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(renderHints);
一种可能性是 Alpha 通道上没有进行抗锯齿处理,因此间隙是由过度绘制造成的。在这种情况下,如果 Alpha 通道是被抗锯齿的通道,则边缘将正确邻接。另一种可能性是,这里只是有一个缺口。
我怎样才能解决这个问题?
另外,我不确定,但看来多边形轮廓实际上可能太大了。也就是说,它可能比我想要包含的右边缘和下边缘更远。
Thanks.
- 更新 -
基于 Hovercraft Full of Eels 的一个非常好的建议,我做了一个可编译的示例:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class polygon {
private static final int WIDTH = 20;
public static void main(String[] args) {
BufferedImage img = new BufferedImage(WIDTH, WIDTH, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
int[] xPoints = {WIDTH / 3, (2*WIDTH) / 3, WIDTH / 3};
int[] yPoints = {0, WIDTH / 2, WIDTH};
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.green);
g2.drawLine(0, WIDTH-1, WIDTH, WIDTH-1);
g2.drawLine(0, 0, WIDTH, 0);
g2.drawLine(WIDTH/3, 0, WIDTH/3, WIDTH);
g2.drawLine((2*WIDTH/3), 0, (2*WIDTH/3), WIDTH);
g2.setColor(Color.black);
g2.drawPolygon(xPoints, yPoints, xPoints.length);
g2.setColor(Color.black);
g2.fillPolygon(xPoints, yPoints, xPoints.length);
g2.dispose();
ImageIcon icon = new ImageIcon(img);
JLabel label = new JLabel(icon);
JOptionPane.showMessageDialog(null, label);
}
}
如果将填充的多边形保留为红色,则会得到下图(缩放 500%),这表明多边形并未一直延伸到右边缘。也就是说,垂直的绿线对应于x=(2*WIDTH)/2
,尽管红色多边形包含该坐标,但它不会在那里绘制任何像素。
为了看到差距问题,我改变了red
在程序中black
。在此图像中,您可以在右下角看到一个微妙的间隙,其中绘制的轮廓drawPolygon
不太符合所画的内容fillPolygon
.