0

我一直想知道java如何填充他的多边形,我自己一直在尝试使用扫描线算法等等等,这些算法到现在为止已经完全扭曲了,所以我让自己想知道Java是如何做到的?因为这看起来很清楚,它是否也使用扫描线或者它是一种完全不同的算法?(我试过在源代码中搜索它,但是地狱,那是一个迷宫。)

问候

4

1 回答 1

1

Open JDK 源代码可在线获得。因此,您可以自己查看代码,尽管您应该记住,通过查看该代码,并使用您对自己代码的“灵感”,您可能会受到 OpenJDK 许可条件的约束,所以除非您愿意为您的代码使用兼容的许可证,否则不要仔细查看。

  1. 从 开始,这是包含您可能会使用share/classes/java/awt/Graphics.java的代码的界面。fillPolygon它是一个抽象方法,因此您必须查看实现该接口的类。
  2. share/classes/sun/java2d/SunGraphics2D.java就是这样一个。它只是将fillPolygon调用委托给对象上的匹配调用sun.java2d.pipe.PixelFillPipe。但由于这只是一个接口,您将不得不再次寻找实现。
  3. share/classes/sun/java2d/pipe/BufferedRenderPipe.java是一种可能的实现方式。它的fill实现利用了一种fillSpans方法,其核心是用本机代码实现的。
  4. share/native/sun/java2d/pipe/BufferedRenderPipe.c有相应的实现。因此,一旦您通过查看代码了解了跨度是什么以及多边形如何转换为跨度,那么这可能会告诉您跨度是如何呈现的。

以上所有只是一种可能的代码路径。这在很大程度上取决于您使用的平台以及您要绘制的内容。打印有不同的原语,大多数平台都有不同的原语。例如,在(非加速)X11 连接上,solaris/native/sun/java2d/x11/X11Renderer.c将简单地委托给XFillPolygon. 还有基于 OpenGL 的图形的自定义代码,但我现在看不到填充优化。但仔细观察可能会很好。

于 2013-05-27T07:12:34.373 回答