pygame中具有透明度的任意多边形

时间:2019-04-28 16:04:21

标签: python pygame

我知道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返回由四个点组成的多边形的中心,connectpygame.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 这些四边形中的每一个都是用我的函数绘制的。您到处都能看到蓝色的小条纹,这就是我的意思。

如果已经存在这样的函数,显然我更喜欢这样做,但是如果没有对我编写的函数的任何帮助,我们将不胜感激。感谢您的帮助。

0 个答案:

没有答案