Java如何绘制和填充具有洞

时间:2015-10-20 14:50:21

标签: java awt draw polygon jts

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

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

我正在用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 个答案:

答案 0 :(得分:4)

  • 使用Polygon作为Area的基础(例如,称为polygonShape)。
  • 为'洞'创建Ellipse2D,然后为其Area建立ellipseShape
  • 使用Area.subtract(Area)之类的内容:

    Area polygonWithHole = polygonShape.subtract(ellipseShape);
    

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

您可以使用java.awt.geom.Path2D呈现带有洞的“复合形状”:

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

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

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

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

答案 3 :(得分:-1)

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