Как сделать: Перекрытие серых точек в пигаме - PullRequest
3 голосов
/ 27 марта 2019

Я работаю над пигмеей со случайными движущимися точками.Точки движутся по черной поверхности.Цель состоит в том, чтобы добавить цвета RGB точек в случае их наложения.На следующем изображении 3 точки, которые перекрываются.Как я могу сложить RGB из точек?Примером на изображении являются три точки перекрытия.Часть точки, которая перекрывается, должна иметь цвет [3 * 250 / N, 3 * 250 / N., 3 * 250 / N] с N = 4, часть должна иметь цвет [187.5,187.5,187.5].Части точек, которые не перекрываются, должны оставаться основным цветом точки [250 / N, 250 / N, 250 / N].

Я не знаю, как сложить цвета RGB.Есть идеи?

enter image description here

И текущий код:

import math
import random
import pygame
import random

N = 4

class focalspot(object):
    def __init__(self,dirnx=0,dirny=0,color=(250/N,250/N,250/N)):
        self.pos = 100,100
        self.dirnx = 0
        self.dirny = 0
        self.color = color


    def move(self, dirnx, dirny):
        self.dirnx = dirnx
        self.dirny = dirny
        self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)
        if self.pos[0] >= width:
            self.dirnx = -self.dirnx
        if self.pos[1] >= width:
            self.dirny = -self.dirny
        if self.pos[0] <= 0:
            self.dirnx = -self.dirnx
        if self.pos[1] <= 0:
            self.dirny = -self.dirny

    def draw(self, surface):
        pygame.draw.circle(surface, self.color, self.pos, 80, 0) 

dots = [focalspot() for i in range(N)]

def redrawWindow(surface,dots):
    global rows, width
    surface.fill((0,0,0))
    for dot in dots:
        focalspot.draw(dot,surface)
    pygame.display.update()


def main(flag,dots):
    global width, rows
    width = 400
    win = pygame.display.set_mode((width, width))

    counter = 0
    clock = pygame.time.Clock()    
    while flag:
        pygame.time.delay(50)
        clock.tick(10)
        for dot in dots:
            dot.dirnx = int(random.uniform(-10, 10))
            dot.dirny = int(random.uniform(-10, 10))
            focalspot.move(dot,dot.dirnx,dot.dirny)
        redrawWindow(win,dots)
        pygame.image.save(win,'temp'+str(counter)+'.png')
        counter =+ 1
        print(counter)



main(True,dots)

1 Ответ

6 голосов
/ 27 марта 2019

Вы должны использовать класс Surface, чтобы рисовать круги. Это позволяет использовать специальные флаги , например, BLEND_ADD, который будет делать то, что вы хотите:

import pygame

class Dot:
    def __init__(self, pos=None):
        self.image = pygame.Surface((50, 50))
        self.image.set_colorkey((2, 4, 6))
        self.image.fill((2, 4, 6))
        pygame.draw.circle(self.image, (50, 50, 50), (25, 25), 25, 0)
        self.rect = self.image.get_rect(center=pos or (0, 0))

def main():
    screen = pygame.display.set_mode((400, 400))

    dot = Dot()
    dots = [dot, *[Dot(pos) for pos in ((50, 50), (100, 200), (120, 230), (200, 300), (300, 150))]]

    clock = pygame.time.Clock()    
    while True:
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                return

        dot.rect.center = pygame.mouse.get_pos()

        screen.fill(pygame.Color('black'))
        for d in dots:
            screen.blit(d.image, d.rect, special_flags=pygame.BLEND_ADD)
        pygame.display.flip()
        clock.tick(60)

if __name__ == '__main__':
    main()

enter image description here

...