<gh_stars>1000+
"""
Additive Wave
by <NAME>. 

Create a more complex wave by adding two waves together. 
"""

xspacing = 8    # How far apart should each horizontal location be spaced
maxwaves = 4    # total # of waves to add together
theta = 0.0

amplitude = []  # Height of wave
# Value for incrementing X, to be calculated as a function of period and
# xspacing
dx = []
yvalues = []


def setup():
    size(640, 360)
    frameRate(30)
    colorMode(RGB, 255, 255, 255, 100)
    w = width + 16
    for i in range(maxwaves):
        amplitude.append(random(10, 30))
        period = random(100, 300)  # How many pixels before the wave repeats
        dx.append((TWO_PI / period) * xspacing)
    for _ in range(w / xspacing + 1):
        yvalues.append(0.0)


def draw():
    background(0)
    calcWave()
    renderWave()


def calcWave():
    global theta
    # Increment theta (try different values for 'angular velocity' here
    theta += 0.02
    # Set all height values to zero
    for i in range(len(yvalues)):
        yvalues[i] = 0
    # Accumulate wave height values
    for j in range(maxwaves):
        x = theta
        for i in range(len(yvalues)):
            # Every other wave is cosine instead of sine
            if j % 2 == 0:
                yvalues[i] += sin(x) * amplitude[j]
            else:
                yvalues[i] += cos(x) * amplitude[j]
            x += dx[j]


def renderWave():
    # A simple way to draw the wave with an ellipse at each location
    noStroke()
    fill(255, 50)
    ellipseMode(CENTER)
    for x, v in enumerate(yvalues):
        ellipse(x * xspacing, height / 2 + v, 16, 16)

