Java 如何绘制和填充有孔的多边形
Java how to draw and fill a Polygon which has holes
我目前正在尝试绘制并填充 Java 中有一个洞的多边形。通常这不是什么大问题,因为我会画外环,然后用背景颜色画内环。
但问题是,多边形显示在应该 "seen" 通过孔的图像上方。
我正在 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 不支持带孔的多边形。
你可以先填充多边形,然后在上面画洞,给人一种它填充了除了洞之外的所有东西的错觉。
- 使用
Polygon
作为 Area
的基础(例如称为 polygonShape
)。
- 为 'hole' 创建一个
Ellipse2D
,然后为它创建一个 Area
(ellipseShape
)。
使用 Area.subtract(Area)
类似于:
Area polygonWithHole = polygonShape.subtract(ellipseShape);
有一些方法可以绘制比简单多边形更复杂的形状或区域(另一个答案已经提到 Area
)。
除此之外,您还可以尝试 镶嵌 您的最终多边形。有很多算法可以做到这一点。对于更复杂的形状,算法也会变得更复杂。基本上,您将最终形状分成小多边形(通常是三角形,但也可以是其他形状),然后绘制这些多边形。
您可以通过搜索 "Tessellation Algorithm" 来查看您的可能性,还有一些已经实现的库Java.
您可以使用 java.awt.geom.Path2D 渲染一个 "compound shape" 有一个洞:
如果您有 java.awt.Shape
个定义形状内外边缘的对象,请使用 append(shape, false)
添加每个形状。
如果你有一组外边的路径点和一组内边的路径点,使用lineTo()
添加第一组点 - 创建一个封闭的通过以您开始的相同点结束或调用 closePath()
来自动关闭循环来循环。然后使用 moveTo()
创建中断,然后再通过更多 lineTo()
调用添加内部点集。
在任何一种情况下,您必须创建将Path.WIND_NON_ZERO
传递给构造函数的路径 - 否则洞将不会被填满。
有关更长的代码示例,请参阅 How to create shape with a hole?。
我目前正在尝试绘制并填充 Java 中有一个洞的多边形。通常这不是什么大问题,因为我会画外环,然后用背景颜色画内环。
但问题是,多边形显示在应该 "seen" 通过孔的图像上方。
我正在 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 不支持带孔的多边形。
你可以先填充多边形,然后在上面画洞,给人一种它填充了除了洞之外的所有东西的错觉。
- 使用
Polygon
作为Area
的基础(例如称为polygonShape
)。 - 为 'hole' 创建一个
Ellipse2D
,然后为它创建一个Area
(ellipseShape
)。 使用
Area.subtract(Area)
类似于:Area polygonWithHole = polygonShape.subtract(ellipseShape);
有一些方法可以绘制比简单多边形更复杂的形状或区域(另一个答案已经提到 Area
)。
除此之外,您还可以尝试 镶嵌 您的最终多边形。有很多算法可以做到这一点。对于更复杂的形状,算法也会变得更复杂。基本上,您将最终形状分成小多边形(通常是三角形,但也可以是其他形状),然后绘制这些多边形。
您可以通过搜索 "Tessellation Algorithm" 来查看您的可能性,还有一些已经实现的库Java.
您可以使用 java.awt.geom.Path2D 渲染一个 "compound shape" 有一个洞:
如果您有
java.awt.Shape
个定义形状内外边缘的对象,请使用append(shape, false)
添加每个形状。如果你有一组外边的路径点和一组内边的路径点,使用
lineTo()
添加第一组点 - 创建一个封闭的通过以您开始的相同点结束或调用closePath()
来自动关闭循环来循环。然后使用moveTo()
创建中断,然后再通过更多lineTo()
调用添加内部点集。
在任何一种情况下,您必须创建将Path.WIND_NON_ZERO
传递给构造函数的路径 - 否则洞将不会被填满。
有关更长的代码示例,请参阅 How to create shape with a hole?。