我正在创建一个python模块来简化Pygame,我发现它相当复杂。它具有可以启用和禁用的抗锯齿模式。
我可以使用pygame.draw轻松绘制非抗锯齿的圆
pygame.draw.circle(window, circlecolor, center, radius, 0 if filled else line_width)
但是我必须使用pygame.gfxdraw进行抗锯齿。我可以通过组合gfxdraw.aacircle和fill_circle来绘制填充的抗锯齿圆,但是我不能绘制未填充的抗锯齿圆,除非它们的厚度为1像素(gfxdraw.aacircle没有厚度参数)我已经有一个功能图宽的抗锯齿线与此相同
我的问题是如何创建未填充的抗锯齿圆?我发现的解决方案是通过绘制多条连接的线以形成圆形来手动绘制它们,但我不知道该怎么做,可能会有更快的解决方案。我也不能为中心画一个大圆和一个较小的圆,因为中心不是透明的。
基本上,我每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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句