Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java如何绘制和填充有洞的多边形_Java_Awt_Draw_Polygon_Jts - Fatal编程技术网

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

Java如何绘制和填充有洞的多边形,java,awt,draw,polygon,jts,Java,Awt,Draw,Polygon,Jts,我目前正试图在Java中绘制和填充一个有洞的多边形。通常这不会是一个大问题,因为我会画外环,然后用背景的颜色画内环 但问题是,多边形显示在图像上方,应该通过孔“看到” 我正在用Java编写代码,并将其用于几何数据 这是我当前的代码,它只绘制边界并用颜色填充多边形 private void drawPolygon(com.vividsolutions.jts.geom.Polygon gpoly, Color color, Graphics2D g2d){ java.awt.Polygo

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


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

我正在用Java编写代码,并将其用于几何数据

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

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);
}

遗憾的是,它不支持带孔的多边形。

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

  • 使用
    多边形
    作为
    区域
    的基础(例如称为
    多边形形状
  • 为“孔”创建一个
    Ellipse2D
    ,然后为其建立一个
    区域(
    ellipseShape
  • 使用类似于:

    Area polygonWithHole = polygonShape.subtract(ellipseShape);
    

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

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

      您可以通过搜索“细分算法”来查看您的可能性,也有一些已经实现的Java库。

      您可以使用它来渲染带有孔的“复合形状”:

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

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

      在任何一种情况下,您都必须创建一条路径,该路径将
      path.WIND_NON_ZERO
      传递给构造器-否则该孔将不会保持未填充状态


      请参阅较长的代码示例。

      “但问题是,多边形显示在图像上方,应该通过孔“看到”。cheseaux是对的,遗憾的是,这不是正确的答案:(你必须对图像进行剪裁,然后在多边形上绘制。这是一个解决方案,但我正在寻找一种正确绘制多边形的方法。我的多边形中的孔通常也是多边形形状,而不是椭圆,它是否也适用于你的方法?感谢友好和快速的回答。我目前无法尝试和c感谢您的建议,因为我不在工作电脑前。是的,我已经阅读了文档。我会尽快将结果发布到coding@AndrewThompson我完全同意,尽管我会把评论写得更友好一些。@brimborium“我会把评论写得更友好一些。”去吧。我对FB很“友好”。“是的,这个答案成功了”很高兴你把它整理好了。加上1表示“捡起球并带着它跑”的主动性。“感谢你和brimborium的帮助”提示:添加@brimborium(或任何人,
      @
      很重要)通知此人一条新评论。谢谢你的回答,我会研究它。使用你的方法意味着每次我必须绘制多边形时都要对每个多边形进行镶嵌。我有大约30000个多边形要在屏幕上绘制,其中大约有100个多边形有洞。我会检查这将如何影响性能。或者,我必须保存t从类中开始绘制多边形的essellated版本,并绘制此(我更喜欢此版本)@LBecker我只是为了完整性而给出了这个答案。我想我更愿意使用
      区域
      或类似的东西。我认为这可能会影响性能。如果性能是一个问题,你必须考虑所有选项,并找出哪一个是最好的。