使用 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_TRIANGLES
、GL_TRIANGLE_STRIP
或 GL_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
)
我正在尝试用 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_TRIANGLES
、GL_TRIANGLE_STRIP
或 GL_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
)