我正在研究一些涉及使用pygame库在表面上绘制圆圈的代码。绘制圆圈的代码如下所示:
surf = pygame.Surface((2000,2000))
pygame.draw.circle(surf,
pygame.Color("white"),
(1000,1000),
508,
50)
问题是生成的圆圈有伪影
无论如何在不获取这些文物的情况下绘制这样的圆圈?
答案 0 :(得分:8)
你看到的很可能是pygame.draw.circle实现的问题。很可能pygame开发人员愚蠢地假设您可以通过按顺序绘制几个圆来绘制粗圆,每个圆增加半径。这在实践中不起作用,你会得到像你看到的那样的莫尔条纹。尝试将圆线粗细增加100或200,看看会发生什么。如果它变得更糟,那就是pygame.draw.circle
的错误。
解决方案是提供自己的圆形渲染程序。这当然可以做到,但为了获得最佳性能,在C / C ++扩展模块中进行pygame或使用OpenGL(带或不带片段着色器)是有意义的。
要为每条扫描线获得一个完美的圆,您必须计算每条扫描线的填充区域的开始和结束。通过使用pygame.draw.line绘制单个扫描线,可以在python中以可承受的性能执行此操作。
答案 1 :(得分:2)
圆圈和圆弧方法的注释中提到了这个错误。 draw.circle documentation的评论中有一个解决方法。这是从该变通方法改编而来的:
def draw_outlined_circle(surf, color, origin, radius, thickness):
width = radius * 2 + thickness * 2
background = (0, 0, 0, 0)
circle = pygame.Surface((width, width)).convert_alpha()
rect = circle.get_rect()
circle.fill(background)
pygame.draw.circle(circle, color, rect.center, radius)
pygame.draw.circle(circle, background, rect.center, radius - thickness)
surf.blit(circle, (origin[0] - (rect.w / 2), origin[1] - (rect.w / 2)))
此方法使用额外的Surface
并绘制两个圆圈:较大圆圈内的较小圆圈以实现相同的效果。较小圆圈的填充颜色的alpha值为0,因此整圆的中心显示为透明。
编辑:从上面的评论中,我看到pygame FAQ中也提到了这种行为。
答案 2 :(得分:0)
我解决了这个问题,它将在pygame的下一个版本(1.9.4)中修复。如何绘制没有文物的圆圈?使用较新版本的pygame。
答案 3 :(得分:0)
这可能是由于pygame.draw.circle实现方式存在问题而发生的。 您可以尝试街机库以获得更好的性能。此外,街机库非常易于使用,而我发现pygame非常复杂。