БлогNot. Как нарисовать каплевидный контур и фигуру Лиссажу на Javascript

Как нарисовать каплевидный контур и фигуру Лиссажу на Javascript

Сначала не совсем фигуры Лиссажу, хотя подход похожий.

В отличие от шариков, мы не применяем встроенные в язык кривые Безье, а отрисовываем контур по точкам, соединяя их отрезками.

В основе построения контура лежит модель

x = r * (a + Sin(c * t) ^ n)
y = r * Cos(t) * (b + Sin(t) ^ m)

где ^ - возведение в степень, r - радиус, t - угол, a,c,n,b,m - коэффициенты.

Задаём радиус, коэффициенты, настройки отрисовки на канве и вызываем функцию, так что скрипт совсем простенький.

В отличие от полярных цветов, мы не обязательно делаем один цикл от 0 до 2*pi, а можем передать настройкой количество циклов n*pi.

Вот скриншот с несколькими фигурами на одном полотне и код для него, который можно выполнить из любого файла .html.

капли
капли

<div align="center">
  <canvas id="dropCanvas" width="600" height="600" style="margin:0px; border :1px dotted;">
  </canvas>
</div> 

<script type="text/javascript">

function drawDrop (r,a,c,n,b,m,startXcoeff=0.5,startYcoeff=0.5,col='#008000',per=2,cli=true) {
 /*
  радиус капли r
  коэффициенты модели
   x = r * (a + Sin(c * t) ^ n)
   y = r * Cos(t) * (b + Sin(t) ^ m)
  коэффициенты смещения по осям startXcoeff, startXcoeff, ]0;1[, 0.5 - середина канвы
  цвет линий col
  период per (2*pi, 4*pi и т.д.)
  очищать ли канву cli
 */
 var canvas = document.getElementById('dropCanvas');	
 var ctx = canvas.getContext('2d');
 var w = canvas.width, h = canvas.height;
 if (cli) { ctx.fillStyle = '#FFFFFF'; ctx.fillRect (0 , 0 , w, h);  }
 ctx.strokeStyle = col; ctx.lineWidth = 3.5;
 var pi2 = (per+0.1*per)*Math.PI,x0,y0,x,y,started=false;
 for (var t=0; t<=pi2; t+=0.01*pi2) {
  x = Math.round(r * (a + Math.pow(Math.sin(c*t),n))+w*startXcoeff);
  y = Math.round(r * Math.cos(t) * (b + Math.pow(Math.sin(t),m))+h*startYcoeff); 
  if (started) {
   ctx.beginPath(); ctx.moveTo(x0,y0); ctx.lineTo(x,y); ctx.stroke(); x0 = x; y0 = y;
  }
  else started=true;
 }
}

window.addEventListener('load', function () {
 drawDrop (100,1,1,1,1,1,0.1,0.25);
 drawDrop (100,1,1,3,1,1,0.6,0.25,'red',2,false);
 drawDrop (100,1,0.5,5,1,1,0.1,0.75,'blue',4,false); 
 drawDrop (100,1,1.5,1,1,1,0.6,0.75,'magenta',4,false); 
}, false);
</script>
<noscript><p>Для работы приложения нужен включенный Javascript</p></noscript>

Классическую фигуру Лиссажу нарисуем ещё более простым кодом. Аргументы обозначены как в Вики, оттуда же взята фигура для образца. Вот скрипт непосредственно в работе (нужен включённый Javascript) и исходник:

<div align="center">
  <canvas id="lissajousCanvas" width="200" height="200" style="margin:0px; border :1px dotted;">
  </canvas>
</div> 

<script type="text/javascript">

function draw (radius,a,b,d,A,B) {
 var canvas = document.getElementById('lissajousCanvas');	
 var ctx = canvas.getContext('2d');
 var w = canvas.width, h = canvas.height;
 ctx.beginPath();
 ctx.strokeStyle = 'rgb(255, 0, 0)';
 var n = 500; //шагов
 ctx.moveTo(w/2, h/2);
 for(var t=0; t<=2*Math.PI; t+=Math.PI/n){
   var x = radius * A * Math.sin(a * t + d);
   var y = radius * B * Math.sin(b * t);
   ctx.lineTo(w/2 + x, h/2 - y);
 }
 ctx.stroke();
}

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

теги: javascript графика математика

16.03.2019, 14:53; рейтинг: 232