Pygame绘制抗锯齿粗林

2024-10-05 11:03:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

由于.draw不支持反走样,所以我转到了.gfxdraw和{}。在

但是,这不允许我定义线的厚度。如何将厚度和抗锯齿结合在一起?在


Tags: l1定义linewindowpygamecolorx1起点
3条回答

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

你的代码看起来像:

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

然后记得填充表面。其思路如下:

^{pr2}$

经过多次尝试和错误之后,最好的方法是:

1)首先,我们定义形状的中心,给定直线的X0{x,y}起点和X1{x,y}终点。在

center_L1 = (X0 + X1) / 2.

2)然后求出直线的斜率(角度)。在

^{pr2}$

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)

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

相关问题 更多 >

    热门问题