let width = 650; let height = 650; let center_x = width/2; let center_y = height/2; let outer_radius = 300; let inner_radius = 100; let circle_radius = 45; var colors = []; var centers_outside = []; var centers_inside = []; var sliders_pos = []; var mix_t = []; let numPigments = 0; let step = 0; let dragged = -1; function setup() { createCanvas(650, 650); background(255); colorMode(RGB); stroke(125); strokeWeight(3); colors = [color( 255,236,4), color( 252,211,0), color( 255,105,0), color( 225,35,1), color( 191,0,18), color( 128,2,46), color( 78,1,66), color( 74,0,101), color( 16,31,61), color( 13, 27, 68), color( 25, 0, 89), color( 8,34,138), color( 12, 69,118), color( 6, 54, 51), color( 0,74,41), color( 84,50,36), color( 58,39,0), color( 13,9,1), color(249,250,249)]; numPigments = colors.length; step = TWO_PI / numPigments; for(let i=0; i -1) { mix_t[dragged] = get_t(centers_outside[dragged].x, centers_outside[dragged].y, centers_inside[dragged].x, centers_inside[dragged].y, mouseX, mouseY); sliders_pos[dragged] = createVector(centers_outside[dragged].x - sin(dragged * step) * mix_t[dragged] * (outer_radius-inner_radius), centers_outside[dragged].y - cos(dragged * step) * mix_t[dragged] * (outer_radius-inner_radius)); background(255); let weights = 0; for(let i=0; i 0.000001) { let latent_mix = [0,0,0,0,0,0,0]; for(let j=0; j0.000001) { let latent = mixbox.rgbToLatent(colors[j]); let t = mix_t[j]/weights; for(let k=0; k sliders_pos[i].x - circle_radius/2 && mouseX < sliders_pos[i].x + circle_radius/2 && mouseY > sliders_pos[i].y - circle_radius/2 && mouseY < sliders_pos[i].y + circle_radius/2) { dragged = i; } } } function mouseReleased() { dragged = -1; } function get_t (ax, ay, bx, by, qx, qy) { let u = createVector(bx-ax, by-ay); let v = createVector(qx-ax, qy-ay); let d = (u.x*v.x + u.y*v.y) / u.mag(); let t = d/u.mag(); return clamp(t, 0.0, 1.0); } function clamp(x, lowerlimit, upperlimit) { if (xupperlimit){return upperlimit;} else {return x;} }