帮助我理解Java多边形填充的奇怪之处

帮助我理解Java多边形填充的奇怪之处,java,graphics,polygon,Java,Graphics,Polygon,我正在基于给定的线绘制多边形。我的逻辑运行良好,除了多边形似乎与其自身相交的情况。然而,它似乎不是100%一致的,根据我所读的,它也没有意义。下面是使用相同代码创建的两个图像。黄色的多边形是我关心的 图片: 我希望每个案例都像第一个案例一样工作(没有填充多边形“包裹”的空白区域) 这些图像由以下代码生成: BufferedImage drawingImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Grap

我正在基于给定的线绘制多边形。我的逻辑运行良好,除了多边形似乎与其自身相交的情况。然而,它似乎不是100%一致的,根据我所读的,它也没有意义。下面是使用相同代码创建的两个图像。黄色的多边形是我关心的

图片:

我希望每个案例都像第一个案例一样工作(没有填充多边形“包裹”的空白区域)

这些图像由以下代码生成:

BufferedImage drawingImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = drawingImage.createGraphics();
Polygon polygon = new Polygon(parsedPoints[0], parsedPoints[1], parsedPoints[0].length);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g.setColor(drawingColor);
g.fillPolygon(polygon);
float[] scales = {1f, 1f, 1f, 0.7f};
float[] offsets = new float[4];
RescaleOp rop = new RescaleOp(scales, offsets, null);
graphics.drawImage(drawingImage, rop, 0, 0);
graphics.setStroke(new BasicStroke(2));
graphics.setColor(drawingColor);
graphics.drawPolygon(polygon);
(我正在填充多边形并应用重缩放以获得填充的透明度,然后绘制没有透明度的边界。)

根据Graphics.fillPolygon方法的Java文档:

多边形内的区域已定义 也可以使用奇偶填充规则 被称为交替规则

如果我理解正确,那么在这两种情况下,被厚多边形“包裹”的区域内包含的像素将恰好相交于两条路径,因此它将被视为多边形的“外部”

所以我的问题是:(a)我是否理解奇偶填充规则,以及(b)在Java中是否有办法使第二个图像更像第一个图像

如果您对此有任何想法,我们将不胜感激

谢谢

  • 该规则适用于每个多边形。Java甚至不关心您在一条语句之前绘制的多边形
  • 你似乎有点误解了奇偶规则。该规则的实际版本有点像这样…对于多边形交叉的每个“y”坐标,都有一个它交叉的所有x坐标的有序列表。多边形的“内部”是从每个偶数编号索引(0、2、4…)到下一个奇数编号索引的部分

  • @赵-好的,但这似乎无法解决为什么第一个多边形填充正确,而第二个多边形填充不正确。如果我理解你说的话,我们正在看类似的东西。对于给定的一行(y坐标),我们应该有以下内容(请原谅我糟糕的ascii技巧):—————————————————————————————————————————————————————————————————————————————————————————————————————————。就像我提到的,规则是每个多边形-好的,我想我理解你的意思。本质上,一旦它真的相交,我就会得到两个多边形(在这个例子中是两个“正方形”,一个在另一个内)。当它充满时,它最终会充满两次。里面的广场和外面的广场。这就解释了为什么里面比其他地方稍微暗一些,因为它被填充了两次,而不是一次。当然,现在的问题是,我怎样才能让它按我所希望的方式工作。@Dante617:好吧,在目前的情况下,你可以将笔划设置为某个宽度,绘制多边形,然后将其设置回一个较薄的多边形,然后再次绘制相同的多边形。这将为您提供示例中的第一个图像。@cHao-是的,但这并不适用于所有情况。本质上,我得到了多边形的边界作为一组点。所以,虽然在这种情况下,只是把它画大一点就行了,但在所有情况下都不行。