使用 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.aacircle 和 filled_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)
我正在创建一个 python 模块来简化 Pygame 我发现它相当复杂。它有一个可以启用和禁用的抗锯齿模式。
我可以使用 pygame.draw
轻松绘制非抗锯齿圆圈pygame.draw.circle(window, circlecolor, center, radius, 0 if filled else line_width)
但我必须使用 pygame.gfxdraw 来抗锯齿。我可以通过组合 gfxdraw.aacircle 和 filled_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)