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
)