【问题标题】:Draw not-filled antialiased circles with pygame使用 pygame 绘制未填充的抗锯齿圆
【发布时间】:2016-03-13 21:29:16
【问题描述】:

我正在创建一个 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 没有粗细参数)我已经有一个绘制粗抗锯齿线的函数,它与this

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

【问题讨论】:

    标签: python pygame geometry antialiasing


    【解决方案1】:

    基本上,我在圆的轮廓上每隔 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      相关资源
      最近更新 更多