用pygame绘制原语时的工件?

2024-07-03 07:15:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

问题是产生的圆有瑕疵 Circle with artifacts

有没有办法在没有得到这些文物的情况下画一个这样的圆?在


Tags: 代码绘制情况surfacepygamesurfcolorwhite
3条回答

你看到的很可能是pygame.draw.circle游戏实施。最有可能的pygame开发人员愚蠢地认为,可以通过依次绘制几个圆来绘制厚圆,每个圆的半径增加一个。这在实践中是行不通的,你会得到像你看到的那样的云纹图案。试着把圆线的厚度增加100或200,看看会发生什么。如果情况变得更糟,那就是pygame.draw.circle的错。在

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

要为每条扫描线获得一个完美的圆,您必须计算每个扫描线填充区域的起点和终点。在python中使用pygame.draw.line绘制单独的扫描线。在

在圆和弧方法的注释中提到了这个错误。在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中也提到了这种行为。在

我修复了这个问题,它将在pygame的下一个版本(1.9.4)中出现。你怎么画出那样的圆而没有人工制品?使用新版本的pygame。在

相关问题 更多 >