#!/usr/bin/env python3

import numpy as np
import os
import sys
import time
import colorsys

Nx = int(sys.argv[1])
Ny = int(sys.argv[2])
iterations = 10

class Slider:
    def __init__(self, lo, hi, step, pos=0):
        self.lo = lo
        self.hi = hi
        self.stepSize = step
        self.pos = pos
        self.dir = 1
    
    def step(self):
        if self.pos >= self.hi:
            self.dir = -1
        elif self.pos <= self.lo:
            self.dir = 1
        
        self.pos += self.dir * self.stepSize
        return self.pos

Sa = Slider(-10, 10, 0.1/iterations, np.random.uniform(-2, 2))
Sb = Slider(-10, 10, 0.2/iterations, np.random.uniform(-2, 2))
Sc = Slider(-10, 10, 0.2/iterations, np.random.uniform(-2, 2))
Sd = Slider(-10, 10, 0.1/iterations, np.random.uniform(-2, 2))
Se = Slider(-10, 10, 0.2/iterations, np.random.uniform(-2, 2))
Sf = Slider(0, 6, 0.05/iterations, 0)

x, y = np.meshgrid(
    np.linspace(-4, 4, Nx),
    np.linspace(-4, 4, Ny))

color = 1.0

img = np.zeros( [Ny, Nx, 3] )

cr = 1.0
cg = 0.5
cb = 0.25

step = 0
while True:
    a = Sa.step()
    b = Sb.step()
    c = Sc.step()
    d = Sd.step()
    e = Se.step()
    f = Sf.step()

    Sa.pos += b*0.001
    Sb.pos += c*0.001
    Sc.pos += d*0.001
    Sd.pos += e*0.001
    Se.pos += f*0.001
    Sf.pos += a*0.001

    curve = (np.abs(a*x**2 + b*x*y + c*y**2 + d*x + e*y + f) <= 1.5)*1

    cr, cg, cb = colorsys.hsv_to_rgb(color, 1, 1)

    img[:,:,0] = np.where(curve > 0, curve*cr*255, img[:,:,0])
    img[:,:,1] = np.where(curve > 0, curve*cg*255, img[:,:,1])
    img[:,:,2] = np.where(curve > 0, curve*cb*255, img[:,:,2])

    step += 1
    if step % iterations == 0:
        out = img.reshape((Nx*Ny*3,)).astype(np.uint8)
        os.write(1, out.tobytes())
        time.sleep(0.01)

    color = (color+0.01/iterations ) % 1



