2015-06-01 38 views
5

Ho usato per disegnare linee (dato alcuni punti di inizio e fine) su pygame come questo: pygame.draw.line(window, color_L1, X0, X1, 2), dove 2 stava definendo lo spessore della linea.Pygame disegna la linea spessa anti-alias

Come, l'anti-aliasing non è supportato da .draw, quindi sono passato a .gfxdraw e pygame.gfxdraw.line(window, X0[0], X0[1], X1[0], X1[1], color_L1).

Tuttavia, questo non mi consente di definire lo spessore della linea. Come potrei avere spessore e anti-aliasing insieme?

+1

Definire le linee di offset corrette in base ai punti finali e alla larghezza della linea e utilizzarle per definire un poligono che rappresenta la linea adipe. Quindi usa 'pygame.gfxdraw.aapolygon()' per disegnarlo. – martineau

+0

La mia linea sta ruotando ad ogni passo quindi non sono sicuro di definire le sue estremità come un poligono, + -1 non funzionerebbe in questo caso. –

+1

Disegnare linee di grasso come ho suggerito è un caso di compensazione di un poligono degenerato. Di solito viene coinvolta una discreta quantità di matematica. Vedi [_Algoritmo per gonfiare/sgonfiare (compensare, buffering) i poligoni_] (http://stackoverflow.com/questions/1109536/an-algorithm-for-inflating-deflating-offsetting-buffering-polygons). – martineau

risposta

5

Dopo molte prove ed errori, il modo migliore per farlo sarebbe il seguente:

1) In primo luogo, si definisce il centro della forma data la X0_ { x, y} start e X1_ {x, y} punti finali della linea.

center_L1 = (X0 + X1)/2. 

2) Quindi individuare la pendenza (angolo) della linea.

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

3) Utilizzando i parametri di inclinazione e forma è possibile calcolare le seguenti coordinate delle estremità della scatola.

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) Usando le coordinate calcolate tracciamo un poligono con anti-aliasing (grazie a @martineau) e poi riempirlo come suggerito sul sito web gfxdraw.

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

Suggerisco un rettangolo pieno, come mostrato qui: https://www.pygame.org/docs/ref/gfxdraw.html#pygame.gfxdraw.rectangle.

Il codice dovrebbe essere simile a:

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

e poi ricordare a riempire la superficie. Questo è lungo le linee di:

thickLine.fill() 
+0

Grazie mille! L'ho provato così come il 'box', ma non riesco a trovare come posso definire l'inizio e la fine dato che ho le coordinate solo dell'inizio e della fine della riga. –

+0

Il problema sta nel fatto che la mia linea sta ruotando in modo che un semplice + -1 non sia abbastanza, in quanto si può finire con un lato costante che non segue la rotazione dell'altra estremità. –