Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом — различия между версиями
(→Программа) |
(→Программа) |
||
Строка 38: | Строка 38: | ||
==Программа== | ==Программа== | ||
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/MuschakND/Elongational%20flow/NNN.html |width=800 |height=800 |border=0 }} | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/MuschakND/Elongational%20flow/NNN.html |width=800 |height=800 |border=0 }} | ||
+ | <div class="mw-collapsible mw-collapsed"> | ||
+ | '''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content"> | ||
+ | Файл '''"NNNN.js"''' | ||
+ | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | function main_particle_1(canvas_particle_1,slider_01) { | ||
+ | |||
+ | |||
+ | |||
+ | // Предварительные установки | ||
+ | var w_1 = canvas_particle_1.width; // Ширина рабочего поля | ||
+ | var h_1 = canvas_particle_1.height; // Высота рабочего поля | ||
+ | |||
+ | var w = w_1/3; // Ширина ячеки периодичности | ||
+ | var h = h_1/3; | ||
+ | |||
+ | var ctx = canvas_particle_1.getContext("2d"); | ||
+ | |||
+ | this.newSystem = function() { | ||
+ | var w_1 = canvas_particle_1.width; // Ширина рабочего поля | ||
+ | var h_1 = canvas_particle_1.height; // Высота рабочего поля | ||
+ | |||
+ | var w = w_1 / 3; // Ширина ячеки периодичности | ||
+ | var h = h_1 / 3; // Высота ячейки периодичности | ||
+ | }; | ||
+ | var sh = -10 * 15; | ||
+ | // Наклоненность боковых границ ячеек ее можно менять | ||
+ | this.set_01 = function(o) {sh = 10 * o;}; | ||
+ | |||
+ | // настройка слайдеров и текстовых полей | ||
+ | slider_01.min = -15; slider_01.max = 15; | ||
+ | slider_01.step = 1; | ||
+ | slider_01.value = sh/10; // начальное значение ползунка должно задаваться после min и max | ||
+ | text_01.value = sh/10; | ||
+ | |||
+ | var s = 0; // предустановка | ||
+ | var s1 = 2/3 * sh; // Начальный сдвиг при переходе через гориз. границу | ||
+ | var se = -(2 * sh / h_1) * (h - 0.5 * h_1); // Начальный сдвиг при переходе через верт. границу | ||
+ | var r = 10; // Радиус частиц | ||
+ | var N = 10; // Число частиц можно менять | ||
+ | rx = new Array(); // Содержит координаты частиц по оси Х | ||
+ | ry = new Array(); // Содержит координаты частиц по оси У | ||
+ | rxI0 = new Array(); // Координаты для ячеек перидичностей - клонов | ||
+ | rxI1 = new Array(); | ||
+ | rxI2 = new Array(); | ||
+ | rxI3 = new Array(); | ||
+ | rxI4 = new Array(); | ||
+ | rxI5 = new Array(); | ||
+ | rxI6 = new Array(); | ||
+ | rxI7 = new Array(); | ||
+ | ryI0 = new Array(); | ||
+ | ryI1= new Array(); | ||
+ | ryI2= new Array(); | ||
+ | ryI3= new Array(); | ||
+ | ryI4= new Array(); | ||
+ | ryI5= new Array(); | ||
+ | ryI6= new Array(); | ||
+ | ryI7= new Array(); | ||
+ | vx = new Array(); //Скорость по Х | ||
+ | vy = new Array(); //Скорость по У | ||
+ | vx_p = new Array();vx_m = new Array();vy_p = new Array();vy_m = new Array(); | ||
+ | var distR0,distR2,distR3,distR; | ||
+ | |||
+ | L = new Array(); // Кинетический момент | ||
+ | var D = 5; // Энергия связи | ||
+ | var a0 = w * 0.1; | ||
+ | var c = 72 * D/r; // Жесткость связи частиц | ||
+ | var W = Math.sqrt(c); | ||
+ | var T = 2 * Math.PI/W; | ||
+ | dt = 0.03; | ||
+ | //0.04380741654852822 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | for (i = 0; i < N/2; ++i) | ||
+ | { | ||
+ | vx_p[i] = Math.random()*15; | ||
+ | vy_p[i] = Math.random()*15; | ||
+ | vx_m[i] = Math.random()*15; | ||
+ | vy_m[i] = Math.random()*15; | ||
+ | vx = vx_p.concat(vx_m); | ||
+ | vy = vy_p.concat(vy_m); | ||
+ | } | ||
+ | |||
+ | var kol = 1; | ||
+ | var prx = 0; | ||
+ | var pry = 0; | ||
+ | var dist= 0; | ||
+ | var f; | ||
+ | rx[0] = Math.random() * (w - 10) ;//-s; | ||
+ | ry[0] = Math.random() * (h - 10); | ||
+ | while (kol < N) | ||
+ | { | ||
+ | f = 0; | ||
+ | prx = Math.random() * (w - 10);//-s; | ||
+ | pry = Math.random() * (h - 10); | ||
+ | for (i = 0; i < kol; i++) | ||
+ | { | ||
+ | dist = Math.pow((rx[i] - prx),2) + Math.pow((ry[i] - pry),2); | ||
+ | if (dist < Math.pow(2 * a0,2)) | ||
+ | { | ||
+ | f = f+1; | ||
+ | } | ||
+ | } | ||
+ | if (f==0) | ||
+ | { | ||
+ | rx[kol] = prx; | ||
+ | ry[kol] = pry; | ||
+ | kol++; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | var steps = 0; | ||
+ | |||
+ | |||
+ | function step() | ||
+ | { | ||
+ | tick(); | ||
+ | draw(); | ||
+ | } | ||
+ | var vGraph = new TM_graph( // определить график | ||
+ | "#vGraph", // на html-элементе #vGraph | ||
+ | 1000, // сколько шагов по оси "x" отображается | ||
+ | -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y | ||
+ | |||
+ | function tick() | ||
+ | { | ||
+ | for (i = 0; i < N ; i++) | ||
+ | { | ||
+ | |||
+ | steps += 1; | ||
+ | |||
+ | rx[i] += vx[i]*dt; | ||
+ | ry[i] += vy[i]*dt; | ||
+ | |||
+ | s = -(2 * sh / h_1) * (ry[i] - 0.5 * h_1); | ||
+ | |||
+ | if (rx[i] >= w - s) {rx[i] = rx[i] - w ;} | ||
+ | if (rx[i] <= 0 - s) {rx[i] = rx[i] + w;} | ||
+ | |||
+ | if (ry[i] >= h) {ry[i] = ry[i] - h ; | ||
+ | rx[i]=rx[i]- 2 * se; } | ||
+ | if (ry[i] <= 0) {ry[i] = ry[i] + h; | ||
+ | rx[i]=rx[i]+2*se; } | ||
+ | |||
+ | rxI0[i] = rx[i] + w; | ||
+ | ryI0[i] = ry[i]; | ||
+ | |||
+ | rxI3[i] = rx[i] + w +s1; | ||
+ | ryI3[i] = ry[i] + h; | ||
+ | |||
+ | rxI6[i] = rx[i] + w +s1 +s1; | ||
+ | ryI6[i] = ry[i] + 2*h; | ||
+ | |||
+ | rxI1[i] = rx[i] + 2*w ; | ||
+ | ryI1[i] = ry[i]; | ||
+ | |||
+ | rxI4[i] = rx[i] + 2*w +s1; | ||
+ | ryI4[i] = ry[i] + h; | ||
+ | |||
+ | rxI7[i] = rx[i] + 2*w +s1 +s1 ; | ||
+ | ryI7[i] = ry[i] + 2*h; | ||
+ | |||
+ | rxI2[i] = rx[i] +s1; | ||
+ | ryI2[i] = ry[i] + h; | ||
+ | |||
+ | rxI5[i] = rx[i] +s1 +s1 ; | ||
+ | ryI5[i] = ry[i] + 2*h; | ||
+ | |||
+ | |||
+ | |||
+ | //раcсчет расстояний | ||
+ | |||
+ | for (j = 0; j < N ; j++) | ||
+ | { | ||
+ | if (i != j) | ||
+ | { | ||
+ | distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2)); | ||
+ | distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2)); | ||
+ | distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2)); | ||
+ | distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2)); | ||
+ | |||
+ | //раcсчет сил | ||
+ | a = 4 * r; | ||
+ | if (distR0 < 2*r) | ||
+ | { | ||
+ | var mod_fR0,fxR0,fyR0; | ||
+ | |||
+ | mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a; | ||
+ | //console.log(mod_fR0); | ||
+ | if (mod_fR0 >=0) | ||
+ | { | ||
+ | fxR0 = mod_fR0*(rx[i]-rxI0[j]); | ||
+ | fyR0 = mod_fR0*(ry[i]-ryI0[j]); | ||
+ | vx[i]+=fxR0*dt; | ||
+ | vx[j]-=fxR0*dt; | ||
+ | vy[i]+=fyR0*dt; | ||
+ | vy[j]-=fyR0*dt; | ||
+ | } | ||
+ | } | ||
+ | if (distR2 < 2*r) | ||
+ | { | ||
+ | var mod_fR2,fxR2,fyR2; | ||
+ | |||
+ | mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a; | ||
+ | |||
+ | if (mod_fR2 >=0) | ||
+ | { | ||
+ | fxR2 = mod_fR2*(rx[i]-rxI2[j]); | ||
+ | fyR2 = mod_fR2*(ry[i]-ryI2[j]); | ||
+ | vx[i]+=fxR2*dt; | ||
+ | vx[j]-=fxR2*dt; | ||
+ | vy[i]+=fyR2*dt; | ||
+ | vy[j]-=fyR2*dt; | ||
+ | } | ||
+ | } | ||
+ | if (distR3 < 2*r) | ||
+ | { | ||
+ | var mod_fR3,fxR3,fyR3; | ||
+ | |||
+ | mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a; | ||
+ | |||
+ | if (mod_fR3 >=0) | ||
+ | { | ||
+ | fxR3 = mod_fR3*(rx[i]-rxI3[j]); | ||
+ | fyR3 = mod_fR3*(ry[i]-ryI3[j]); | ||
+ | vx[i]+=fxR3*dt; | ||
+ | vx[j]-=fxR3*dt; | ||
+ | vy[i]+=fyR3*dt; | ||
+ | vy[j]-=fyR3*dt; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if (distR < 2*r) | ||
+ | { | ||
+ | var mod_fR,fxR,fyR; | ||
+ | mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a; | ||
+ | if (mod_fR >=0) | ||
+ | { | ||
+ | fxR = mod_fR*(rx[i]-rx[j]); | ||
+ | fyR = mod_fR*(ry[i]-ry[j]); | ||
+ | vx[i]+=fxR*dt; | ||
+ | vx[j]-=fxR*dt; | ||
+ | vy[i]+=fyR*dt; | ||
+ | vy[j]-=fyR*dt; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Array.prototype.sum = function() | ||
+ | { | ||
+ | for (var i=0, sum=0; i < this.length; sum += this[i++]); | ||
+ | return sum; | ||
+ | } | ||
+ | |||
+ | |||
+ | // L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/6000; | ||
+ | var sumL = L.sum(); | ||
+ | //график | ||
+ | // if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график | ||
+ | //console.log(sumL); | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | function draw() | ||
+ | { | ||
+ | ctx.clearRect(0, 0, w_1+100 , h_1+100); // очистить экран | ||
+ | for (var i = 0; i < N; i++) | ||
+ | |||
+ | { | ||
+ | var x = rx[i]; | ||
+ | var y = ry[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(x, y, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI0 = rxI0[i]; | ||
+ | var yI0 = ryI0[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI1 = rxI1[i]; | ||
+ | var yI1 = ryI1[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI2 = rxI2[i]; | ||
+ | var yI2 = ryI2[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI3 = rxI3[i]; | ||
+ | var yI3 = ryI3[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI4 = rxI4[i]; | ||
+ | var yI4 = ryI4[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI5 = rxI5[i]; | ||
+ | var yI5 = ryI5[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI6 = rxI6[i]; | ||
+ | var yI6 = ryI6[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | var xI7 = rxI7[i]; | ||
+ | var yI7 = ryI7[i]; | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | |||
+ | } | ||
+ | ctx.beginPath(); // начать рисование | ||
+ | ctx.fillStyle="#000000"; | ||
+ | ctx.moveTo(w-sh, 0); // переместить "карандаш" в точку | ||
+ | ctx.lineTo(w+sh, h_1); // нарисовать "карандашом" линию до точки | ||
+ | ctx.stroke(); | ||
+ | |||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle="#000000"; | ||
+ | ctx.moveTo(2 * w-sh, 0); | ||
+ | ctx.lineTo(2 * w+sh, h_1); | ||
+ | ctx.stroke(); | ||
+ | |||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle="#000000"; | ||
+ | ctx.moveTo( 0- sh, 0); | ||
+ | ctx.lineTo( sh, h_1); | ||
+ | ctx.stroke(); | ||
+ | |||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle="#000000"; | ||
+ | ctx.moveTo(w_1 - sh, 0); | ||
+ | ctx.lineTo(w_1 + sh, h_1); | ||
+ | ctx.stroke(); | ||
+ | |||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle="#000000"; | ||
+ | ctx.moveTo(0, h); | ||
+ | ctx.lineTo(w_1, h); | ||
+ | ctx.stroke(); | ||
+ | |||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle="#000000"; | ||
+ | ctx.moveTo(0, 2 * h); | ||
+ | ctx.lineTo(w_1, 2 * h); | ||
+ | ctx.stroke(); | ||
+ | } | ||
+ | // Запуск системы | ||
+ | this.newSystem(); | ||
+ | setInterval(step, 1000/120); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс) | ||
+ | |||
+ | } |
Версия 18:01, 23 декабря 2016
Курсовые работы по МДС: 2016-2017 > Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongation flow) методом динамики частицКурсовой проект по Механике дискретных сред
Исполнитель: Мущак Никита
Группа: 09 (43604/1)
Семестр: осень 2016
Описание задачи
Моделирование течения жидкости при сжатии канала в одном направлении и удлинении в другом (elongational flow) было произведено методом динамики частиц. Каждая частица представляет собой абсолютно упругий шар. Взаимодействие между шарами описывается потенциалом Леннарда-Джонса. Моделирование данного течения производиться в помощью периодических граничных условий Крайника-Реинельта (Kraynik-Reinelt). При которых боковые границы ячейки периодичности поворачиваются, относительно вертикального положения (Рис.1).
Где x и у - это координаты частицы, w и h - ширина и высота ячейки периодичности.
и - смещение по x b y при переходе через границы ячейки периодичности.Программа
Файл "NNNN.js" <syntaxhighlight lang="javascript" line start="1" enclose="div"> function main_particle_1(canvas_particle_1,slider_01) {
// Предварительные установки
var w_1 = canvas_particle_1.width; // Ширина рабочего поля
var h_1 = canvas_particle_1.height; // Высота рабочего поля var w = w_1/3; // Ширина ячеки периодичности var h = h_1/3;
var ctx = canvas_particle_1.getContext("2d");
this.newSystem = function() { var w_1 = canvas_particle_1.width; // Ширина рабочего поля
var h_1 = canvas_particle_1.height; // Высота рабочего поля var w = w_1 / 3; // Ширина ячеки периодичности var h = h_1 / 3; // Высота ячейки периодичности
}; var sh = -10 * 15; // Наклоненность боковых границ ячеек ее можно менять
this.set_01 = function(o) {sh = 10 * o;};
// настройка слайдеров и текстовых полей slider_01.min = -15; slider_01.max = 15; slider_01.step = 1; slider_01.value = sh/10; // начальное значение ползунка должно задаваться после min и max text_01.value = sh/10;
var s = 0; // предустановка
var s1 = 2/3 * sh; // Начальный сдвиг при переходе через гориз. границу var se = -(2 * sh / h_1) * (h - 0.5 * h_1); // Начальный сдвиг при переходе через верт. границу var r = 10; // Радиус частиц var N = 10; // Число частиц можно менять rx = new Array(); // Содержит координаты частиц по оси Х ry = new Array(); // Содержит координаты частиц по оси У rxI0 = new Array(); // Координаты для ячеек перидичностей - клонов rxI1 = new Array(); rxI2 = new Array(); rxI3 = new Array(); rxI4 = new Array(); rxI5 = new Array(); rxI6 = new Array(); rxI7 = new Array(); ryI0 = new Array(); ryI1= new Array(); ryI2= new Array(); ryI3= new Array(); ryI4= new Array(); ryI5= new Array(); ryI6= new Array(); ryI7= new Array(); vx = new Array(); //Скорость по Х vy = new Array(); //Скорость по У vx_p = new Array();vx_m = new Array();vy_p = new Array();vy_m = new Array(); var distR0,distR2,distR3,distR; L = new Array(); // Кинетический момент var D = 5; // Энергия связи var a0 = w * 0.1; var c = 72 * D/r; // Жесткость связи частиц var W = Math.sqrt(c); var T = 2 * Math.PI/W; dt = 0.03; //0.04380741654852822 for (i = 0; i < N/2; ++i) { vx_p[i] = Math.random()*15; vy_p[i] = Math.random()*15; vx_m[i] = Math.random()*15; vy_m[i] = Math.random()*15; vx = vx_p.concat(vx_m); vy = vy_p.concat(vy_m); } var kol = 1; var prx = 0; var pry = 0; var dist= 0; var f; rx[0] = Math.random() * (w - 10) ;//-s; ry[0] = Math.random() * (h - 10); while (kol < N) { f = 0; prx = Math.random() * (w - 10);//-s; pry = Math.random() * (h - 10); for (i = 0; i < kol; i++) { dist = Math.pow((rx[i] - prx),2) + Math.pow((ry[i] - pry),2); if (dist < Math.pow(2 * a0,2)) { f = f+1; } } if (f==0) { rx[kol] = prx; ry[kol] = pry; kol++; } } var steps = 0; function step() { tick(); draw(); } var vGraph = new TM_graph( // определить график "#vGraph", // на html-элементе #vGraph 1000, // сколько шагов по оси "x" отображается -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y function tick() { for (i = 0; i < N ; i++) { steps += 1; rx[i] += vx[i]*dt; ry[i] += vy[i]*dt; s = -(2 * sh / h_1) * (ry[i] - 0.5 * h_1);
if (rx[i] >= w - s) {rx[i] = rx[i] - w ;}
if (rx[i] <= 0 - s) {rx[i] = rx[i] + w;}
if (ry[i] >= h) {ry[i] = ry[i] - h ; rx[i]=rx[i]- 2 * se; }
if (ry[i] <= 0) {ry[i] = ry[i] + h;
rx[i]=rx[i]+2*se; }
rxI0[i] = rx[i] + w; ryI0[i] = ry[i];
rxI3[i] = rx[i] + w +s1; ryI3[i] = ry[i] + h; rxI6[i] = rx[i] + w +s1 +s1; ryI6[i] = ry[i] + 2*h; rxI1[i] = rx[i] + 2*w ; ryI1[i] = ry[i]; rxI4[i] = rx[i] + 2*w +s1; ryI4[i] = ry[i] + h; rxI7[i] = rx[i] + 2*w +s1 +s1 ; ryI7[i] = ry[i] + 2*h; rxI2[i] = rx[i] +s1; ryI2[i] = ry[i] + h; rxI5[i] = rx[i] +s1 +s1 ; ryI5[i] = ry[i] + 2*h; //раcсчет расстояний for (j = 0; j < N ; j++) { if (i != j) { distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2)); distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2)); distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2)); distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2)); //раcсчет сил a = 4 * r; if (distR0 < 2*r) { var mod_fR0,fxR0,fyR0;
mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a; //console.log(mod_fR0); if (mod_fR0 >=0) { fxR0 = mod_fR0*(rx[i]-rxI0[j]); fyR0 = mod_fR0*(ry[i]-ryI0[j]); vx[i]+=fxR0*dt; vx[j]-=fxR0*dt; vy[i]+=fyR0*dt; vy[j]-=fyR0*dt; } } if (distR2 < 2*r) { var mod_fR2,fxR2,fyR2;
mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a; if (mod_fR2 >=0) { fxR2 = mod_fR2*(rx[i]-rxI2[j]); fyR2 = mod_fR2*(ry[i]-ryI2[j]); vx[i]+=fxR2*dt; vx[j]-=fxR2*dt; vy[i]+=fyR2*dt; vy[j]-=fyR2*dt; } } if (distR3 < 2*r) { var mod_fR3,fxR3,fyR3;
mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a; if (mod_fR3 >=0) { fxR3 = mod_fR3*(rx[i]-rxI3[j]); fyR3 = mod_fR3*(ry[i]-ryI3[j]); vx[i]+=fxR3*dt; vx[j]-=fxR3*dt; vy[i]+=fyR3*dt; vy[j]-=fyR3*dt; } } if (distR < 2*r) { var mod_fR,fxR,fyR; mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a; if (mod_fR >=0) { fxR = mod_fR*(rx[i]-rx[j]); fyR = mod_fR*(ry[i]-ry[j]); vx[i]+=fxR*dt; vx[j]-=fxR*dt; vy[i]+=fyR*dt; vy[j]-=fyR*dt; } } Array.prototype.sum = function() { for (var i=0, sum=0; i < this.length; sum += this[i++]); return sum; } // L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/6000; var sumL = L.sum(); //график // if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график //console.log(sumL);
} } } } function draw() { ctx.clearRect(0, 0, w_1+100 , h_1+100); // очистить экран for (var i = 0; i < N; i++) { var x = rx[i]; var y = ry[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(x, y, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill(); var xI0 = rxI0[i]; var yI0 = ryI0[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();
var xI1 = rxI1[i];
var yI1 = ryI1[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();
var xI2 = rxI2[i];
var yI2 = ryI2[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();
var xI3 = rxI3[i];
var yI3 = ryI3[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();
var xI4 = rxI4[i];
var yI4 = ryI4[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();
var xI5 = rxI5[i];
var yI5 = ryI5[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();
var xI6 = rxI6[i];
var yI6 = ryI6[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill();
var xI7 = rxI7[i];
var yI7 = ryI7[i]; ctx.beginPath(); ctx.fillStyle = "#00008B"; ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false); ctx.closePath(); ctx.fill(); } ctx.beginPath(); // начать рисование ctx.fillStyle="#000000"; ctx.moveTo(w-sh, 0); // переместить "карандаш" в точку ctx.lineTo(w+sh, h_1); // нарисовать "карандашом" линию до точки ctx.stroke(); ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(2 * w-sh, 0); ctx.lineTo(2 * w+sh, h_1); ctx.stroke();
ctx.beginPath();
ctx.fillStyle="#000000"; ctx.moveTo( 0- sh, 0); ctx.lineTo( sh, h_1); ctx.stroke(); ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(w_1 - sh, 0); ctx.lineTo(w_1 + sh, h_1); ctx.stroke();
ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(0, h); ctx.lineTo(w_1, h); ctx.stroke(); ctx.beginPath(); ctx.fillStyle="#000000"; ctx.moveTo(0, 2 * h); ctx.lineTo(w_1, 2 * h); ctx.stroke(); } // Запуск системы this.newSystem(); setInterval(step, 1000/120); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)}