произвольный многоугольник с прозрачностью в пигаме - PullRequest
1 голос
/ 28 апреля 2019

Я знаю о 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));

Просто для полноты здесь приведен пример того, что я имею в виду, когда говорю «пропал»пиксели ": example of missing pixels Каждый из этих четырехугольников нарисован с моей функцией.Вы можете видеть маленькие голубые полосы повсюду, это то, что я имею в виду.

Если подобная функция уже существует, то, очевидно, я предпочитаю это, но если не всякая помощь с функцией, которую я написал, приветствуется.спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...