Алгоритм водной пульсации не дает точных результатов - PullRequest
2 голосов
/ 05 марта 2020

Источники, которые я использовал для написания этого кода: https://web.archive.org/web/20160418004149/http: //freespace.virgin.net/hugo.elias/graphics/x_water.htm и https://www.youtube.com/watch?v=BZUdGqeOD0w . Проблема, с которой я сталкиваюсь, заключается в том, что он часто выдает отрицательные числа, которые не подходят для цвета Вот мой код (я знаю, что я не должен использовать PyGame для пикселей, и я планирую использовать OpenGL в будущем):

import pygame
pygame.init()

cols = 200
rows = 200

window = pygame.display.set_mode((cols, rows))

buffer1 = [[0 for _ in range(rows)] for _ in range(cols)]
buffer2 = buffer1.copy()

buffer1[100][100] = 255         #Raindrop


dampening = 0.97


running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False

    for i in range(1, cols - 1):
        for j in range(1, rows - 1):
            buffer2[i][j] = ((buffer1[i+1][j] + buffer1[i-1][j] + buffer1[i][j+1] + buffer1[i][j-1]) / 2) - buffer2[i][j]
            buffer2[i][j] = buffer2[i][j] * dampening

    #Displaying the buffer
    for i in range(cols):
        for j in range(rows):
            window.fill((buffer2[i][j], buffer2[i][j], buffer2[i][j]), (i, j, 1, 1))

    #Swapping the buffers
    buffer1, buffer2 = buffer2, buffer1

    pygame.display.update()

pygame.display.quit()
pygame.quit()

Я боролся с этим некоторое время сейчас и Теперь я наконец обращаюсь к вам за помощью. Заранее спасибо.

1 Ответ

0 голосов
/ 06 марта 2020

Проблема, с которой я столкнулся при работе с алгоритмом, состоит в том, что он часто выдает отрицательные числа, которые недопустимы для цвета.

Я предлагаю привязать значения цвета к диапазону [ 0, 255]. например:

c = max(0, min(255, buffer2[i][j]))
window.fill((c, c, c), (i, j, 1, 1))
...