我正在根据给定的线绘制多边形。我的逻辑运行良好,除非多边形看起来与自身相交。然而,它似乎并不是 100% 一致,根据我正在阅读的内容,它也没有意义。下面是使用相同代码创建的两个图像。黄色多边形是我关心的多边形。
图片:http://i31.tinypic.com/24cxxlf.png
我希望每种情况都像第一种情况一样工作(其中被多边形“包裹”的空白区域未被填充)。
这些图像是由以下代码生成的:
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 文档:
The area inside the polygon is defined using an even-odd fill rule, also known as the alternating rule.
如果我理解正确,那么在这两种情况下,包含在厚多边形“包裹”区域内的像素将恰好穿过两条路径,因此它将被视为多边形“外部”。
所以我的问题是:(a) 我是否理解奇偶填充规则以及 (b) Java 中有没有一种方法可以使第二个图像更像第一个图像?
对此的任何想法将不胜感激。
谢谢。
最佳答案
- 该规则适用于每个多边形。 Java 并不关心您在一条语句之前绘制的多边形。
- 您似乎有点误解了奇偶规则。该规则的实际版本有点像这样......对于多边形交叉的每个“y”坐标,都有一个它交叉的所有 x 坐标的有序列表。多边形的“内部”是从每个偶数索引(0、2、4...)到下一个奇数索引的部分。
关于java - 帮助我理解 Java 多边形填充的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3373648/