let pallete = ["#10111C", "#23AECC", "#ECE1B4", "#CC3016", "#F2C96E", "#178FA6"];
colorMode(HSB, 360, 100, 100, 100);
let bgNum = int(random(pallete.length));
graphics = createGraphics(width, height);
graphics.colorMode(HSB, 360, 100, 100, 100);
drawNoiseBackground(100000, graphics);
s = int(random(3, 10)) * 30;
translate(width / 2, height / 2);
rotate(int(random(8)) * 360/8);
for (let i = -width / 2; i < width / 2; i += s) {
for (let j = -height / 2; j < height / 2; j += s) {
let p1 = createVector(0 - j + 2 * i, 0 + sqrt(3) * j);
let p2 = createVector(s - j + 2 * i, s * sqrt(3) + sqrt(3) * j);
let p3 = createVector(-s - j + 2 * i, s * sqrt(3) + sqrt(3) * j);
let points = [p1, p2, p3];
let center = getCircumcenter(points);
translate(center.x,center.y);
recursiveTriangles([], 0, int(random(2, 5)), rMax);
for (let m = -width / 2; m < width / 2; m += s) {
for (let n = -height / 2; n < height / 2; n += s) {
let p4 = createVector(0 - m + 2 * n, 0 + sqrt(3) * m);
let p5 = createVector(2 * s - m + 2 * n, 0 + sqrt(3) * m);
let p6 = createVector(s - m + 2 * n, s * sqrt(3) + sqrt(3) * m);
let points = [p4, p5, p6];
let center = getCircumcenter(points);
translate(center.x,center.y);
recursiveTriangles([], 0, int(random(2, 5)), rMax);
function drawConcentricTriangle(points) {
let center = getCircumcenter(points);
let cp = createVector(center.x, center.y);
let step = int(random(2, 10));
for (let a = 1; a >= 0; a -= 1 / step) {
let x = lerp(cp.x, p.x, a);
let y = lerp(cp.y, p.y, a);
function getCircumcenter(points) {
let py = ((e - a) * (aa + bb - cc - dd) - (c - a) * (aa + bb - ee - ff)) / (2 * (e - a) * (b - d) - 2 * (c - a) * (b - f))
let px = ((c - a) == 0) ? (2 * (b - d) * py - aa - bb + cc + dd) / (2 * (c - a)) : (2 * (b - f) * py - aa - bb + ee + ff) / (2 * (e - a));
pr = sqrt(sq(px - a) + sq(py - b));
function drawNoiseBackground(_n, _graphics) {
let c = color(0, 0, 100, 5);
for (let i = 0; i < _n; i++) {
let x = random(1) * width;
let y = random(1) * height;
_graphics.ellipse(x, y, w, h);
function recursiveTriangles(arr, depth, max, rMax = width / 2) {
let p4 = p5.Vector.lerp(p1,p2,0.5);
let centroid = p5.Vector.lerp(p3,p4,2/3);
let num = int(random(2,5))*10;
let c1 = color(random(pallete));
c2 = color(random(pallete));
for(let i = 1; i >0; i -= 1/num){
colorMode(RGB,255,255,255,255);
fill(lerpColor(c1,c2,i));
let p = p5.Vector.lerp(centroid,pp,i);
colorMode(HSB,360,100,100,100);
for (let angle = startAngle; angle < 360 + startAngle; angle += 360 / 3) {
arr.push(createVector(x, y));
let target = int(random(arr.length));
let next = (target + 1) % arr.length;
let current = p5.Vector.lerp(arr[target], arr[next], 0.5);
triangle(arr[target].x, arr[target].y, arr[(next + 1) % arr.length].x, arr[(next + 1) % arr.length].y, current.x, current.y);
recursiveTriangles([arr[target], arr[(next + 1) % arr.length], current], depth + 1, max);
triangle(arr[next].x, arr[next].y, arr[(next + 1) % arr.length].x, arr[(next + 1) % arr.length].y, current.x, current.y);
recursiveTriangles([arr[next], arr[(next + 1) % arr.length], current], depth + 1, max);