I'd also be in favor of this change to squared-off miter joints. I've
noticed the odd endcap behavior in Pygame a long time ago, and it's one
reason that I never used the line drawing function for lines with large
widths.

-Al

On Sat, Apr 28, 2018 at 1:35 PM, Ian Mallett <i...@geometrian.com> wrote:

> ​By the way, a solution doesn't even need to use any trigonometry, because
> a squared-off miter joint is by-definition orthogonal to the line. Here's
> some proof-of-concept code:
>
> def rndint(x): return int(round(x))
> def cappedline(surface, color, p0,p1, width=1, rounded=True):
>     radius = width * 0.5
>     delta = ( p1[0]-p0[0], p1[1]-p0[1] )
>     orthog = [ delta[1], -delta[0] ]
>     scale = radius / (orthog[0]*orthog[0] + orthog[1]*orthog[1])**0.5
>     orthog[0]*=scale; orthog[1]*=scale
>     points = [
>         ( p0[0]-orthog[0], p0[1]-orthog[1] ),
>         ( p0[0]+orthog[0], p0[1]+orthog[1] ),
>         ( p1[0]+orthog[0], p1[1]+orthog[1] ),
>         ( p1[0]-orthog[0], p1[1]-orthog[1] )
>     ]
>     pygame.draw.polygon(surface, color, points)
>     if rounded:
>         #Could have added these to the polygon points instead, but then
> we'd have had to choose a subdivision accuracy.
>         pygame.draw.circle(surface, color, (rndint(p0[0]),rndint(p0[1])),
> rndint(radius))
>         pygame.draw.circle(surface, color, (rndint(p1[0]),rndint(p1[1])),
> rndint(radius))
> pygame.draw.cappedline = cappedline
>
> Note that this also supports rounded corners by drawing circles on the
> ends, although this is rather limited by the (poor) accuracy of the circle
> drawing routine, and doesn't look fabulous at small widths.
>
> Ian
>

Reply via email to