4

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

但问题是,多边形显示在应该通过孔“看到”的图像上方。

我正在用 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不支持带孔的多边形。

4

4 回答 4

5
  • 使用Polygon作为基础Area(例如称为polygonShape)。
  • Ellipse2D为“洞”创建一个,然后Area为它创建一个 ( ellipseShape)。
  • 使用Area.subtract(Area)类似的东西:

    Area polygonWithHole = polygonShape.subtract(ellipseShape);
    
于 2015-10-21T19:47:09.733 回答
1

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

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

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

于 2015-10-21T20:00:46.380 回答
1

您可以使用java.awt.geom.Path2D渲染一个带有孔的“复合形状”:

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

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

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

请参阅如何创建带孔的形状?对于更长的代码示例。

于 2016-11-03T09:02:17.750 回答
-1

您可以先填充多边形,然后在顶部绘制孔,给人一种错觉,它填充了除了孔之外的所有东西。

于 2015-10-20T14:56:18.320 回答