Java 如何绘制和填充有孔的多边形

Java how to draw and fill a Polygon which has holes

我目前正在尝试绘制并填充 Java 中有一个洞的多边形。通常这不是什么大问题,因为我会画外环,然后用背景颜色画内环。

但问题是,多边形显示在应该 "seen" 通过孔的图像上方。

我正在 Java 中编写代码,并使用 JTS Topology Suite 作为我的几何数据。

这是我当前的代码,它只是绘制边框并用颜色填充多边形。

private void drawPolygon(com.vividsolutions.jts.geom.Polygon gpoly, Color color, Graphics2D g2d){

    java.awt.Polygon poly = (java.awt.Polygon)gpoly;

    for(Coordinate co : gpoly.getExteriorRing().getCoordinates() {
        poly.addPoint(co.x, co.y);
    }
    g2d.setColor(col);
    g2d.fill(poly);

    g2d.setColor(Color.BLACK);
    g2d.draw(poly);
}

遗憾的是 java.awt.Polygon 不支持带孔的多边形。

你可以先填充多边形,然后在上面画洞,给人一种它填充了除了洞之外的所有东西的错觉。

  • 使用 Polygon 作为 Area 的基础(例如称为 polygonShape)。
  • 为 'hole' 创建一个 Ellipse2D,然后为它创建一个 Area (ellipseShape)。
  • 使用 Area.subtract(Area) 类似于:

    Area polygonWithHole = polygonShape.subtract(ellipseShape);
    

有一些方法可以绘制比简单多边形更复杂的形状或区域(另一个答案已经提到 Area)。

除此之外,您还可以尝试 镶嵌 您的最终多边形。有很多算法可以做到这一点。对于更复杂的形状,算法也会变得更复杂。基本上,您将最终形状分成小多边形(通常是三角形,但也可以是其他形状),然后绘制这些多边形。

您可以通过搜索 "Tessellation Algorithm" 来查看您的可能性,还有一些已经实现的库Java.

您可以使用 java.awt.geom.Path2D 渲染一个 "compound shape" 有一个洞:

  • 如果您有 java.awt.Shape 个定义形状内外边缘的对象,请使用 append(shape, false) 添加每个形状。

  • 如果你有一组外边的路径点和一组内边的路径点,使用lineTo()添加第一组点 - 创建一个封闭的通过以您开始的相同点结束或调用 closePath() 来自动关闭循环来循环。然后使用 moveTo() 创建中断,然后再通过更多 lineTo() 调用添加内部点集。

在任何一种情况下,您必须创建将Path.WIND_NON_ZERO传递给构造函数的路径 - 否则洞将不会被填满。

有关更长的代码示例,请参阅 How to create shape with a hole?