Pygame绘制抗锯齿粗线

时间:2015-06-01 16:01:47

标签: python pygame line antialiasing

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

由于.draw不支持抗锯齿功能,因此我转移到了.gfxdrawpygame.gfxdraw.line(window, X0[0], X0[1], X1[0], X1[1], color_L1)

但是,这不允许我定义线的粗细。我怎么能有厚度和抗锯齿在一起?

4 个答案:

答案 0 :(得分:6)

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

1)首先,我们定义形状的中心给定X0_ {x,y}开始和线的X1_ {x,y}端点。

self.view

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

center_L1 = (X0 + X1) / 2.

3)使用斜率和形状参数,您可以计算出盒子末端的以下坐标。

length = 10 # Line size
thickness = 2
angle = math.atan2(X0[1] - X1[1], X0[0] - X1[0])

4)使用计算出的坐标,我们绘制一个消除锯齿的多边形(感谢@martineau),然后按照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)) 网站上的建议填充它。

gfxdraw

答案 1 :(得分:1)

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

您的代码看起来像:

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

然后记得填补表面。这与以下几行有关:

thickLine.fill()

答案 2 :(得分:0)

您还可以使用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))

答案 3 :(得分:0)

您的回答完成了工作,但我认为这将是一种更好/更易读的方法。这是捎带你的答案,尽管如此感谢你。

 | {
    name?: string
    render: (payload: { row: Row }) => string
}

请记住,这更多地将厚度视为半径而不是直径。如果你想让它表现得更像一个直径,你可以将变量的每个实例除以 2。

所以无论如何,这会计算矩形的所有点并将其填充。它通过转到每个点并通过旋转 90 度并向前移动来计算两个相邻点来实现。