Joh*_*ton 12 python mouse pygame paint draw
在我看来,有两种方法可以处理鼠标事件来绘制图片.
第一种是当检测到鼠标移动和画一条线,其中鼠标,示出在这里.然而,这个问题是,在刷子尺寸较大的情况下,每条"直线"之间会出现很多间隙,因为它使用线条的笔划大小来创建粗线.
另一种方法是,当鼠标移动如图所示,以画圈圈这里.问题是如果鼠标移动得比计算机检测到鼠标输入快,则每个圆之间会出现间隙.
这是我的两个问题的屏幕截图:

实现像MS Paint一样的刷子的最佳方法是什么,刷子尺寸相当大,线条中没有间隙或每个圆圈之间没有间隙?
Sin*_*ion 15
为什么不两个都做?
在每个端点处画一个圆圈,在两个端点之间画一条线.
编辑 rofl,只是无法阻止自己.
实际上,你不想使用,pygame.draw.line因为它作弊.它填充像素的1像素宽的行或列(取决于攻角).如果你以大致垂直的角度,0度或90度,这不是问题,但在45年代,你会发现一种菜豆效应.
唯一的解决方案是在每个像素的距离处绘制一个圆.这里...
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()
Run Code Online (Sandbox Code Playgroud)