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

标签 java graphics polygon

我正在根据给定的线绘制多边形。我的逻辑运行良好,除非多边形看起来与自身相交。然而,它似乎并不是 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 中有没有一种方法可以使第二个图像更像第一个图像?

对此的任何想法将不胜感激。

谢谢。

最佳答案

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

关于java - 帮助我理解 Java 多边形填充的奇怪之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3373648/

相关文章:

java - ReportNG HTML 报告未更新

java - Libgdx Spritebatch 错误

python - 如何加速python的 'turtle'函数并在最后停止卡住

用于计算任意多面体的表面积和体积的Python库

java - 使用来自 android 的 apache commons 邮件包发送电子邮件

java - 给定一个字符串,在第 50 个位置插入一个新的换行符并排除整个单词

java - 在java中使加号成为一个字符串

c - opengl:关于 glutMainLoop() 的问题

javascript多边形相交

Libgdx多边形三角剖分