Как нарисовать сглаженную круговую линию определенной толщины? Как установить ширину в pygame.gfx.aacircle()?

#python #user-interface #pygame #antialiasing

Вопрос:

Например pygame.draw.circle(Surface, color, pos, radius, width) , я хочу получить сглаженный круг.

Но, там нет опции о ширине вкл pygame.gfxdraw.aacircle() .

Кто-нибудь знает альтернативный способ?

Ответ №1:

Ни модуль pygame.draw, ни модуль pygame.gfxdraw не предоставляют функции для сглаженного круга с масштабируемой толщиной. В то время pygame.draw.circle() как можно нарисовать круг разной ширины, pygame.gfxdraw.circle() можно нарисовать тонкий, сглаженный круг.


Вы можете попробовать сшить круг с а pygame.draw.circle() для тела и pygame.gfxdraw.circle() по краям. Однако качество низкое и может зависеть от системы:

 def drawAACircle(surf, color, center, radius, width):
    pygame.gfxdraw.aacircle(surf, *center, 100, color)  
    pygame.gfxdraw.aacircle(surf, *center, 100-width, color)  
    pygame.draw.circle(surf, color, center, radius, width) 
 

Я рекомендую нарисовать изображение со сглаженным кругом и затемнить изображение. Вы можете создать изображение с помощью OpenCV (opencv-python). См. раздел Функции рисования OpenCV.

Минимальный пример:

 import pygame
import cv2
import numpy

def drawAACircle(surf, color, center, radius, width):
    circle_image = numpy.zeros((radius*2 4, radius*2 4, 4), dtype = numpy.uint8)
    circle_image = cv2.circle(circle_image, (radius 2, radius 2), radius-width//2, (*color, 255), width, lineType=cv2.LINE_AA)  
    circle_surface = pygame.image.frombuffer(circle_image.flatten(), (radius*2 4, radius*2 4), 'RGBA')
    surf.blit(circle_surface, circle_surface.get_rect(center = center))

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill((32, 32, 32))
    drawAACircle(window, (255, 0, 0), window.get_rect().center, 100, 20)
    pygame.display.flip()