7

我正在编写一些代码,涉及使用 pygame 库在表面上画一个圆。绘制圆圈的代码如下所示:

  surf = pygame.Surface((2000,2000))
  pygame.draw.circle(surf, 
                     pygame.Color("white"),
                     (1000,1000),
                     508,
                     50)

问题是生成的圆圈有伪影 有文物的圆圈

反正有没有画这样的圆圈而没有得到这些文物?

4

4 回答 4

9

您看到的很可能是 pygame.draw.circle 实现的问题。最有可能的 pygame 开发人员愚蠢地假设您可以通过依次绘制多个圆来绘制粗圆,每个圆增加一个半径。这在实践中是行不通的,你会得到像你看到的那样的云纹图案。尝试将圆线粗细增加 100 或 200,看看会发生什么。如果情况变得更糟,那就是pygame.draw.circle他的错。

一个解决方案是提供您自己的圆形渲染例程。这当然可以完成,但为了获得最佳性能,在 pygame 的 C/C++ 扩展模块中或使用 OpenGL(带或不带片段着色器)中这样做是有意义的。

要为每条扫描线获得一个完美的圆,您必须计算每条扫描线的填充区域的开始和结束。通过使用 pygame.draw.line 绘制单独的扫描线,可以在 python 中以可容忍的性能执行此操作。

于 2012-04-13T22:22:26.867 回答
2

在 circle 和 arc 方法的注释中提到了这个错误。draw.circle 文档的评论中有一种解决方法。这是改编自该解决方法:

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 中也提到了这种行为。

于 2012-04-14T12:44:51.477 回答
2

我修复了这个问题,它将在 pygame (1.9.4) 的下一个版本中。你如何在没有人工制品的情况下画出这样的圆圈?使用更新版本的 pygame。

于 2018-02-10T11:23:48.887 回答
0

这可能发生在 pygame.draw.circle 是如何实现的问题上。您可以尝试使用街机库以获得更好的性能。此外,街机库非常易于使用,而我发现 pygame 相当复杂。

于 2020-11-02T05:17:49.343 回答