Java Graphics.fillPolygon: Como também renderizar as bordas direita e inferio
Ao desenhar polígonos, o Java2D deixa as bordas direita e inferior. Eu entendo por que isso é feito. No entanto, eu gostaria de desenhar algo que inclua essas bordas. Uma coisa que me ocorreu foi seguirfillPolygon
comdrawPolygon
com as mesmas coordenadas, mas isso parece deixar um espaço. (Veja a pequena imagem triangular na parte inferior.) Existem duas possibilidades, mas não sei dizer qual. Para ativar o antialiasing, estou fazendo o seguinte:
renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
renderHints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(renderHints);
Uma possibilidade é que o anti-aliasing não esteja sendo realizado no canal alfa; portanto, a diferença é causada pelo excesso. Nesse caso, se o canal alfa fosse o que estava sendo suavizado, as bordas se encaixariam corretamente. A outra possibilidade é que haja apenas uma lacuna aqui.
Como posso consertar isso
Além disso, não tenho certeza, mas parece que o contorno do polígono pode ser MUITO GRANDE. Ou seja, pode estar indo além das bordas direita e inferior que eu quero incluir.
Obrigado
- ATUALIZAÇÃO -
Com base em uma sugestão muito agradável da Hovercraft Full of Eels, fiz um exemplo compilável:
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);
}
}
Se você deixar o polígono preenchido em vermelho, poderá obter a imagem abaixo (ampliada em 500%), que mostra que o polígono não se estende até a borda direita. Ou seja, a linha verde vertical corresponde ax=(2*WIDTH)/2
, e embora o polígono vermelho inclua essa coordenada, ele não pinta nenhum pixel lá.
Para ver o problema do gap, mudeired
no programa parablack
. Nesta imagem, você pode ver um espaço sutil no lado inferior direito, onde o contorno desenhado pordrawPolygon
não encontra exatamente o que foi desenhado comfillPolygon
.