main.js (2705B)
1 (function() { 2 let number_of_rectangles = 2; 3 let factor = 2; 4 const INTERVAL = 750; 5 6 function hsv_to_rgb(hue, saturation, value) { 7 // https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB 8 // H in [0, 1] (position on the color wheel) 9 // S in [0, 1] 10 // V in [0, 1] 11 12 let chroma = value * saturation; 13 14 let hue_tag = hue * 6; 15 16 let x = chroma * (1 - Math.abs((hue_tag % 2) - 1)); 17 18 let [red_1, green_1, blue_1] = ((hue_tag, chroma, x)=>{ 19 if (hue_tag >= 0 && hue_tag < 1) { return [chroma, x, 0]; 20 } else if (hue_tag >= 1 && hue_tag < 2) { return [x, chroma, 0]; 21 } else if (hue_tag >= 2 && hue_tag < 3) { return [0, chroma, x]; 22 } else if (hue_tag >= 3 && hue_tag < 4) { return [0, x, chroma]; 23 } else if (hue_tag >= 4 && hue_tag < 5) { return [x, 0, chroma]; 24 } else if (hue_tag >= 5 && hue_tag < 6) { return [chroma, 0, x]; 25 } 26 })(hue_tag, chroma, x); 27 28 let m = value - chroma; 29 30 return [red_1 + m, green_1 + m, blue_1 + m]; 31 } 32 33 function draw() { 34 let canvas = document.getElementById('canvas'); 35 let ctx = canvas.getContext('2d'); 36 37 console.info(canvas.width, number_of_rectangles); 38 39 ctx.clearRect(0, 0, canvas.width, canvas.height); 40 41 let rectangle_width = canvas.width / number_of_rectangles; 42 43 for ( 44 let rectangle_number = 0; 45 rectangle_number < number_of_rectangles; 46 rectangle_number++ 47 ) { 48 ctx.beginPath(); 49 50 let rect_hsv_value = (number_of_rectangles - rectangle_number - 1) / (number_of_rectangles - 1); 51 let rgb = hsv_to_rgb(0, 0, rect_hsv_value).map(x=>255 * x); 52 ctx.fillStyle = `rgb(${rgb[0]}, ${rgb[1]}, ${rgb[2]})`; 53 54 let rectangle_x = rectangle_number * rectangle_width; 55 56 ctx.fillRect(Math.floor(rectangle_x), 0, Math.ceil(rectangle_width), canvas.height); 57 } 58 } 59 60 function resize_window() { 61 // https://stackoverflow.com/a/32119392 62 63 let canvas = document.getElementById('canvas'); 64 65 canvas.width = window.innerWidth; 66 canvas.style.width = window.innerWidth; 67 canvas.height = window.innerHeight; 68 canvas.style.height = window.innerHeight; 69 } 70 71 function main() { 72 let canvas = document.getElementById('canvas'); 73 let ctx = canvas.getContext('2d'); 74 75 resize_window(); 76 //reset_world(); 77 78 //canvas.addEventListener('click', reset_world); 79 80 window.addEventListener('resize', ()=>{resize_window(); draw();}) 81 82 draw(); 83 84 setInterval( 85 ()=>{ 86 if (number_of_rectangles > canvas.width) { 87 factor = 0.5; 88 number_of_rectangles = 2**Math.floor(Math.log2(canvas.width)); 89 } else if (number_of_rectangles <= 2) { 90 factor = 2; 91 number_of_rectangles = 2; 92 } 93 number_of_rectangles = factor * number_of_rectangles; 94 draw(); 95 }, 96 INTERVAL, 97 ); 98 } 99 100 window.addEventListener('load', main); 101 })();