【问题标题】:draw lines with round edges in pygame在pygame中画圆边线
【发布时间】:2021-11-21 03:27:19
【问题描述】:

我如何在没有图像的 pygame 中绘制这样的东西:

【问题讨论】:

标签: python pygame line


【解决方案1】:

您可以在线条的每一端画一个圆圈。但是,质量不是那么好。您需要调整线的与圆的半径。使用pygame.draw.polygon 画一条粗线可以获得更好的效果。使用opencv-pythoncv2.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()

【讨论】:

    【解决方案2】:

    画一条线,然后在两端画两个圆圈:

    pygame.draw.line(surface, color, start, end, width)
    pygame.draw.circle(surface, color, start, width/2)
    pygame.drae.circle(surface, color, end, width/2)
    

    【讨论】:

    • 感谢指正。
    猜你喜欢
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多