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

Draw polygon with pyglet creates not wanted overlapping regions

我正在尝试用 pyglet 绘制一个填充多边形,但在不需要的地方出现了重叠区域。

我的(极简)代码:

num_pts = 6 
pts_seq = [500, 129, 505, 92, 505, 114, 516, 114, 516, 93, 520, 129]
color= [255, 255, 200, 100]

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

结果:

我也尝试了 的答案,得到了相同的结果。

Pyglet 基于 OpenGL。已弃用的 OpenGL Primitive 类型 GL_POLYGON 只能正确处理凸多边形。
您必须对多边形进行三角剖分,并且必须使用 Triangle primitive 类型中的一种 GL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FAN.

例如使用原始类型 GL_TRIANGLES 并通过 4 个三角形拼接形状:

num_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]
color= [255, 255, 200, 100]

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

或者改变点的顺序,使用原始类型GL_TRIANGLE_STRIP:

num_pts = 6
pts_seq = [505, 92, 500, 129, 505, 114, 520, 129, 516, 114, 516, 93]

color= [255, 255, 200, 100]

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

@Rabbib76 回答了这个问题,我想用三角化任意多边形的策略来完成它,这不再是原始问题的一部分,因此这个 post 作为答案。

我的解决方案与我正在处理的代码部分的开发方式有关,即利用 shapely:

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
            )