#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()