如何使用 Python 和 pygame 创建 MS Paint 克隆
回答问题 如我所见,有两种方法可以处理鼠标事件来绘制图片。 第一个是检测鼠标何时移动并画一条线到鼠标所在的位置,此处显示为。但是,这样做的问题是,对于较大的画笔大小,每条不直的“线”之间会出现许多间隙,因为它使用线条的笔触大小来创建粗线。 另一种方法是在鼠标移动时绘制圆圈,如图所示此处。这样做的问题是,如果鼠标移动的速度快于计算机检测到鼠标输入的速度,每个圆圈之间就会出现间隙。 这是我的两个问题的
·
回答问题
如我所见,有两种方法可以处理鼠标事件来绘制图片。
第一个是检测鼠标何时移动并画一条线到鼠标所在的位置,此处显示为。但是,这样做的问题是,对于较大的画笔大小,每条不直的“线”之间会出现许多间隙,因为它使用线条的笔触大小来创建粗线。
另一种方法是在鼠标移动时绘制圆圈,如图所示此处。这样做的问题是,如果鼠标移动的速度快于计算机检测到鼠标输入的速度,每个圆圈之间就会出现间隙。
这是我的两个问题的屏幕截图:
实现像 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()
更多推荐
已为社区贡献126473条内容
所有评论(0)