我目前正在尝试绘制并填充一个在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不支持有漏洞的多边形。
答案 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)
你可以先填充多边形,然后在顶部绘制孔,给人一种错觉,即除了洞之外,它还可以填充所有东西。