Python 使用pyglet绘制多边形可创建不需要的重叠区域

Python 使用pyglet绘制多边形可创建不需要的重叠区域,python,python-3.x,opengl,pyglet,shapely,Python,Python 3.x,Opengl,Pyglet,Shapely,我试图用pyglet绘制一个填充多边形,我得到了不需要的重叠区域 我的(极简主义)代码: 结果: 我还尝试了来自的答案,得到了相同的结果。Pyglet基于OpenGL。不推荐使用的OpenGL类型GL\u POLYGON只能正确处理凸多边形。 您必须对多边形进行三角剖分,并且必须使用以下类型中的一种:GL\u三角形,GL\u三角形或GL\u三角形 例如,使用基本类型GL_三角形并通过4个三角形将形状缝合在一起: num\u pts=12 pts_seq=[ 500, 129, 505, 92,

我试图用
pyglet
绘制一个填充多边形,我得到了不需要的重叠区域

我的(极简主义)代码:

结果:


我还尝试了来自的答案,得到了相同的结果。

Pyglet基于OpenGL。不推荐使用的OpenGL类型
GL\u POLYGON
只能正确处理凸多边形。
您必须对多边形进行三角剖分,并且必须使用以下类型中的一种:
GL\u三角形
GL\u三角形
GL\u三角形

例如,使用基本类型
GL_三角形
并通过4个三角形将形状缝合在一起:

num\u pts=12
pts_seq=[
500, 129, 505, 92, 505, 114,
500, 129, 505, 114, 516, 114,
500, 129, 516, 114, 520, 129,
516, 114, 516, 93, 520, 129]
颜色=[255,255,200,100]
pyglet.graphics.draw(
点数,点数
pyglet.gl.gl_三角形#
('v2i',pts#U seq),#数据点
('c4B',颜色*num_pts),#颜色数据
)
或者更改点的顺序,并使用基本类型
GL\u三角形\u条带

num\u pts=6
pts_seq=[505,92,500,129,505,114,520,129,516,114,516,93]
颜色=[255,255,200,100]
pyglet.graphics.draw(
点数,点数
pyglet.gl.gl_三角带#
('v2i',pts#U seq),#数据点
('c4B',颜色*num_pts),#颜色数据
)

@Rabbib76回答了这个问题,我想用一种策略来完成它,对任意多边形进行三角剖分,这不再是原始问题的一部分,因此本文将作为答案

我的解决方案与我正在处理的代码部分的开发方式有关,即正确地使用

from shapely.geometry import Polygon as shPolygon
from shapely.ops import triangulate as shTriangulate

for pol_points in list_pol_points:
    obj_polygon = shPolygon(self.points)
    triangulated_objs = shTriangulate(obj_polygon)
    
    for sub_obj in triangulated_objs:
        if sub_obj.centroid.within(obj_polygon):
            sub_obj_points = list(sub_obj.exterior.coords)
            num_pts = len(sub_obj_points)
            pts_seq = []

            for point in sub_obj_points:
                pts_seq.append(point[0])
                pts_seq.append(point[1])

            pyglet.graphics.draw(
                num_pts,  # points count
                pyglet.gl.GL_POLYGON,  #
                ('v2i', pts_seq),  # data points
                ('c4B', color * num_pts),  # color data
            )

这回答了你的问题吗?您好@rabbi76,我喜欢使用
GL_TRIANGLE_STRIP
的第二个选项,因为我只需要按正确的顺序排列点,这样合并的三角形就可以生成多边形,而不会彼此重叠。但是有没有办法将多边形自动分解为正确的点序列?我有许多帧,每个帧都有原始问题中显示的多边形的细微变化(点的数量和位置),最终可能包含一个完全不同的形状。“[…]有没有办法自动将多边形分解为正确的点序列”-没有,不是在OpenGL或pyglet中。你必须自己实现一个算法。搜索“三角测量”
from shapely.geometry import Polygon as shPolygon
from shapely.ops import triangulate as shTriangulate

for pol_points in list_pol_points:
    obj_polygon = shPolygon(self.points)
    triangulated_objs = shTriangulate(obj_polygon)
    
    for sub_obj in triangulated_objs:
        if sub_obj.centroid.within(obj_polygon):
            sub_obj_points = list(sub_obj.exterior.coords)
            num_pts = len(sub_obj_points)
            pts_seq = []

            for point in sub_obj_points:
                pts_seq.append(point[0])
                pts_seq.append(point[1])

            pyglet.graphics.draw(
                num_pts,  # points count
                pyglet.gl.GL_POLYGON,  #
                ('v2i', pts_seq),  # data points
                ('c4B', color * num_pts),  # color data
            )