Advertisement
here2share

gradientify

Aug 15th, 2024 (edited)
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <style>
  7.         body {
  8.             display: flex;
  9.             justify-content: center;
  10.             align-items: flex-start;
  11.             height: 100vh;
  12.             margin: 0;
  13.             background-color: #000;
  14.         }
  15.         #grid {
  16.             display: grid;
  17.             grid-template-columns: repeat(40, 15px);
  18.             grid-template-rows: repeat(40, 15px);
  19.             width: 600px;
  20.             height: 600px;
  21.             margin-top: 2px;
  22.         }
  23.         .cell {
  24.             width: 15px;
  25.             height: 15px;
  26.         }
  27.     </style>
  28.     <title>Gradient Grid</title>
  29. </head>
  30. <body>
  31.     <div id="grid"></div>
  32.  
  33.     <script>
  34.         const WIDTH = 600;
  35.         const HEIGHT = 600;
  36.         const CELL_SIZE = 15;
  37.         const GRID_SIZE = WIDTH / CELL_SIZE;
  38.         const num_steps = GRID_SIZE * GRID_SIZE;
  39.         const step_size = Math.floor((256 ** 3) / (num_steps - 1));
  40.  
  41.         const grid = document.getElementById('grid');
  42.  
  43.         function convertIntToRgb(value) {
  44.             let b = value % 256;
  45.             value = Math.floor(value / 256);
  46.             let g = value % 256;
  47.             value = Math.floor(value / 256);
  48.             let r = value % 256;
  49.             return `rgb(${r}, ${g}, ${b})`;
  50.         }
  51.  
  52.         let COLORS = [];
  53.         let steps = 0;
  54.         while (COLORS.length < num_steps) {
  55.             COLORS.push(convertIntToRgb(steps));
  56.             steps += step_size;
  57.         }
  58.         COLORS[COLORS.length - 1] = 'rgb(255, 255, 255)';
  59.  
  60.         let cells = [];
  61.         let initPattern = [];
  62.         function pattern() {
  63.             for (let i = 0; i < GRID_SIZE; i++) {
  64.                 let row = [];
  65.                 let initRow = [];
  66.                 for (let j = 0; j < GRID_SIZE; j++) {
  67.                     let div = document.createElement('div');
  68.                     let color = COLORS.pop();
  69.                     div.classList.add('cell');
  70.                     div.style.backgroundColor = color;
  71.                     grid.appendChild(div);
  72.                     row.push(div);
  73.                     initRow.push(color);
  74.                 }
  75.                 cells.push(row);
  76.                 initPattern.push(initRow);
  77.             }
  78.         }
  79.         pattern();
  80.  
  81.         function colorDifference(color1, color2) {
  82.             let [r1, g1, b1] = color1.match(/\d+/g).map(Number);
  83.             let [r2, g2, b2] = color2.match(/\d+/g).map(Number);
  84.             return Math.abs(r1 - r2) + Math.abs(g1 - g2) + Math.abs(b1 - b2);
  85.         }
  86.  
  87.         function findBestNeighbor(x, y) {
  88.             const currentColor = cells[x][y].style.backgroundColor;
  89.             let bestNeighbor = null;
  90.             let target = null;
  91.             let minDifference = Infinity;
  92.  
  93.             const neighbors = [[-1, 0], [1, 0], [0, -1], [0, 1]];
  94.  
  95.             for (let [dx, dy] of neighbors) {
  96.                 let x2 = x + dx;
  97.                 let y2 = y + dy;
  98.                 for (let i = -1; i <= 1; i++) {
  99.                     for (let j = 1; j <= 3; j++) {
  100.                         let nx = dx ? x2 + j * dx : x + i;
  101.                         let ny = dy ? y2 + j * dy : y + i;
  102.  
  103.                         if (nx >= 0 && ny >= 0 && nx < GRID_SIZE && ny < GRID_SIZE) {
  104.                             let neighborColor = cells[nx][ny].style.backgroundColor;
  105.                             let difference = colorDifference(currentColor, neighborColor);
  106.                             if (difference < minDifference) {
  107.                                 minDifference = difference;
  108.                                 bestNeighbor = [x2, y2];
  109.                                 target = [nx, ny];
  110.                             }
  111.                         }
  112.                     }
  113.                 }
  114.             }
  115.  
  116.             return { bestNeighbor, target };
  117.         }
  118.  
  119.         function shuffle(array) {
  120.             for (let i = array.length - 1; i > 0; i--) {
  121.                 let j = Math.floor(Math.random() * (i + 1));
  122.                 [array[i], array[j]] = [array[j], array[i]];
  123.             }
  124.         }
  125.  
  126.         const XYo = [];
  127.         for (let y = 0; y < GRID_SIZE; y++) {
  128.             for (let x = 0; x < GRID_SIZE; x++) {
  129.                 XYo.push([x, y]);
  130.             }
  131.         }
  132.  
  133.         function plot() {
  134.             shuffle(XYo);
  135.             for (let [x, y] of XYo) {
  136.                 let { bestNeighbor, target } = findBestNeighbor(x, y);
  137.                 if (bestNeighbor && target) {
  138.                     let [nx, ny] = bestNeighbor;
  139.                     let [dx, dy] = target;
  140.                     let tempColor = cells[x][y].style.backgroundColor;
  141.                     cells[x][y].style.backgroundColor = cells[nx][ny].style.backgroundColor;
  142.                     cells[nx][ny].style.backgroundColor = tempColor;
  143.                     // requestAnimationFrame()
  144.                 }
  145.             }
  146.         }
  147.  
  148.         document.addEventListener('keydown', (event) => {
  149.             if (event.code === 'Space') {
  150.                 for (let i = 0; i < GRID_SIZE; i++) {
  151.                     for (let j = 0; j < GRID_SIZE; j++) {
  152.                         // alert(1234);
  153.                         cells[i][j].style.backgroundColor = initPattern[i][j];
  154.                     }
  155.                 }
  156.             }
  157.         });
  158.  
  159.         setInterval(plot, 0);
  160.     </script>
  161. </body>
  162. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement