python画粗线_关于python:Pygame绘制抗锯齿粗线

我曾经在pygame中画线(给定一些起点和终点),如下所示:pygame.draw.line(window, color_L1, X0, X1, 2),其中2定义了线的粗细。

因为.draw不支持抗锯齿,所以我移到了.gfxdraw和pygame.gfxdraw.line(window, X0[0], X0[1], X1[0], X1[1], color_L1)。

但是,这不允许我定义线条的粗细。 我怎么能同时拥有厚度和抗锯齿?

根据线的端点和宽度定义适当的偏移线,并使用它们来定义表示粗线的多边形。 然后使用pygame.gfxdraw.aapolygon()绘制它。

我的线在每一步都在旋转,因此我不确定将其末端定义为多边形,在这种情况下+ -1无效。

以我建议的方式绘制粗线是补偿退化的多边形的情况。 通常涉及大量数学。 请参见使多边形膨胀/收缩(偏移,缓冲)的算法。

经过多次试验和错误,最佳的实现方法如下:

1)首先,根据直线的X0_ {x,y}起点和X1_ {x,y}终点,定义形状的中心。

center_L1 = (X0 + X1) / 2.

2)然后找到直线的斜率(角度)。

length = 10 # Line size

thickness = 2

angle = math.atan2(X0[1] - X1[1], X0[0] - X1[0])

3)使用坡度和形状参数,您可以计算出框末端的以下坐标。

UL = (center_L1[0] + (length / 2.) * cos(angle) - (thickness / 2.) * sin(angle),

center_L1[1] + (thickness / 2.) * cos(angle) + (length / 2.) * sin(angle))

UR = (center_L1[0] - (length / 2.) * cos(angle) - (thickness / 2.) * sin(angle),

center_L1[1] + (thickness / 2.) * cos(angle) - (length / 2.) * sin(angle))

BL = (center_L1[0] + (length / 2.) * cos(angle) + (thickness / 2.) * sin(angle),

center_L1[1] - (thickness / 2.) * cos(angle) + (length / 2.) * sin(angle))

BR = (center_L1[0] - (length / 2.) * cos(angle) + (thickness / 2.) * sin(angle),

center_L1[1] - (thickness / 2.) * cos(angle) - (length / 2.) * sin(angle))

4)使用计算出的坐标,绘制抗锯齿多边形(感谢@martineau),然后按照gfxdraw网站上的建议进行填充。

pygame.gfxdraw.aapolygon(window, (UL, UR, BR, BL), color_L1)

pygame.gfxdraw.filled_polygon(window, (UL, UR, BR, BL), color_L1)

我建议使用一个填充的矩形,如下所示:https://www.pygame.org/docs/ref/gfxdraw.html#pygame.gfxdraw.rectangle。

您的代码如下所示:

thickLine = pygame.gfxdraw.rectangle(surface, rect, color)

然后记得填充表面。遵循以下原则:

thickLine.fill()

非常感谢你! 我和box一样尝试了该方法,但是鉴于我只有行的开始和结束的坐标,所以我找不到如何定义开始和结束的方法。

问题在于我的线正在旋转,所以简单的+ -1是不够的,因为您可能得到的恒定边不会跟随另一端的旋转。

您还可以使用pygame.draw.aalines函数进行一些修改,方法是在原始线条周围绘制+/- 1-N像素的线条副本(是的,虽然效率不高,但是在一定程度上可以工作) )。例如,假设我们有一个要绘制的线段列表:

for segment in self._segments:

if len(segment) > 2:

for i in xrange(self._LINE_WIDTH):

pygame.draw.aalines(self._display, self._LINE_COLOR, False

((x,y+i) for x,y in segment))

pygame.draw.aalines(self._display, self._LINE_COLOR, False,

((x,y-i) for x,y in segment))

pygame.draw.aalines(self._display, self._LINE_COLOR, False

((x+i,y) for x,y in segment))

pygame.draw.aalines(self._display, self._LINE_COLOR, False,

((x-i,y) for x,y in segment))