gpt4 book ai didi

Java Graphics.fillPolygon : How to also render right and bottom edges?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:24 27 4
gpt4 key购买 nike

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

renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
renderHints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(renderHints);

一种可能是没有在 alpha channel 上进行抗锯齿处理,所以间隙是由过度绘制引起的。在那种情况下,如果 alpha channel 被抗锯齿,边缘就会正确邻接。另一种可能性是这里只是有一个缺口。

我该如何解决这个问题?

此外,我不确定,但看起来多边形轮廓实际上可能太大了。也就是说,它可能比我想要包括的右边缘和底部边缘更远。

谢谢。

enter image description here

-- 更新--

根据 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。 , 尽管红色多边形包含该坐标,但它不会在那里绘制任何像素。

enter image description here

为了看gap问题,我改了red在程序中到black .在此图像中,您可以看到右下方有一个细微的间隙,由 drawPolygon 绘制的轮廓所在的位置不太符合用fillPolygon绘制的内容.

enter image description here

最佳答案

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

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

关于Java Graphics.fillPolygon : How to also render right and bottom edges?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7701097/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com