回答问题

如我所见,有两种方法可以处理鼠标事件来绘制图片。

第一个是检测鼠标何时移动并画一条线到鼠标所在的位置,此处显示为。但是,这样做的问题是,对于较大的画笔大小,每条不直的“线”之间会出现许多间隙,因为它使用线条的笔触大小来创建粗线。

另一种方法是在鼠标移动时绘制圆圈,如图所示此处。这样做的问题是,如果鼠标移动的速度快于计算机检测到鼠标输入的速度,每个圆圈之间就会出现间隙。

这是我的两个问题的屏幕截图:

http://imgur.com/32DXN.jpg

实现像 MS Paint 这样的画笔的最佳方法是什么,画笔大小相当大,线条的笔划没有间隙或每个圆圈之间没有间隙?

Answers

为什么不两者都做?

在每个端点处画一个圆圈,并在两者之间画一条线。

编辑 rofl,就是无法阻止自己。

实际上,您不想使用pygame.draw.line,因为它会作弊。它填充 1 像素宽的行或列(取决于攻角)像素。如果您确实以大致垂直的角度,0 度或 90 度,这不是问题,但在 45 度时,您会注意到一种 string bean 效果。

唯一的解决方案是在每个像素的距离处画一个圆圈。这里...

import pygame, random

screen = pygame.display.set_mode((800,600))

draw_on = False
last_pos = (0, 0)
color = (255, 128, 0)
radius = 10

def roundline(srf, color, start, end, radius=1):
    dx = end[0]-start[0]
    dy = end[1]-start[1]
    distance = max(abs(dx), abs(dy))
    for i in range(distance):
        x = int( start[0]+float(i)/distance*dx)
        y = int( start[1]+float(i)/distance*dy)
        pygame.draw.circle(srf, color, (x, y), radius)

try:
    while True:
        e = pygame.event.wait()
        if e.type == pygame.QUIT:
            raise StopIteration
        if e.type == pygame.MOUSEBUTTONDOWN:
            color = (random.randrange(256), random.randrange(256), random.randrange(256))
            pygame.draw.circle(screen, color, e.pos, radius)
            draw_on = True
        if e.type == pygame.MOUSEBUTTONUP:
            draw_on = False
        if e.type == pygame.MOUSEMOTION:
            if draw_on:
                pygame.draw.circle(screen, color, e.pos, radius)
                roundline(screen, color, e.pos, last_pos,  radius)
            last_pos = e.pos
        pygame.display.flip()

except StopIteration:
    pass

pygame.quit()
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐