2015-06-01 139 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是不夠的,因爲你最終可能會得到一個不跟隨另一端旋轉的恆定邊。 –