Tim*_*ler 5 java graphics polygon edges graphics2d
绘制多边形时,Java2D 会保留右侧和底部边缘。我明白为什么要这样做。但是,我想画一些包含这些边缘的东西。这发生在我身上的一件事是遵循fillPolygon与drawPolygon具有相同的坐标,但是这似乎留下一个缺口。(见底部的小三角形图像。)有两种可能性,但我不知道哪个。为了启用抗锯齿,我这样做:
renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
renderHints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(renderHints);
Run Code Online (Sandbox Code Playgroud)
一种可能性是在 alpha 通道上没有进行抗锯齿处理,因此间隙是由过度绘制引起的。在这种情况下,如果 alpha 通道是被抗锯齿的,边缘将正确邻接。另一种可能性是这里只是一个间隙。
我怎样才能解决这个问题?
另外,我不确定,但看起来多边形轮廓实际上可能太大了。也就是说,它可能比我想要包含的右侧和底部边缘更远。
谢谢。

- 更新 -
基于 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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果将填充的多边形保留为红色,则会得到下面的图像(放大 500%),这表明多边形没有一直延伸到右边缘。也就是说,垂直绿线对应于x=(2*WIDTH)/2,虽然红色多边形包含该坐标,但它并未在那里绘制任何像素。

为了看gap问题,我red在程序里改成black. 在这张图片中,您可以看到右下角有一个细微的差距,其中由 绘制的轮廓与用 绘制的轮廓drawPolygon不太吻合fillPolygon。

在简单的可编译可运行程序中向我们展示您的绘图代码。例如,当我尝试模仿您的图像并使用 RenderingHints 时,它似乎会生成具有完整右/下边缘的适当大小的图像:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Foo002 {
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.setColor(Color.black);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.fillPolygon(xPoints, yPoints, xPoints.length);
g2.dispose();
ImageIcon icon = new ImageIcon(img);
JLabel label = new JLabel(icon);
label.setBorder(BorderFactory.createLineBorder(Color.black));
JPanel panel = new JPanel();
panel.add(label);
JOptionPane.showMessageDialog(null, panel);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您可以向我们展示一个能够重现您的问题的类似程序,那么我们可以为您提供更好的帮助。
| 归档时间: |
|
| 查看次数: |
11085 次 |
| 最近记录: |