【问题标题】:Help me understand Java Polygon Fill oddness帮助我理解 Java 多边形填充的奇怪之处
【发布时间】:2023-03-07 11:13:02
【问题描述】:

我正在根据给定的线绘制多边形。我的逻辑运行良好,除非多边形看起来与自身相交。但是,它似乎不是 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 文档:

定义了多边形内的区域 使用奇偶填充规则,也 称为交替规则。

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

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

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

谢谢。

【问题讨论】:

    标签: java graphics polygon


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

    【讨论】:

    • @cHao - 好的,但这似乎无法解决为什么第一个多边形填充正确,而第二个多边形没有。如果我理解你在说什么,我们正在研究这样的事情。对于给定的行(y 坐标),我们将有以下内容(请原谅我可怜的 ascii 艺术): ------| |-----------| |------- 我不想填充的填充区域不是仍然在一个会被偶数索引的区域中吗?
    • @Dante617:不,不是。就像我提到的,规则是每个多边形。
    • @cHao - 好的,我想我明白你在说什么。本质上,一旦它真正相交,我最终会得到两个多边形(在这种情况下是两个“正方形”,一个在另一个中)。当它填满时,它最终会填满两次。内广场和外广场。这就解释了为什么里面比其他地方稍微暗一些,因为它被填充了两次,而不仅仅是一次。当然,现在的问题是,我怎样才能让它按照我想要的方式运行。
    • @Dante617:嗯,在当前情况下,您可以将笔画设置为较宽的值,绘制多边形,然后将其设置回细线并再次绘制相同的多边形。这将为您提供示例中的第一张图片。
    • @cHao - 是的,但这并不适用于所有情况。本质上,我被赋予了多边形的边界作为一组点。因此,虽然在这种情况下,只是将其画得更大会起作用,但并非在所有情况下都可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多