2015-06-01 107 views
5

我用pygame绘制线(给出一些起点和终点),如下所示:pygame.draw.line(window, color_L1, X0, X1, 2),其中2是定义线的粗细。Pygame绘制反锯齿粗线

由于抗锯齿不支持.draw,所以我搬到.gfxdrawpygame.gfxdraw.line(window, X0[0], X0[1], X1[0], X1[1], color_L1)

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

+1

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

+0

我的线在每一步都在旋转,所以我不确定将其末端定义为多边形,在这种情况下+ -1不起作用。 –

+1

以我建议的方式绘制胖线是抵消退化多边形的一种情况。通常涉及相当数量的数学。请参阅[_An算法为膨胀/缩小(偏移,缓冲)polygons_](http://stackoverflow.com/questions/1109536/an-algorithm-for-inflating-deflating-offsetting-buffering-polygons)。 – martineau

回答

5

许多试验和错误之后,最佳的方式做这将是如下:

1)首先,我们定义给出的X0_ {形状的中心x,y} start和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) 
1

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

您的代码看起来是这样的:

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

,然后记得要补的表面。这是沿着线:

thickLine.fill() 
+0

非常感谢!我试过以及'box',但是我找不到我如何定义开始和结束,因为我只有线的开始和结束的坐标。 –

+0

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