pygam中具有透明性的任意多边形

2024-09-28 01:26:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道pygame.draw.polygon(),但它只能处理没有alpha值的颜色。有没有一个类似的功能,可以?我找了一点也没找到,所以我试着自己写。不知何故,它偶尔会漏掉像素(值得注意的是,它只需要为凸四边形工作)。在这里,我为写得不好的低效代码提前道歉:

def fill_quad(A, B, C, D, color=(0, 255, 100, 100)):
    M = quad_center(A, B, C, D);

    dxA, dyA = A[0] - M[0], A[1] - M[1];
    dxB, dyB = B[0] - M[0], B[1] - M[1];
    dxC, dyC = C[0] - M[0], C[1] - M[1];
    dxD, dyD = D[0] - M[0], D[1] - M[1];

    dist = max(math.hypot(dxA, dyA), math.hypot(dxB, dyB), math.hypot(dxC, dyC), math.hypot(dxD, dyD));
    dxA, dyA, dxB, dyB, dxC, dyC, dxD, dyD = map(lambda d: d / dist, (dxA, dyA, dxB, dyB, dxC, dyC, dxD, dyD));
    for i in range(0, int(dist)+1, 1):
        connect(A, B, C, D, color=color);
        A = A[0] - dxA, A[1] - dyA;
        B = B[0] - dxB, B[1] - dyB;
        C = C[0] - dxC, C[1] - dyC;
        D = D[0] - dxD, D[1] - dyD;

quad_center返回由四个点组成的多边形的中心,connect连接点,就像pygame.draw.lines一样,但它可以实现透明。问题似乎在于dxAdxB等和dyAdyB等(因为它们的步长太大),这就是它丢失像素的原因。问题不在于我的connect函数,因为我在使用pygame的内置函数时也遇到同样的问题。要在您的计算机上运行此操作,只需将connect(A, B, C, D, color=color)替换为pygame.draw.lines(screen, color, True, (A, B, C, D)),并将其用于quad_center

def midpoint(A, B):
    return (A[0] + B[0]) / 2, (A[1] + B[1]) / 2;

def quad_center(A, B, C, D):
    return midpoint(midpoint(A, B), midpoint(C, D));

为了完整起见,这里有一个我说“缺少像素”的例子: example of missing pixels 每个四边形都是用我的函数画的。你到处都能看到蓝色的条纹,这就是我指的

如果像这样的函数已经存在,显然我更喜欢它,但如果没有任何帮助,我写的函数是感激的。谢谢你的帮助


Tags: 函数mathpygamecolorcenterquadhypotdxc

热门问题