Python >> Python tutoriál >  >> Python GUI >> Pygame GUI

Artefakty při kreslení primitiv pomocí pygame?

To, co vidíte, je s největší pravděpodobností problém s implementací pygame.draw.circle. S největší pravděpodobností vývojář pygame pošetile předpokládal, že můžete nakreslit tlustý kruh nakreslením několika kruhů za sebou, přičemž u každého kruhu se zvýší poloměr o jeden. To v praxi nebude fungovat a získáte vzor moaré jako ten, který vidíte. Zkuste zvýšit tloušťku kruhové čáry o 100 nebo 200 a uvidíte, co se stane. Pokud se to zhorší, pak je to pygame.draw.circle chyba.

Řešením by bylo poskytnout vlastní rutinu vykreslování kruhů. To lze jistě provést, ale pro optimální výkon má smysl to udělat v rozšiřujícím modulu C/C++ pro pygame NEBO pomocí OpenGL (s nebo bez fragment shaderů).

Chcete-li získat dokonalý kruh pro každý skenovací řádek, budete muset vypočítat začátek a konec vyplněné oblasti pro každý skenovací řádek. Mohlo by to být možné provést v pythonu s přijatelným výkonem pomocí pygame.draw.line k vykreslení jednotlivých skenovacích čar.


Tato chyba je zmíněna v komentářích u metod kruhu a oblouku. V komentářích k dokumentaci draw.circle je jedno řešení. Toto je přizpůsobeno tomuto řešení:

def draw_outlined_circle(surf, color, origin, radius, thickness):
    width = radius * 2 + thickness * 2
    background = (0, 0, 0, 0)
    circle = pygame.Surface((width, width)).convert_alpha()
    rect = circle.get_rect()
    circle.fill(background)
    pygame.draw.circle(circle, color, rect.center, radius)
    pygame.draw.circle(circle, background, rect.center, radius - thickness)
    surf.blit(circle, (origin[0] - (rect.w / 2), origin[1] - (rect.w / 2)))

Tato metoda používá navíc Surface a nakreslí dva kruhy:menší kruh uvnitř většího pro dosažení stejného efektu. Barva výplně menšího kruhu má alfa 0, takže střed celého kruhu se jeví jako průhledný.

EDIT:Z výše uvedeného komentáře vidím, že chování je zmíněno také v pygame FAQ.


Tento problém jsem opravil a bude v příštím vydání pygame (1.9.4). Jak nakreslíte takové kruhy bez artefaktů? Použijte novější verzi pygame.