Я знаю о pygame.draw.polygon()
, но он может обрабатывать только цвета без альфа-значения.Есть ли где-нибудь аналогичная функция, которая может?Я немного искал и ничего не нашел, поэтому попытался написать свой.почему-то он иногда пропускает пиксели (стоит отметить, что он должен работать только для выпуклых четырехугольников).вот оно, заранее извиняюсь за плохо написанный неэффективный код:
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));
Просто для полноты здесь приведен пример того, что я имею в виду, когда говорю «пропал»пиксели ": Каждый из этих четырехугольников нарисован с моей функцией.Вы можете видеть маленькие голубые полосы повсюду, это то, что я имею в виду.
Если подобная функция уже существует, то, очевидно, я предпочитаю это, но если не всякая помощь с функцией, которую я написал, приветствуется.спасибо за любую помощь.