使用 pygame 绘制未填充的抗锯齿圆圈

Draw not-filled antialiased circles with pygame

我正在创建一个 python 模块来简化 Pygame 我发现它相当复杂。它有一个可以启用和禁用的抗锯齿模式。

我可以使用 pygame.draw

轻松绘制非抗锯齿圆圈
pygame.draw.circle(window, circlecolor, center, radius, 0 if filled else line_width)

但我必须使用 pygame.gfxdraw 来抗锯齿。我可以通过组合 gfxdraw.aacirclefilled_circle 来绘制填充的抗锯齿圆圈,但我不能绘制未填充的抗锯齿圆圈,除了如果它们的厚度为 1 像素(gfxdraw.aacircle 没有厚度参数)我已经有一个绘制粗抗锯齿线的函数,它与

我的问题是如何创建未填充的抗锯齿圆圈?我找到的解决方案是通过绘制多条连接线来手动绘制它们以形成圆圈,但我不知道该怎么做,可能会有 更快的解决方案 。另外我不能画一个大圆圈和一个小圆圈作为中心,因为中心不透明。

基本上我画了一个多边形,每隔 3° 在圆的轮廓上画一个点,我对圆的内部和外部都这样做,然后所有的点都连接起来,它形成了一个抗锯齿的粗圆。我也将它用于 arcs

def arc(center, xradius, yradius, start_angle, stop_angle, color=BLACK)
    arc_length = (stop_angle - start_angle)  # Arc length
    segment_length = math.radians(3) * min(xradius, yradius)  # Length of one segment
    segment_length = max((segment_length, 2))  # Minimum length of 2

    nb_pts = int(arc_length/2*xradius*yradius / segment_length) + 1  # Nb points
    angle = arc_length / (nb_pts-1)  # Angle between each points
    points = []
    width = line_width//2  # Line thickness (half on each side of the circle)
    for i in range(nb_pts):  # Inner border
        x = round(math.cos(start_angle + angle*i) * (xradius-width) + center[0])
        y = round(-math.sin(start_angle + angle*i) * (yradius-width) + center[1])  # - is for counter clockwise
        points.append((x, y))  # Add point

    for i in range(nb_pts-1, -1, -1):  # Outer border
        x = round(math.cos(start_angle + angle*i) * (xradius+width) + center[0])
        y = round(-math.sin(start_angle + angle*i) * (yradius+width) + center[1])
        points.append((x, y))  # Add point

    polygon(points, color, True)  # True is for filled polygon

我这样调用函数来绘制一个圆,改变 xradius 和 yradius 为椭圆

arc(center, radius, radius, 0, 2*math.pi, color)