安卓OpenGL ES - 如何绘制一个填充的凹多边形?

7

我正在使用OpenGL ES为Android创建一个2D Openstreetmap渲染应用程序。

不幸的是,我在绘制由大约50个或更多点组成的凹多边形方面遇到了困难。为了实现填充我的多边形,我正在使用GL10.GL_TRIANGLE_FAN:

gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertBuff); // size = 2 because 2D

gl.glDrawElements(GL10.GL_TRIANGLE_FAN, pointCount, GL10.GL_UNSIGNED_SHORT, indexBuff);

这种方法对于简单的多边形可以正常工作,比如像这样画一个多边形完全没有问题: enter image description here 我的问题是,GL_TRIANGLE_FAN总是从第一个点(在此例中为a)开始,并使用另外两个点绘制三角形,直到整个形状完成。
如果需要绘制更复杂的多边形,则可能会出现问题,就像这里看到的一样: (在此示例中,流经城市的河流是一个复杂的多边形) enter image description here 现在我的问题是如何避免这个问题,以便即使是复杂的多边形也能正确地绘制和填充?
问题出在绘制凹多边形上。
当使用GL_TRIANGLE_STRIP而不是GL_TRIANGLE_FAN时,多边形被绘制正确,但仅通过三角形将它们的点连接在一起,而多边形本身没有填充。

GL_TRIANGLE_FAN 只能可靠地绘制凸多边形 - user2864740
2个回答

2

鉴于您谈论的是OpenGL ES,这与此处的iOS问题非常相似:OpenGL ES - 如何绘制填充多边形?

在上面的帖子中,我列出并测试了5个第三方三角剖分库,但它们都不令人满意。

总之:

  1. OpenGL ES没有三角剖分,因此不支持绘制填充的凹多边形(更不用说带孔的多边形...)
  2. 要坚持使用OpenGL ES绘图,必须找到一个第三方库来进行三角剖分(这并不容易...)
  3. 使用graphics.Paint(Android) / CoreGraphics(iOS)来绘制填充路径,但性能较低

我已经寻找了相当长时间的轻量级且免费的三角剖分库,但是...


-4

凸包是一个凹多边形,我想这可能会让你走上正确的道路 :) - BenjaminFranklin
2
一个凸包怎么可能是凹的东西呢?:| - user2864740
一个凹面是指向内弯曲的东西,所以凸包确实是向内弯曲的,并且通常是向内弯曲的...遗憾的是如果我的建议对你完全没有帮助。祝你有美好的一天。 - BenjaminFranklin

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