Java如何绘制和填充具有空洞的多边形

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个回答

5
  • Use the Polygon as the basis for an Area (e.g. called polygonShape).
  • Create an Ellipse2D for the 'hole', then establish an Area for it (ellipseShape).
  • Use Area.subtract(Area) something like:

    Area polygonWithHole = polygonShape.subtract(ellipseShape);
    

我的多边形中的空洞通常也是多边形形状,而不是椭圆形状,您的方法也适用吗? - LBecker
感谢友好且迅速的回答。目前我无法尝试您的建议,因为我不在我的工作电脑旁边。是的,我已经阅读了文档。我会尽快发布我的结果,一旦我能够开始编码。 - LBecker
@AndrewThompson 我完全同意,虽然我会把这条评论表达的更友好一些。 ;) - brimborium
1
@brimborium:“我会把评论说得更友好一些。” 好的,去吧。在Facebook上我很“友好”。 - Andrew Thompson
是的,这个答案解决了问题。感谢您和brimborium的帮助。 - LBecker
3
"没错,这个答案解决了问题。很高兴你能够解决它并且加分鼓励你积极主动地采取行动。" "感谢你和brimborium提供的帮助。" 提示:在评论中加入@brimborium(或其他人,@很重要)以通知该人有新的评论。 - Andrew Thompson

1

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

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

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


谢谢你的回答,我会研究一下。不过,使用你的方法意味着每次绘制多边形都需要tesselate它们。我需要在屏幕上绘制大约30,000个多边形,其中有100个有孔。我会检查这样做对性能的影响。另外,我可以从一开始就将多边形的tessellated版本保存在类中并进行绘制(我更喜欢这种方式)。 - LBecker
@LBecker 我只是为了完整性而提供了这个答案。我认为我更愿意使用“Area”或类似的东西。不过这可能也会影响性能。如果性能是一个问题,你就必须查看所有选项并找出最好的选项。 - brimborium

1
你可以使用 java.awt.geom.Path2D 来渲染带有孔洞的“复合形状”:
  • 如果你有定义形状外边缘和内边缘的 java.awt.Shape 对象,使用 append(shape, false) 添加每个形状。

  • 如果你有一组用于外边缘和一组用于内边缘的路径点,请使用 lineTo() 添加第一组点 - 通过以相同的点结束或调用 closePath() 自动关闭循环来创建闭合循环。然后使用 moveTo() 创建一个分隔符,在通过更多的 lineTo() 调用添加内部点之前。

在任何情况下,你必须在构造函数中传递 Path.WIND_NON_ZERO 来创建路径 - 否则孔洞将不会留出未填充的空间。

请参见如何创建带有孔的形状?,其中有更长的代码示例。


-1
你可以先填充多边形,然后在上面绘制孔洞,从而营造出填满所有区域但留下孔洞的错觉。

2
但问题是,多边形显示在一个图像上方,这个图像应该通过孔被“看到”。 - cheseaux
cheseaux是正确的,但不幸的是这不是正确的答案 :( - LBecker
你需要剪切图像的一部分并将其绘制在多边形上方。 - Zymus
这可能是一个解决方案,但我正在寻找一种正确绘制多边形的方法。 - LBecker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接