我知道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
那样连接点,但它可以进行透明处理。麻烦似乎出在dxA
,dxB
等以及dyA
,dyB
等(因为步数太大)上,这就是为什么错过了像素。问题不在于我的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));
仅出于完整性考虑,这是当我说“缺少像素”时的意思的示例: 这些四边形中的每一个都是用我的函数绘制的。您到处都能看到蓝色的小条纹,这就是我的意思。
如果已经存在这样的函数,显然我更喜欢这样做,但是如果没有对我编写的函数的任何帮助,我们将不胜感激。感谢您的帮助。