Параметрический Цветочек

Точки для построения основы цветка вычисляются в функции makeStar()

function makeStar(X, Y, scale, seed){
    let tmpArr = [];
    for (let t = 0; t <= 2*Math.PI; t+=Math.PI/seed){
        let x = scale*Math.cos(t*19)*Math.tan(t*16);
        let y = scale*Math.sin(t*19)*Math.tan(t*16);
 
        //const newX = x * Math.cos(Math.PI/6) - y * Math.sin(Math.PI/6);
        //const newY = x * Math.sin(Math.PI/6) + y * Math.cos(Math.PI/6);
 
        tmpArr.push(new Point(X+x, Y+y));
    }
 
    return tmpArr;
}

Стебель представлен в виде B-сплайна

function makeBSpline(array){
    array.unshift(array[0]);
    array.unshift(array[0]);
 
    array.push(array[array.length-1]);
    array.push(array[array.length-1]);
 
    let tmpArr = [];
    for (let i = 1; i < array.length-2; i++){
        let a0 = (array[i-1].x + 4*array[i].x + array[i+1].x)/6;  
        let a1 = (-array[i-1].x + array[i+1].x)/2;
        let a2 = (array[i-1].x - 2*array[i].x + array[i+1].x)/2; 
        let a3 = (-array[i-1].x + 3*array[i].x - 3*array[i+1].x + array[i+2].x)/6;
 
        let b0 = (array[i-1].y + 4*array[i].y + array[i+1].y)/6;  
        let b1 = (-array[i-1].y + array[i+1].y)/2;
        let b2 = (array[i-1].y - 2*array[i].y + array[i+1].y)/2; 
        let b3 = (-array[i-1].y + 3*array[i].y - 3*array[i+1].y + array[i+2].y)/6;
 
        for (let t = 0; t <= 1; t+=0.05) {
            let x = ((a3*t + a2)*t + a1)*t + a0;
            let y = ((b3*t + b2)*t + b1)*t + b0;
 
            tmpArr.push(new Point(x, y));
        }
    }
 
    return tmpArr;
}

seedOne и seedTwo служат для изменения основы цветка. worldColor изменяет цвет.