Advertisement
YellowAfterlife

Untitled

May 14th, 2012
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <html>
  2. <head>
  3.     <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  4.     <title>Gen</title>
  5.     <style type="text/css"></style>
  6. </head>
  7. <body>
  8.     <canvas id="canvas2" width="512" height="512"></canvas>
  9.     <canvas id="canvas1" width="32" height="32"></canvas>
  10.     <script type="text/javascript">
  11.     var
  12.         // основная канва:
  13.         canvas = document.getElementById("canvas1"),
  14.         c = canvas.getContext("2d"),
  15.         // "более крупная" канва:
  16.         canvas2 = document.getElementById("canvas2"),
  17.         context2 = canvas2.getContext('2d'),
  18.         // размер стороны канвы:
  19.         size = canvas.width,
  20.         imageData = c.createImageData(size, size),
  21.         // массив с данными:
  22.         mas = new Array(size),
  23.         // перечисляемые переменные:
  24.         mas, cc, x, y;
  25.     // ставит отдельный пиксель в imageData:
  26.     function setPixel(imageData, x, y, r, g, b, a) {
  27.         index = (x + y * imageData.width) << 2;
  28.         imageData.data[index++] = r;
  29.         imageData.data[index++] = g;
  30.         imageData.data[index++] = b;
  31.         imageData.data[index]   = a;
  32.     }
  33.     // очищает массив данных:
  34.     function clear() {
  35.         for(var i = 0; i < size; i++) {
  36.             mas[i] = new Array(size);
  37.             for(var j = 0; j < size; j++) {
  38.                 mas[i][j] = 0;
  39.             }
  40.         }
  41.     }
  42.     // рисует в массив круг:
  43.     function circle(x, y, r, h) {
  44.         for(var i = x-r; i <= x+r; i++) {
  45.             for(var j = y-r; j <= y+r; j++) {
  46.                 if((i-x)*(i-x) + (j-y)*(j-y) <= r*r) {
  47.                     mas[Math.floor(i)][Math.floor(j)] = h;
  48.                 }
  49.             }
  50.         }
  51.     }
  52.    
  53.     // возвращает случайную в диапазоне:
  54.     function rand(min, max) { return Math.random() * (max - min) + min }
  55.     // сглаживает массив с указанным количеством шагов:
  56.     function smooth(steps) {
  57.         for(var a = 0; a < steps; a++) {
  58.             for(var i = 0; i < size-1; i++) {
  59.                 for(var j = 0; j < size-1; j++) {
  60.                     var round = Math.floor(( mas[i][j] + mas[i+1][j] + mas[i][j+1] + mas[i+1][j+1])/4);
  61.                     mas[i][j] = round;
  62.                     mas[i+1][j] = round;
  63.                     mas[i][j+1] = round;
  64.                     mas[i+1][j+1] = round;
  65.                 }
  66.             }
  67.         }
  68.     }
  69.     // делаем кучу островов:
  70.     for (cc = 0; cc < 256; cc++) {
  71.         clear();
  72.         x = size / 2;
  73.         y = size / 2;
  74.         r = size / 4;
  75.         // изначальный круг:
  76.         circle(x, y, r, 100);
  77.         // круги суши:
  78.         for(var i = 0; i < rand(5, 10); i++) {
  79.             circle(rand(x-r, x+r), rand(y-r, y+r), rand(0.2*r, 0.5*r), 100);
  80.         }
  81.         // круги воды:
  82.         for(var i = 0; i < rand(5, 10); i++) {
  83.             circle(rand(x-r, x+r), rand(y-r, y+r), rand(0.2*r, 0.5*r), 0);
  84.         }
  85.         // сглаживание, технически (size >> 3) = ОК:
  86.         smooth(1);
  87.         // заполняем imageData пикселями:
  88.         for(var i = 0; i < size; i++) {
  89.             for(var j = 0; j < size; j++) {
  90.                 if(mas[i][j] <= 0) setPixel(imageData, i, j, 67, 170, 255, 255);
  91.                 else if(mas[i][j] <= 20) setPixel(imageData, i, j, 239, 211, 52, 255);
  92.                 else if(mas[i][j] <= 80) setPixel(imageData, i, j, 150, 75, 0, 255);
  93.                 else setPixel(imageData, i, j, 125, 225, 100, 255);
  94.             }
  95.         }
  96.         //
  97.         context2.putImageData(imageData, (cc & 15) << 5, (cc >> 4) << 5);
  98.         //context2.drawImage(canvas, (i & 7) << 5, (i >> 3) << 5);
  99.     }
  100.     </script>
  101. </body></html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement