БлогNot. Ещё о математических картинках на канве Javascript

Ещё о математических картинках на канве Javascript

Здесь уже немало подобного, пусть будет ещё немного. Это своего рода мини-шаблон для генерации математических картинок, только не рандомных, а построенных по неким соотношениям, меняйте код функции draw и получайте свои неповторимые шедевры.

Я приведу код с функцией draw, получившей вот такой фрактал:

фрактал 1
фрактал 1

И далее листинг, разметка HTML без обрамления, кодировка - любая:

<div align="center">
  <canvas id="fracCanvas" width="600" height="600">
  </canvas>
</div> 

<script type="text/javascript">

function drawFractal () {
 var canvas = document.getElementById('fracCanvas');	
 var ctx = canvas.getContext('2d');
 var w = canvas.width, h = canvas.height; //размеры канвы
 var r=255, g=255, b=255;
 ctx.fillStyle = color(r,g,b);
 ctx.fillRect (0 , 0 , w, h); 
 var step = 1; //шаг отрисовки  в пикселах

 function draw () {
  var scale = 0.055; //чем меньше, тем крупней фигурки
  for (var x = 0 ; x < w; x++) { 
   for (var y = 0 ; y < h; y++) { 
    var s1 = Math.sin(x * scale);
    var c1 = Math.cos(x * scale);
    var s2 = Math.sin(y * scale);
    var c2 = Math.cos(y * scale);
    var a1 = Math.sin(s1) * (s2 - c1);
    var a2 = Math.cos(c2) * (c1 - s2);
    var b1 = Math.abs(a2 - a1);
    //меняем коэффициенты 300.,250.,350. для смены палитры:
    r = Math.floor(b1 * 300.) % 255; 
    g = Math.floor(b1 * 250.) % 255; 
    b = Math.floor(b1 * 350.) % 255;
    ctx.fillStyle = color(r,g,b);
    ctx.fillRect (x , y , step, step);
   }
  }
 }

 function color (r,g,b) {
  return '#' + (r<16?'0':'') + r.toString(16) + (g<16?'0':'') + 
   g.toString(16) + (b<16?'0':'') + b.toString(16);
 }

 draw();
}

window.addEventListener('load', function () {
 drawFractal ();
}, false);
</script>
<noscript><p>Для работы приложения нужен включенный Javascript</p></noscript>

Вот другой фрактал и версия функции для него:

фрактал 2
фрактал 2
 function draw () {
  var scale = 0.075; //чем меньше, тем крупней фигурки
  for (var x = 0 ; x < w; x++) { 
   for (var y = 0 ; y < h; y++) { 
    var xx = (x - w / 2.) * scale; 
    var yy = (y - h / 2.) * scale;
    //Экспериментируйте с коэффициентами, чтобы получать новые картины:
    var c1 = 5.0 * (Math.cos(8) * Math.atan(100 * yy / (xx + 15)));
    var c2 = 0.5 * (Math.cos(8) * Math.atan(100 * yy / (xx - 15)));
    var s1 = Math.sin(Math.sqrt(Math.pow(xx + 15, 2) + Math.pow(yy + 15, 2)));
    var s2 = Math.sin(Math.sqrt(Math.pow(xx - 15, 2) + Math.pow(yy - 15, 2)));
    var aa = c1 * c2 * s1 * s2;
    var bb = Math.abs (aa);
    if (bb > 0.01) {
     //меняем коэффициенты для смены палитры:
     r = Math.floor(bb * 3000.) % 255;
     g = Math.floor(bb * 1000.) % 255;
     b = Math.floor(bb * 2000.) % 255;
    }
    ctx.fillStyle = color(r,g,b);
    ctx.fillRect (x , y , step, step);
   }
  }
 }

Ну и пусть будет третий до кучи, картинка и функция draw:

фрактал 3
фрактал 3
 function draw () {
  var scale = 0.23; //чем меньше, тем крупней фигурки
  for (var x = 0 ; x < w; x++) { 
   for (var y = 0 ; y < h; y++) { 
    var xx = x * scale; 
    var yy = y * scale;
    //Экспериментируйте с коэффициентами, чтобы получать новые картины:
    var rr = Math.sqrt( Math.pow(1.0 * xx - 42, 2) + Math.pow(1.5 * yy - 69, 2) );
    var aa = Math.atan( (xx - 42) / (yy - 69));
    //меняем коэффициенты для смены палитры:
    r = Math.floor( 255 * Math.pow( Math.sin((aa + rr / 10)*1.0),2) );
    g = Math.floor( 255 * Math.pow( Math.sin((aa - rr / 20)*3.0),2) );
    b = Math.floor( 255 * Math.pow( Math.cos((aa + rr / 30)*2.0),2) );
    ctx.fillStyle = color(r,g,b);
    ctx.fillRect (x , y , step, step);
   }
  }
 }

Это три разных подхода к вычислению цвета очередной точки, но везде применены просто двойной цикл по точкам канвы и волшебные синус с косинусом, как и почти во всех математических "красотах".

Присылайте свои :)

математический фрактал 4
математический фрактал 4

Не правда ли, картинка кажется не квадратной, будто уголки "подогнуты"? Вот функция draw для этой картинки:

 function draw () {
  var phi = 2*Math.PI/w+0.005; //чем больше прибавим, тем мельче узоры!
  var rad = 1200; //чем больше, тем меньше сеточка
  for (var x = 0 ; x < w; x++) { 
   for (var y = 0 ; y < h; y++) { 
    var xx = rad * (Math.sin(phi * x * y / rad) - 0.618 * Math.sin(2.5 * phi * y));
    var yy = rad * (Math.sin(phi * x * y / rad) - 0.618 * Math.sin(2.5 * phi * x));
    r = Math.floor(Math.abs(yy)) % 255;
    g = Math.floor(Math.abs(yy + xx)) % 255;
    b = Math.floor(Math.abs(xx)) % 255;
    ctx.fillStyle = color(r,g,b);
    ctx.fillRect (x , y , step, step);
   }
  }
 }

И даже из обычной формулы вида f(x,y)=x2+y2+C можно кое-что получить, вот ещё картинка и функция draw для неё:

математический фрактал 5
математический фрактал 5
 function draw () {
 var scale = 0.0001;
  for (var x = 0 ; x < w; x++) { 
   for (var y = 0 ; y < h; y++) { 
    var xx = Math.abs(x-w/2);
    var yy = Math.abs(y-h/2);
    var k = scale* (yy*yy + xx*xx + 100000);
    r = Math.floor(Math.abs(3000*k*k)) % 255;
    g = Math.floor(Math.abs(1500*k*k)) % 255;
    b = Math.floor(Math.abs(1000*k*k)) % 255;
    ctx.fillStyle = color(r,g,b);
    ctx.fillRect (x , y , step, step);
   }
  }
 }

Упростим код предыдущей функции, убрав из неё вообще все "настроечные" коэффициенты - и получим идею Числа, которое есть Круг :)

Число как круг, уже не фрактал
Число как круг, уже не фрактал
 function draw () {
  for (var x = 0 ; x < w; x++) { 
   for (var y = 0 ; y < h; y++) { 
    var xx = Math.abs(x - w/2);
    var yy = Math.abs(y - h/2);
    var k = Math.sqrt(xx*xx + yy*yy);
    r = Math.floor(k) % 255;
    g = Math.floor(k) % 255;
    b = Math.floor(k) % 255;
    ctx.fillStyle = color(r,g,b);
    ctx.fillRect (x , y , step, step);
   }
  }
 }

Ну а уж если смешать хромосомы расстояния xx и yy (изменился только оператор var k = Math.sqrt(xx*yy);), то и получится квадрож**ие или крестож**ие, в котором мы живём...

квадрож**ие
квадрож**ие

11.03.2019, 20:48 [1809 просмотров]


теги: программирование javascript картинка графика математика

показать комментарии (1)