代码之家  ›  专栏  ›  技术社区  ›  MikeTheReader

帮助我理解Java多边形填充奇怪现象

  •  1
  • MikeTheReader  · 技术社区  · 15 年前

    我正在根据给定的线绘制多边形。我有很好的逻辑计算,除非在一些情况下,它似乎是多边形相交本身。然而,它似乎不是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);
    

    (我正在填充多边形,应用重缩放以获得填充的透明度,然后绘制不带透明度的边框。)

    根据JavaDig.FieldOrthon方法的Java文档:

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

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

    因此,我的问题是:(a)我是否理解偶数填充规则,(b)在Java中有没有办法使第二个图像更像第一个?

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

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  2
  •   cHao    15 年前
    1. 规则适用于每个多边形。Java不关心你画的多边形,甚至在一个声明之前。
    2. 你似乎有点误解了这个偶数规则。规则的实际版本有点像这样……对于多边形交叉的每个“y”坐标,都有一个包含所有x坐标的有序列表。多边形的“内部”是从每个偶数索引(0,2,4…)到下一个奇数索引的部分。