Advertisement
here2share

Mandelbrot_Set.html

Nov 21st, 2023
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Mandelbrot_Set.html
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5.     <meta charset="utf-8">
  6.     <title>Mandelbrot Set</title>
  7.     <style>
  8.         canvas {
  9.             border: 1px solid black;
  10.         }
  11.     </style>
  12. </head>
  13. <body>
  14.     <canvas id="canvas" width="500" height="500"></canvas>
  15.     <script>
  16.         var canvas = document.getElementById("canvas");
  17.         var ctx = canvas.getContext("2d");
  18.  
  19.         var xRange = 3.5;
  20.         var yRange = 2.0;
  21.         var xOffset = -0.75;
  22.         var yOffset = 0.0;
  23.         var colors = [];
  24.  
  25.         function z(r, g, b) {
  26.           colors.push([r, g, b]);
  27.         }
  28.  
  29.         let r = 255, g = 0, b = 0;
  30.  
  31.         for (let g = 0; g < 256; g++) {
  32.           z(r, g, b);
  33.         }
  34.  
  35.         for (r = 254; r >= 0; r--) {
  36.           z(r, g, b);
  37.         }
  38.  
  39.         for (let b = 0; b < 256; b++) {
  40.           z(r, g, b);
  41.         }
  42.  
  43.         for (g = 254; g >= 0; g--) {
  44.           z(r, g, b);
  45.         }
  46.  
  47.         for (r = 0; r < 256; r++) {
  48.           z(r, g, b);
  49.         }
  50.  
  51.         for (let b = 254; b >= 0; b--) {
  52.           z(r, g, b);
  53.         }
  54.        
  55.         var numColors = colors.length;
  56.  
  57.         function calculateMandelbrot(xRange, yRange, xOffset, yOffset) {
  58.             var imageData = ctx.createImageData(canvas.width, canvas.height);
  59.             var data = imageData.data;
  60.  
  61.             for (var y = 0; y < canvas.height; y++) {
  62.                 for (var x = 0; x < canvas.width; x++) {
  63.                     var zx = 0;
  64.                     var zy = 0;
  65.                     var cx = (x - canvas.width / 2) * xRange / canvas.width + xOffset;
  66.                     var cy = (y - canvas.height / 2) * yRange / canvas.height + yOffset;
  67.                     var i = 0;
  68.  
  69.                     while (zx * zx + zy * zy < 4 && i < 500) {
  70.                         var xt = zx * zx - zy * zy + cx;
  71.                         zy = 2 * zx * zy + cy;
  72.                         zx = xt;
  73.                         i++;
  74.                     }
  75.                    
  76.                     var i = Math.floor(i * 20 + yRange) % numColors;
  77.                     var index = (x + y * canvas.width) * 4;
  78.                     data[index + 0] = colors[i][0];
  79.                     data[index + 1] = colors[i][1];
  80.                     data[index + 2] = colors[i][2];
  81.                     data[index + 3] = 255;
  82.                 }
  83.             }
  84.  
  85.             ctx.putImageData(imageData, 0, 0);
  86.         }
  87.  
  88.         calculateMandelbrot(xRange, yRange, xOffset, yOffset);
  89.  
  90.         var zoomFactor = 1.12;
  91.         var dragStart = null;
  92.  
  93.         canvas.addEventListener("wheel", function(event) {
  94.             event.preventDefault();
  95.  
  96.             var x = event.clientX - canvas.offsetLeft;
  97.             var y = event.clientY - canvas.offsetTop;
  98.  
  99.             var zx = (x - canvas.width / 2) * xRange / canvas.width + xOffset;
  100.             var zy = (y - canvas.height / 2) * yRange / canvas.height + yOffset;
  101.  
  102.             if (event.deltaY < 0) {
  103.                 xRange /= zoomFactor;
  104.                 yRange /= zoomFactor;
  105.             } else {
  106.                 xRange *= zoomFactor;
  107.                 yRange *= zoomFactor;
  108.             }
  109.  
  110.             xOffset = zx - (x - canvas.width / 2) * xRange / canvas.width;
  111.             yOffset = zy - (y - canvas.height / 2) * yRange / canvas.height;
  112.  
  113.             calculateMandelbrot(xRange, yRange, xOffset, yOffset);
  114.         });
  115.  
  116.         canvas.addEventListener("mousedown", function(event) {
  117.             dragStart = {
  118.                 x: event.clientX,
  119.                 y: event.clientY,
  120.                 xOffset: xOffset,
  121.                 yOffset: yOffset
  122.             };
  123.         });
  124.  
  125.         canvas.addEventListener("mouseup", function(event) {
  126.             dragStart = null;
  127.         });
  128.  
  129.         canvas.addEventListener("mousemove", function(event) {
  130.             if (dragStart) {
  131.                 var xDelta = event.clientX - dragStart.x;
  132.                 var yDelta = event.clientY - dragStart.y;
  133.  
  134.                 xOffset = dragStart.xOffset - xDelta * xRange / canvas.width;
  135.                 yOffset = dragStart.yOffset - yDelta * yRange / canvas.height;
  136.  
  137.                 calculateMandelbrot(xRange, yRange, xOffset, yOffset);
  138.             }
  139.         });
  140.  
  141.         document.addEventListener("keydown", function(event) {
  142.             if (event.keyCode == 38) {
  143.                 xRange /= zoomFactor;
  144.                 yRange /= zoomFactor;
  145.  
  146.                 calculateMandelbrot(xRange, yRange, xOffset, yOffset);
  147.             } else if (event.keyCode == 40) {
  148.                 xRange *= zoomFactor;
  149.                 yRange *= zoomFactor;
  150.  
  151.                 calculateMandelbrot(xRange, yRange, xOffset, yOffset);
  152.             }
  153.         });
  154.     </script>
  155. </body>
  156. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement