我一直想知道java如何填充他的多边形,我自己一直在尝试使用扫描线算法等等等,这些算法到现在为止已经完全扭曲了,所以我让自己想知道Java是如何做到的?因为这看起来很清楚,它是否也使用扫描线或者它是一种完全不同的算法?(我试过在源代码中搜索它,但是地狱,那是一个迷宫。)
问候
Open JDK 源代码可在线获得。因此,您可以自己查看代码,尽管您应该记住,通过查看该代码,并使用您对自己代码的“灵感”,您可能会受到 OpenJDK 许可条件的约束,所以除非您愿意为您的代码使用兼容的许可证,否则不要仔细查看。
share/classes/java/awt/Graphics.java
的代码的界面。fillPolygon
它是一个抽象方法,因此您必须查看实现该接口的类。share/classes/sun/java2d/SunGraphics2D.java
就是这样一个。它只是将fillPolygon
调用委托给对象上的匹配调用sun.java2d.pipe.PixelFillPipe
。但由于这只是一个接口,您将不得不再次寻找实现。share/classes/sun/java2d/pipe/BufferedRenderPipe.java
是一种可能的实现方式。它的fill
实现利用了一种fillSpans
方法,其核心是用本机代码实现的。share/native/sun/java2d/pipe/BufferedRenderPipe.c
有相应的实现。因此,一旦您通过查看代码了解了跨度是什么以及多边形如何转换为跨度,那么这可能会告诉您跨度是如何呈现的。以上所有只是一种可能的代码路径。这在很大程度上取决于您使用的平台以及您要绘制的内容。打印有不同的原语,大多数平台都有不同的原语。例如,在(非加速)X11 连接上,solaris/native/sun/java2d/x11/X11Renderer.c
将简单地委托给XFillPolygon
. 还有基于 OpenGL 的图形的自定义代码,但我现在看不到填充优化。但仔细观察可能会很好。