Skip to content

Borealis

from gridmas import *
import math
import random

name = "Aurora Borealis"
author = "Claude 3.5"

flow_speed = RangeAttr("Flow Speed", 0.02, 0.01, 0.1, 0.01)
color_shift_speed = RangeAttr("Color Shift Speed", 0.01, 0.001, 0.05, 0.001)
wave_frequency = RangeAttr("Wave Frequency", 1.5, 0.5, 3.0, 0.1)
sparkle_chance = RangeAttr("Sparkle Chance", 0.0005, 0.0001, 0.01, 0.0001)

def draw():


    color1 = Color(0, 255, 100)  # Green
    color2 = Color(100, 200, 255)  # Light blue
    color3 = Color(255, 100, 200)  # Pink

    time = 0
    while True:
        for i, pixel in enumerate(pixels()):
            # Calculate the base wave using the pixel's x and y coordinates
            wave = math.sin(wave_frequency.get() * (pixel.x + pixel.y) + time)

            # Add vertical movement
            wave += math.sin(wave_frequency.get() * 0.5 * pixel.z + time * 1.5)

            # Normalize the wave to [0, 1]
            wave = (wave + 2) / 4

            # Calculate color based on the wave and time
            if wave < 0.33:
                factor = wave * 3
                color = Color.mix(color1, color2, factor)
            elif wave < 0.67:
                factor = (wave - 0.33) * 3
                color = Color.mix(color2, color3, factor)
            else:
                factor = (wave - 0.67) * 3
                color = Color.mix(color3, color1, factor)

            # Add occasional sparkle
            if random.random() < sparkle_chance.get():
                color = Color(255, 255, 255)  # White sparkle

            set_pixel(i, color)

        yield
        time += flow_speed.get()

        # Slowly shift the colors over time
        hue_shift = color_shift_speed.get()
        color1 = Color.hsl((time * hue_shift) % 1, 1, 0.5)
        color2 = Color.hsl(((time * hue_shift) + 0.33) % 1, 1, 0.6)
        color3 = Color.hsl(((time * hue_shift) + 0.67) % 1, 1, 0.7)