Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| [[Виртуальная лаборатория]]>[[Периодические граничные условия]] <HR> | | [[Виртуальная лаборатория]]>[[Периодические граничные условия]] <HR> |
| | | |
− | ===Курсовой проект по механике дискретных сред===
| + | '''Краткое описание'''<br /> |
| + | Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе». А если частица пересекает границу расчетной области, она появляется с другой стороны. В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:<br /> |
| + | однородности времени соответствует закон сохранения энергии,<br /> |
| + | однородности пространства соответствует закон сохранения импульса,<br /> |
| + | изотропии пространства соответствует закон сохранения момента импульса,<br /> |
| + | калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.<br /> |
| + | Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается.<br /> <br /> |
| | | |
− | * разработчик [[Теницкая Татьяна]]
| + | Цель работы:<br /> |
− | * руководитель [[Кузькин Виталий]]
| |
| | | |
− | ===Краткое описание===
| |
− |
| |
− | :Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.<br />
| |
− | :В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:<br />
| |
− | * однородности времени соответствует закон сохранения энергии,<br />
| |
− | * однородности пространства соответствует закон сохранения импульса,<br />
| |
− | * изотропии пространства соответствует закон сохранения момента импульса,<br />
| |
− | * калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.<br />
| |
− | :Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.<br />
| |
− |
| |
− | ===Цель проекта===
| |
| * Визуализация системы частиц с периодическими граничными условиями. | | * Визуализация системы частиц с периодическими граничными условиями. |
− | * Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.<br /> | + | * Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.<br /><br /> |
| | | |
− | ===Математическая модель===
| |
| Граничные условия: | | Граничные условия: |
| | | |
− | если <math>x > w</math>, | + | если <math> x > w </math>, |
− | то <math>x = x - w</math> | + | то <math> x = x - w </math> |
| | | |
| если <math> x < 0 </math>, | | если <math> x < 0 </math>, |
Строка 38: |
Строка 31: |
| | | |
| Кинетический момент вычисляется по формуле: | | Кинетический момент вычисляется по формуле: |
| + | |
| <math>L(t) = \sum_{i\in\wedge(t)} r_i\times mV_i </math> | | <math>L(t) = \sum_{i\in\wedge(t)} r_i\times mV_i </math> |
− |
| |
− | ===Результаты===
| |
− | <br />
| |
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/OneBall/One_Ball.html |width=1400|height=450 |border=0 }}
| |
− | [[Медиа:OneBall.rar|Скачать архив]]
| |
− | <div class="mw-collapsible mw-collapsed" style="width:100%" >
| |
− | '''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content">
| |
− | Файл '''"One_Ball.js"'''
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | function main_particle_1() {
| |
− |
| |
− | var ctx = canvas_particle_1.getContext("2d");
| |
− | 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 r = 7;
| |
− | var N = 1;
| |
− | var rx,ry; //Содержит координаты частиц по оси Х //Содержит координаты частиц по оси У
| |
− |
| |
− | var rxI0,rxI1,rxI2,rxI3,rxI4,rxI5,rxI6,rxI7;
| |
− | var ryI0,ryI1,ryI2,ryI3,ryI4,ryI5,ryI6,ryI7;
| |
− |
| |
− | var vx,vy;
| |
− | var L;
| |
− |
| |
− | dt = 0.3;
| |
− | var alfa = 45 / 180 * Math.PI;
| |
− | //0.04380741654852822
| |
− | var v0 = 5;
| |
− | vx = v0 * Math.cos(alfa);
| |
− | vy = v0 * Math.sin(alfa);
| |
− |
| |
− |
| |
− | rx = Math.random() * (w - 10);
| |
− | ry = Math.random() * (h - 10);
| |
− |
| |
− | var steps = 0;
| |
− |
| |
− |
| |
− | function step()
| |
− | {
| |
− | tick();
| |
− | draw();
| |
− | }
| |
− | var vGraph = new TM_graph( // определить график
| |
− | "#vGraph", // на html-элементе #vGraph
| |
− | 200, // сколько шагов по оси "x" отображается
| |
− | -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
| |
− |
| |
− | function tick()
| |
− | {
| |
− |
| |
− | steps += 1;
| |
− |
| |
− | rx += vx*dt;
| |
− | ry += vy*dt;
| |
− |
| |
− | if (rx >= w) {rx = rx - w;}
| |
− | if (rx <= 0) {rx = rx + w;}
| |
− | if (ry >= h) {ry = ry - h;}
| |
− | if (ry <= 0) {ry = ry + h;}
| |
− |
| |
− | rxI0 = rx + w;
| |
− | ryI0 = ry;
| |
− |
| |
− | rxI3 = rx + w;
| |
− | ryI3 = ry + h;
| |
− |
| |
− | rxI6 = rx + w;
| |
− | ryI6 = ry + 2*h;
| |
− |
| |
− | rxI1 = rx + 2*w;
| |
− | ryI1 = ry;
| |
− |
| |
− | rxI4 = rx + 2*w;
| |
− | ryI4 = ry + h;
| |
− |
| |
− | rxI7 = rx + 2*w;
| |
− | ryI7 = ry + 2*h;
| |
− |
| |
− | rxI2 = rx;
| |
− | ryI2 = ry + h;
| |
− |
| |
− | rxI5 = rx;
| |
− | ryI5 = ry + 2*h;
| |
− |
| |
− |
| |
− | L = (rx * vy - ry * vx)/500;
| |
− | if (steps % 1 == 0) vGraph.graphIter(steps, L); // подать данные на график
| |
− | console.log(L);
| |
− |
| |
− | }
| |
− |
| |
− |
| |
− | function draw()
| |
− | {
| |
− | ctx.clearRect(0, 0, w_1 , h_1); // очистить экран
| |
− |
| |
− | var x = rx;
| |
− | var y = ry;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(x, y, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− |
| |
− | var xI0 = rxI0;
| |
− | var yI0 = ryI0;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− | var xI1 = rxI1;
| |
− | var yI1 = ryI1;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− | var xI2 = rxI2;
| |
− | var yI2 = ryI2;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− | var xI3 = rxI3;
| |
− | var yI3 = ryI3;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− | var xI4 = rxI4;
| |
− | var yI4 = ryI4;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− | var xI5 = rxI5;
| |
− | var yI5 = ryI5;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− | var xI6 = rxI6;
| |
− | var yI6 = ryI6;
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = "#00008B";
| |
− | ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
| |
− | ctx.closePath();
| |
− | ctx.fill();
| |
− | var xI7 = rxI7;
| |
− | var yI7 = ryI7;
| |
− | 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, 0); // переместить "карандаш" в точку
| |
− | ctx.lineTo(w, h_1); // нарисовать "карандашом" линию до точки
| |
− | ctx.stroke();
| |
− |
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle="#000000";
| |
− | ctx.moveTo(2 * w, 0);
| |
− | ctx.lineTo(2 * w, 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();
| |
− | }
| |
− |
| |
− | setInterval(step, 1000/20);
| |
− | }
| |
− | </syntaxhighlight>
| |
− | </div>
| |
− | </div>
| |
− |
| |
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/TwoBalls/TwoBalls.html |width=1400|height=450 |border=0 }}
| |
− | [[Медиа:TwoBalls.rar|Скачать архив]]
| |
− | <div class="mw-collapsible mw-collapsed" style="width:100%" >
| |
− | '''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content">
| |
− | Файл '''"TwoBalls.js"'''
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | function main_particle_1() {
| |
− |
| |
− | var ctx_11 = canvas_particle_11.getContext("2d");
| |
− | var ctx_12 = canvas_particle_12.getContext("2d");
| |
− | var ctx_13 = canvas_particle_13.getContext("2d");
| |
− | var ctx_21 = canvas_particle_21.getContext("2d");
| |
− | var ctx_22 = canvas_particle_22.getContext("2d");
| |
− | var ctx_23 = canvas_particle_23.getContext("2d");
| |
− | var ctx_31 = canvas_particle_31.getContext("2d");
| |
− | var ctx_32 = canvas_particle_32.getContext("2d");
| |
− | var ctx_33 = canvas_particle_33.getContext("2d");
| |
− |
| |
− |
| |
− | var width = canvas_particle_11.width;
| |
− | var height = canvas_particle_11.height;
| |
− |
| |
− | var rx_1, ry_1, rx_2, ry_2; // координаты шара
| |
− | var v0 = 4, vx_1, vy_1, vx_2, vy_2;
| |
− | var r = 7; // радиус шара
| |
− | var dt_1 = 0; dt_2 = 0;
| |
− | var x0_1 = width/2, x0_2 = width/2, y0_1 = 0, y0_2 = height;
| |
− | var steps = 0;
| |
− | var val = 1;
| |
− | var alfa = 45/180*Math.PI;
| |
− |
| |
− | function step()
| |
− | {
| |
− | tick();
| |
− | draw();
| |
− | }
| |
− |
| |
− | var vGraph = new TM_graph( // определить график
| |
− | "#vGraph", // на html-элементе #vGraph
| |
− | 250, // сколько шагов по оси "x" отображается
| |
− | -1,1,0.2);
| |
− |
| |
− | function tick()
| |
− | { // вычисление новой позиции шар
| |
− | vx_1 = v0 * Math.cos(alfa);
| |
− | vy_1 = v0 * Math.sin(alfa);
| |
− | vx_2 = -v0 * Math.cos(alfa);
| |
− | vy_2 = -v0 * Math.sin(alfa);
| |
− |
| |
− | steps+=1;
| |
− | if (val==1)
| |
− | {
| |
− | rx_1 = vx_1*dt_1 + x0_1 + r - 2.7; //
| |
− | ry_1 = vy_1*dt_1 + y0_1 + r - 2.7;
| |
− | dt_1+= 1;
| |
− | rx_2 = vx_2*dt_2 + x0_2 - r + 2.7; //
| |
− | ry_2 = vy_2*dt_2 + y0_2 - r + 2.7;
| |
− | dt_2+= 1;
| |
− |
| |
− |
| |
− | }
| |
− | else
| |
− | {
| |
− | vy_1 = -vy_1;
| |
− | vx_1 = -vx_1;
| |
− | rx_1 = vx_1*dt_1 + width - r + 2.7;
| |
− | ry_1 = vy_1*dt_1 + x0_1 - r + 2.7;
| |
− | dt_1+= 1;
| |
− | vy_2 = -vy_2;
| |
− | vx_2 = -vx_2;
| |
− | rx_2 = vx_2*dt_2 - 2.7 + r; //
| |
− | ry_2 = vy_2*dt_2 + x0_2 - 2.7 + r;
| |
− | dt_2+= 1;
| |
− | }
| |
− |
| |
− | if (rx_2 < 0 || rx_1 - r> width)
| |
− | {
| |
− | //alert(rx_2);
| |
− | val = 0;
| |
− | dt_1 = 0;
| |
− | dt_2 = 0;
| |
− | }
| |
− |
| |
− | if (ry_1 < 0 || ry_2 - r > height)
| |
− | {
| |
− | val = 1;
| |
− | dt_1=0;
| |
− | dt_2 = 0;
| |
− | }
| |
− |
| |
− |
| |
− | var L = ((rx_1 * vy_1 - ry_1 * vx_1)+(rx_2 * vy_2 - ry_2 * vx_2))/376.2;
| |
− | console.log(L);
| |
− |
| |
− | if (dt_1 % 0.5 == 0) vGraph.graphIter(steps, L); // подать данные на график
| |
− |
| |
− |
| |
− |
| |
− | }
| |
− |
| |
− | function draw() // рисование шара
| |
− | {
| |
− |
| |
− | ctx_11.fillStyle= "#DC143C" ; // цвет закраски
| |
− | ctx_11.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_11.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_11.fill();
| |
− | ctx_11.beginPath();
| |
− |
| |
− | ctx_11.fillStyle = "#00008B";
| |
− | ctx_11.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_11.fill();
| |
− | ctx_11.beginPath();
| |
− |
| |
− | ctx_12.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_12.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_12.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_12.fill();
| |
− | ctx_12.beginPath();
| |
− |
| |
− | ctx_12.fillStyle = "#00008B";
| |
− | ctx_12.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_12.fill();
| |
− | ctx_12.beginPath();
| |
− |
| |
− | ctx_13.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_13.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_13.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_13.fill();
| |
− | ctx_13.beginPath();
| |
− |
| |
− | ctx_13.fillStyle = "#00008B";
| |
− | ctx_13.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_13.fill();
| |
− | ctx_13.beginPath();
| |
− |
| |
− | ctx_21.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_21.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_21.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_21.fill();
| |
− | ctx_21.beginPath();
| |
− |
| |
− | ctx_21.fillStyle = "#00008B";
| |
− | ctx_21.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_21.fill();
| |
− | ctx_21.beginPath();
| |
− |
| |
− | ctx_22.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_22.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_22.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_22.fill();
| |
− | ctx_22.beginPath();
| |
− |
| |
− | ctx_22.fillStyle = "#00008B";
| |
− | ctx_22.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_22.fill();
| |
− | ctx_22.beginPath();
| |
− |
| |
− | ctx_23.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_23.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_23.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_23.fill();
| |
− | ctx_23.beginPath();
| |
− |
| |
− | ctx_23.fillStyle = "#00008B";
| |
− | ctx_23.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_23.fill();
| |
− | ctx_23.beginPath();
| |
− |
| |
− | ctx_31.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_31.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_31.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_31.fill();
| |
− | ctx_31.beginPath();
| |
− |
| |
− | ctx_31.fillStyle = "#00008B";
| |
− | ctx_31.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_31.fill();
| |
− | ctx_31.beginPath();
| |
− |
| |
− | ctx_32.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_32.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_32.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_32.fill();
| |
− | ctx_32.beginPath();
| |
− |
| |
− | ctx_32.fillStyle = "#00008B";
| |
− | ctx_32.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_32.fill();
| |
− | ctx_32.beginPath();
| |
− |
| |
− | ctx_33.fillStyle = "#DC143C"; // цвет закраски
| |
− | ctx_33.clearRect(0, 0, width, height); // очистить экран
| |
− | ctx_33.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
| |
− | ctx_33.fill();
| |
− | ctx_33.beginPath();
| |
− |
| |
− | ctx_33.fillStyle = "#00008B";
| |
− | ctx_33.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
| |
− | ctx_33.fill();
| |
− | ctx_33.beginPath();
| |
− | }
| |
− |
| |
− | setInterval(step, 1000/30); // функция step будет запускаться 30 раз в секунду (30 раз / 1000 мс)
| |
− |
| |
− | }
| |
− | </syntaxhighlight>
| |
− | </div>
| |
− | </div>
| |
− |
| |
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/NBalls/NNN.html |width=1000|height=450|border=0 }}<br />
| |
− |
| |
− | [[Медиа:NNN.rar|Скачать архив]]
| |
− | <div class="mw-collapsible mw-collapsed" style="width:100%" >
| |
− | '''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content">
| |
− | Файл '''"NNN.js"'''
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | function main_particle_1() {
| |
− |
| |
− | var ctx = canvas_particle_1.getContext("2d");
| |
− | 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 r = 7;
| |
− | 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] = -vx_p[i];
| |
− | vy_m[i] = -vy_p[i];
| |
− | 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);
| |
− | ry[0] = Math.random() * (h - 10);
| |
− | while (kol < N)
| |
− | {
| |
− | f = 0;
| |
− | prx = Math.random() * (w - 10);
| |
− | 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;
| |
− |
| |
− | if (rx[i] >= w) {rx[i] = rx[i] - w;}
| |
− | if (rx[i] <= 0) {rx[i] = rx[i] + w;}
| |
− | if (ry[i] >= h) {ry[i] = ry[i] - h;}
| |
− | if (ry[i] <= 0) {ry[i] = ry[i] + h;}
| |
− |
| |
− | rxI0[i] = rx[i] + w;
| |
− | ryI0[i] = ry[i];
| |
− |
| |
− | rxI3[i] = rx[i] + w;
| |
− | ryI3[i] = ry[i] + h;
| |
− |
| |
− | rxI6[i] = rx[i] + w;
| |
− | ryI6[i] = ry[i] + 2*h;
| |
− |
| |
− | rxI1[i] = rx[i] + 2*w;
| |
− | ryI1[i] = ry[i];
| |
− |
| |
− | rxI4[i] = rx[i] + 2*w;
| |
− | ryI4[i] = ry[i] + h;
| |
− |
| |
− | rxI7[i] = rx[i] + 2*w;
| |
− | ryI7[i] = ry[i] + 2*h;
| |
− |
| |
− | rxI2[i] = rx[i];
| |
− | ryI2[i] = ry[i] + h;
| |
− |
| |
− | rxI5[i] = rx[i];
| |
− | 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])/5000;
| |
− | var sumL = L.sum();
| |
− | //график
| |
− | if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
| |
− | //console.log(sumL);
| |
− |
| |
− | }
| |
− |
| |
− | }
| |
− | }
| |
− | }
| |
− |
| |
− |
| |
− | function draw()
| |
− | {
| |
− | ctx.clearRect(0, 0, w_1 , h_1); // очистить экран
| |
− | 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, 0); // переместить "карандаш" в точку
| |
− | ctx.lineTo(w, h_1); // нарисовать "карандашом" линию до точки
| |
− | ctx.stroke();
| |
− |
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle="#000000";
| |
− | ctx.moveTo(2 * w, 0);
| |
− | ctx.lineTo(2 * w, 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();
| |
− | }
| |
− |
| |
− | setInterval(step, 1000/120); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
| |
− |
| |
− | }
| |
− | </syntaxhighlight>
| |
− | </div>
| |
− |
| |
− | ==Ссылки==
| |
− | * [[Виртуальная лаборатория]]
| |
− | <br/>
| |
− | [[Category: Виртуальная лаборатория]]
| |
− | [[Category: Программирование]]
| |
− | [[Category: JavaScript]]
| |