【发布时间】:2021-11-21 03:27:19
【问题描述】:
【问题讨论】:
【问题讨论】:
您可以在线条的每一端画一个圆圈。但是,质量不是那么好。您需要调整线的与圆的半径。使用pygame.draw.polygon 画一条粗线可以获得更好的效果。使用opencv-python 和cv2.line() 可以获得最佳结果。另见Drawing Functions in OpenCV:
在以下示例中,红线是用pygame.draw.line 绘制的线,橙色线是用pygame.draw.polygon 绘制的线,黄线是用OpenCV 绘制的线:
import pygame
import cv2, numpy
def draw_line_round_corners(surf, p1, p2, c, w):
pygame.draw.line(surf, c, p1, p2, w)
pygame.draw.circle(surf, c, p1, w // 2)
pygame.draw.circle(surf, c, p2, w // 2)
def draw_line_round_corners_polygon(surf, p1, p2, c, w):
p1v = pygame.math.Vector2(p1)
p2v = pygame.math.Vector2(p2)
lv = (p2v - p1v).normalize()
lnv = pygame.math.Vector2(-lv.y, lv.x) * w // 2
pts = [p1v + lnv, p2v + lnv, p2v - lnv, p1v - lnv]
pygame.draw.polygon(surf, c, pts)
pygame.draw.circle(surf, c, p1, round(w / 2))
pygame.draw.circle(surf, c, p2, round(w / 2))
def draw_line_round_corners_cv(surf, p1, p2, color, w):
rect = pygame.Rect(*p1, p2[0]-p1[0], p2[1]-p1[1])
rect.normalize()
rect.inflate_ip(w, w)
line_image = numpy.zeros((rect.height, rect.width, 4), dtype = numpy.uint8)
c = pygame.Color(color)
line_image = cv2.line(line_image, (w//2, w//2), (p2[0]-p1[0]+w//2, p2[1]-p1[1]+w//2), (c.r, c.g, c.b, c.a), thickness=w)
line_surface = pygame.image.frombuffer(line_image.flatten(), rect.size, 'RGBA')
surf.blit(line_surface, line_surface.get_rect(center = rect.center))
pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
window.fill(0)
draw_line_round_corners(window, (50, 50), (300, 300), "red", 20)
draw_line_round_corners_polygon(window, (50, 100), (250, 350), "orange", 20)
draw_line_round_corners_cv(window, (100, 50), (350, 250), "yellow", 20)
pygame.display.flip()
clock.tick(60)
pygame.quit()
exit()
【讨论】:
画一条线,然后在两端画两个圆圈:
pygame.draw.line(surface, color, start, end, width)
pygame.draw.circle(surface, color, start, width/2)
pygame.drae.circle(surface, color, end, width/2)
【讨论】: