Java Graphics.fillPolygon:如何同时渲染右边缘和下边缘?

Tim*_*ler 5 java graphics polygon edges graphics2d

绘制多边形时,Java2D 会保留右侧和底部边缘。我明白为什么要这样做。但是,我想画一些包含这些边缘的东西。这发生在我身上的一件事是遵循fillPolygondrawPolygon具有相同的坐标,但是这似乎留下一个缺口。(见底部的小三角形图像。)有两种可能性,但我不知道哪个。为了启用抗锯齿,我这样做:

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

在此处输入图片说明

Hov*_*els 3

在简单的可编译可运行程序中向我们展示您的绘图代码。例如,当我尝试模仿您的图像并使用 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)

如果您可以向我们展示一个能够重现您的问题的类似程序,那么我们可以为您提供更好的帮助。