使用pygame

时间:2016-03-13 21:29:16

标签: python pygame geometry antialiasing

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

我可以使用 pygame.draw

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

但我必须使用 pygame.gfxdraw 进行抗锯齿处理。我可以通过组合 gfxdraw.aacircle filled_circle 绘制填充的抗锯齿圆圈,但我不能绘制未填充的抗锯齿圆圈,除非它们的厚度为1像素(< em> gfxdraw.aacircle 没有厚度参数)我已经有一个绘制厚抗锯齿线的函数,它与this

相同

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

1 个答案:

答案 0 :(得分:0)

基本上我每隔3°在圆形轮廓上绘制一个带有点的多边形,然后我对圆的内部和外部进行了绘制,然后将所有点连接起来,并形成一个抗锯齿的粗圆。我也将它用于弧

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)