8. LERP so šumom

from pygame import *
from random import *

WIDTH = 256
HEIGHT = 256
BLOCK = 3
screen = display.set_mode([BLOCK * WIDTH, BLOCK * HEIGHT])

noise_seed = []
for i in range(WIDTH):
    noise_seed.append(random())

def perlin_noise_1d(seed, octaves, scaling_bias):
    output = []
    for x in range(len(seed)):
        noise = 0
        scale = 1
        scale_acc = 0
        pitch = len(seed)

        for o in range(octaves):
            sample1 = (x // pitch) * pitch
            sample2 = (sample1 + pitch) % len(seed)

            blend = (x - sample1) / pitch
            sample = (1 - blend) * seed[sample1] + blend * seed[sample2]
            noise += sample * scale

            scale_acc += scale
            scale /= scaling_bias
            pitch //= 2

        output.append(noise / scale_acc)
    return output

def generate(rate, scl):
    points = perlin_noise_1d(noise_seed, rate, scl)

    for i in range(len(points)):
        x = BLOCK * i
        y = BLOCK * int(HEIGHT // 2 - (points[i] * HEIGHT / 2))
        draw.rect(screen, Color(0, 255, 0), Rect([x, y], [BLOCK, BLOCK*HEIGHT // 2 - y]))

rate = 1
scl = 2
while True:
    for ev in event.get():
        if ev.type == KEYDOWN:
            if ev.key == K_SPACE:
                rate += 1
                if rate > 8:
                    rate = 1
            elif ev.key == K_UP:
                scl += 0.2
            elif ev.key == K_DOWN:
                scl -= 0.2
                if scl <= 0.2:
                    scl = 0.2
            screen.fill(Color(0, 0, 0))
            generate(rate, scl)

    display.update()
    time.delay(20)