[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] `pygame.draw.line(...)` `width`



Hi,

I don't remember noticing this behavior before, but it seems that the lines' widths are chosen so that the ends, which are also axis-aligned, are the given width. Thus, the lines can be up to about 29% thinner than one would expect.

Here's an example image; note esp. how the diagonal line appears too thin:

The code that generates this is attached.

This doesn't seem very useful behavior, and it make it hard to e.g. add endcaps yourself. At the very least, it's weird and the documentation doesn't lead one to expect it. Having squared-off miter joints, and the line's thickness refer to the thickness of the actual line, would be a vast improvement.

Ian
import pygame
from pygame.locals import *
pygame.init()

screen_size = [600,600]
surface = pygame.display.set_mode(screen_size)

def cappedline(surface, color, p0,p1, width=1):
    pygame.draw.line(surface, color, p0,p1, width)

def get_input():
    for event in pygame.event.get():
        if   event.type == QUIT: return False
        elif event.type == KEYDOWN:
            if   event.key == K_ESCAPE: return False
            elif event.key == K_s: pygame.image.save(surface,"test.png")
    return True

def draw():
    surface.fill((0,0,0))

    width = 50
    pygame.draw.line(surface, (255,0,0), (300,100),(500,100), width)
    pygame.draw.line(surface, (255,0,0), (200,100),(500,300), width)
    pygame.draw.line(surface, (255,0,0), (200,200),(500,500), width)
    pygame.draw.line(surface, (255,0,0), (100,200),(300,500), width)
    pygame.draw.line(surface, (255,0,0), (100,300),(100,500), width)

    pygame.display.flip()

def main():
    while True:
        if not get_input(): break
        draw()
    pygame.quit()
if __name__ == "__main__": main()