Периодические граничные условия — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
(→Результаты) |
|||
(не показано 50 промежуточных версий 4 участников) | |||
Строка 1: | Строка 1: | ||
[[Виртуальная лаборатория]]>[[Периодические граничные условия]] <HR> | [[Виртуальная лаборатория]]>[[Периодические граничные условия]] <HR> | ||
− | + | ===Курсовой проект по механике дискретных сред=== | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | * разработчик [[Теницкая Татьяна]] | |
− | + | * руководитель [[Кузькин Виталий]] | |
− | + | ===Краткое описание=== | |
− | |||
− | < | + | :Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.<br /> |
− | < | + | :В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:<br /> |
+ | * однородности времени соответствует закон сохранения энергии,<br /> | ||
+ | * однородности пространства соответствует закон сохранения импульса,<br /> | ||
+ | * изотропии пространства соответствует закон сохранения момента импульса,<br /> | ||
+ | * калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.<br /> | ||
+ | :Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.<br /> | ||
+ | ===Цель проекта=== | ||
+ | * Визуализация системы частиц с периодическими граничными условиями. | ||
+ | * Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.<br /> | ||
− | + | ===Математическая модель=== | |
− | + | Граничные условия: | |
− | <math> | + | если <math>x > w</math>, |
− | <math> | + | то <math>x = x - w</math> |
− | + | если <math> x < 0 </math>, | |
+ | то <math> x = x + w </math> | ||
− | + | если <math> y > h </math>, | |
+ | то <math> y = y - h </math> | ||
+ | если <math> y < 0 </math>, | ||
+ | то <math> y = y + h </math> | ||
+ | |||
+ | Где x и у - это координаты частицы, а w и h - ширина и длина окна соответственно. | ||
+ | |||
+ | Кинетический момент вычисляется по формуле: | ||
<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]] |
Текущая версия на 14:50, 15 февраля 2016
Виртуальная лаборатория>Периодические граничные условияСодержание
Курсовой проект по механике дискретных сред[править]
- разработчик Теницкая Татьяна
- руководитель Кузькин Виталий
Краткое описание[править]
- Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.
- В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:
- однородности времени соответствует закон сохранения энергии,
- однородности пространства соответствует закон сохранения импульса,
- изотропии пространства соответствует закон сохранения момента импульса,
- калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.
- Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.
Цель проекта[править]
- Визуализация системы частиц с периодическими граничными условиями.
- Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.
Математическая модель[править]
Граничные условия:
если
, тоесли
, тоесли
, тоесли
, тоГде x и у - это координаты частицы, а w и h - ширина и длина окна соответственно.
Кинетический момент вычисляется по формуле:
Результаты[править]
Текст программы на языке JavaScript (разработчик Теницкая Татьяна):
Файл "One_Ball.js"
1 function main_particle_1() {
2
3 var ctx = canvas_particle_1.getContext("2d");
4 var w_1 = canvas_particle_1.width;
5 var h_1 = canvas_particle_1.height;
6 var w = w_1/3;
7 var h = h_1/3;
8
9 var r = 7;
10 var N = 1;
11 var rx,ry; //Содержит координаты частиц по оси Х //Содержит координаты частиц по оси У
12
13 var rxI0,rxI1,rxI2,rxI3,rxI4,rxI5,rxI6,rxI7;
14 var ryI0,ryI1,ryI2,ryI3,ryI4,ryI5,ryI6,ryI7;
15
16 var vx,vy;
17 var L;
18
19 dt = 0.3;
20 var alfa = 45 / 180 * Math.PI;
21 //0.04380741654852822
22 var v0 = 5;
23 vx = v0 * Math.cos(alfa);
24 vy = v0 * Math.sin(alfa);
25
26
27 rx = Math.random() * (w - 10);
28 ry = Math.random() * (h - 10);
29
30 var steps = 0;
31
32
33 function step()
34 {
35 tick();
36 draw();
37 }
38 var vGraph = new TM_graph( // определить график
39 "#vGraph", // на html-элементе #vGraph
40 200, // сколько шагов по оси "x" отображается
41 -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
42
43 function tick()
44 {
45
46 steps += 1;
47
48 rx += vx*dt;
49 ry += vy*dt;
50
51 if (rx >= w) {rx = rx - w;}
52 if (rx <= 0) {rx = rx + w;}
53 if (ry >= h) {ry = ry - h;}
54 if (ry <= 0) {ry = ry + h;}
55
56 rxI0 = rx + w;
57 ryI0 = ry;
58
59 rxI3 = rx + w;
60 ryI3 = ry + h;
61
62 rxI6 = rx + w;
63 ryI6 = ry + 2*h;
64
65 rxI1 = rx + 2*w;
66 ryI1 = ry;
67
68 rxI4 = rx + 2*w;
69 ryI4 = ry + h;
70
71 rxI7 = rx + 2*w;
72 ryI7 = ry + 2*h;
73
74 rxI2 = rx;
75 ryI2 = ry + h;
76
77 rxI5 = rx;
78 ryI5 = ry + 2*h;
79
80
81 L = (rx * vy - ry * vx)/500;
82 if (steps % 1 == 0) vGraph.graphIter(steps, L); // подать данные на график
83 console.log(L);
84
85 }
86
87
88 function draw()
89 {
90 ctx.clearRect(0, 0, w_1 , h_1); // очистить экран
91
92 var x = rx;
93 var y = ry;
94 ctx.beginPath();
95 ctx.fillStyle = "#00008B";
96 ctx.arc(x, y, r , 0, 2 * Math.PI, false);
97 ctx.closePath();
98 ctx.fill();
99
100 var xI0 = rxI0;
101 var yI0 = ryI0;
102 ctx.beginPath();
103 ctx.fillStyle = "#00008B";
104 ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
105 ctx.closePath();
106 ctx.fill();
107 var xI1 = rxI1;
108 var yI1 = ryI1;
109 ctx.beginPath();
110 ctx.fillStyle = "#00008B";
111 ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
112 ctx.closePath();
113 ctx.fill();
114 var xI2 = rxI2;
115 var yI2 = ryI2;
116 ctx.beginPath();
117 ctx.fillStyle = "#00008B";
118 ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
119 ctx.closePath();
120 ctx.fill();
121 var xI3 = rxI3;
122 var yI3 = ryI3;
123 ctx.beginPath();
124 ctx.fillStyle = "#00008B";
125 ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
126 ctx.closePath();
127 ctx.fill();
128 var xI4 = rxI4;
129 var yI4 = ryI4;
130 ctx.beginPath();
131 ctx.fillStyle = "#00008B";
132 ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
133 ctx.closePath();
134 ctx.fill();
135 var xI5 = rxI5;
136 var yI5 = ryI5;
137 ctx.beginPath();
138 ctx.fillStyle = "#00008B";
139 ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
140 ctx.closePath();
141 ctx.fill();
142 var xI6 = rxI6;
143 var yI6 = ryI6;
144 ctx.beginPath();
145 ctx.fillStyle = "#00008B";
146 ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
147 ctx.closePath();
148 ctx.fill();
149 var xI7 = rxI7;
150 var yI7 = ryI7;
151 ctx.beginPath();
152 ctx.fillStyle = "#00008B";
153 ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false);
154 ctx.closePath();
155 ctx.fill();
156
157
158 ctx.beginPath(); // начать рисование
159 ctx.fillStyle="#000000";
160 ctx.moveTo(w, 0); // переместить "карандаш" в точку
161 ctx.lineTo(w, h_1); // нарисовать "карандашом" линию до точки
162 ctx.stroke();
163
164 ctx.beginPath();
165 ctx.fillStyle="#000000";
166 ctx.moveTo(2 * w, 0);
167 ctx.lineTo(2 * w, h_1);
168 ctx.stroke();
169
170 ctx.beginPath();
171 ctx.fillStyle="#000000";
172 ctx.moveTo(0, h);
173 ctx.lineTo(w_1, h);
174 ctx.stroke();
175
176 ctx.beginPath();
177 ctx.fillStyle="#000000";
178 ctx.moveTo(0, 2 * h);
179 ctx.lineTo(w_1, 2 * h);
180 ctx.stroke();
181 }
182
183 setInterval(step, 1000/20);
184 }
Текст программы на языке JavaScript (разработчик Теницкая Татьяна):
Файл "TwoBalls.js"
1 function main_particle_1() {
2
3 var ctx_11 = canvas_particle_11.getContext("2d");
4 var ctx_12 = canvas_particle_12.getContext("2d");
5 var ctx_13 = canvas_particle_13.getContext("2d");
6 var ctx_21 = canvas_particle_21.getContext("2d");
7 var ctx_22 = canvas_particle_22.getContext("2d");
8 var ctx_23 = canvas_particle_23.getContext("2d");
9 var ctx_31 = canvas_particle_31.getContext("2d");
10 var ctx_32 = canvas_particle_32.getContext("2d");
11 var ctx_33 = canvas_particle_33.getContext("2d");
12
13
14 var width = canvas_particle_11.width;
15 var height = canvas_particle_11.height;
16
17 var rx_1, ry_1, rx_2, ry_2; // координаты шара
18 var v0 = 4, vx_1, vy_1, vx_2, vy_2;
19 var r = 7; // радиус шара
20 var dt_1 = 0; dt_2 = 0;
21 var x0_1 = width/2, x0_2 = width/2, y0_1 = 0, y0_2 = height;
22 var steps = 0;
23 var val = 1;
24 var alfa = 45/180*Math.PI;
25
26 function step()
27 {
28 tick();
29 draw();
30 }
31
32 var vGraph = new TM_graph( // определить график
33 "#vGraph", // на html-элементе #vGraph
34 250, // сколько шагов по оси "x" отображается
35 -1,1,0.2);
36
37 function tick()
38 { // вычисление новой позиции шар
39 vx_1 = v0 * Math.cos(alfa);
40 vy_1 = v0 * Math.sin(alfa);
41 vx_2 = -v0 * Math.cos(alfa);
42 vy_2 = -v0 * Math.sin(alfa);
43
44 steps+=1;
45 if (val==1)
46 {
47 rx_1 = vx_1*dt_1 + x0_1 + r - 2.7; //
48 ry_1 = vy_1*dt_1 + y0_1 + r - 2.7;
49 dt_1+= 1;
50 rx_2 = vx_2*dt_2 + x0_2 - r + 2.7; //
51 ry_2 = vy_2*dt_2 + y0_2 - r + 2.7;
52 dt_2+= 1;
53
54
55 }
56 else
57 {
58 vy_1 = -vy_1;
59 vx_1 = -vx_1;
60 rx_1 = vx_1*dt_1 + width - r + 2.7;
61 ry_1 = vy_1*dt_1 + x0_1 - r + 2.7;
62 dt_1+= 1;
63 vy_2 = -vy_2;
64 vx_2 = -vx_2;
65 rx_2 = vx_2*dt_2 - 2.7 + r; //
66 ry_2 = vy_2*dt_2 + x0_2 - 2.7 + r;
67 dt_2+= 1;
68 }
69
70 if (rx_2 < 0 || rx_1 - r> width)
71 {
72 //alert(rx_2);
73 val = 0;
74 dt_1 = 0;
75 dt_2 = 0;
76 }
77
78 if (ry_1 < 0 || ry_2 - r > height)
79 {
80 val = 1;
81 dt_1=0;
82 dt_2 = 0;
83 }
84
85
86 var L = ((rx_1 * vy_1 - ry_1 * vx_1)+(rx_2 * vy_2 - ry_2 * vx_2))/376.2;
87 console.log(L);
88
89 if (dt_1 % 0.5 == 0) vGraph.graphIter(steps, L); // подать данные на график
90
91
92
93 }
94
95 function draw() // рисование шара
96 {
97
98 ctx_11.fillStyle= "#DC143C" ; // цвет закраски
99 ctx_11.clearRect(0, 0, width, height); // очистить экран
100 ctx_11.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
101 ctx_11.fill();
102 ctx_11.beginPath();
103
104 ctx_11.fillStyle = "#00008B";
105 ctx_11.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
106 ctx_11.fill();
107 ctx_11.beginPath();
108
109 ctx_12.fillStyle = "#DC143C"; // цвет закраски
110 ctx_12.clearRect(0, 0, width, height); // очистить экран
111 ctx_12.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
112 ctx_12.fill();
113 ctx_12.beginPath();
114
115 ctx_12.fillStyle = "#00008B";
116 ctx_12.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
117 ctx_12.fill();
118 ctx_12.beginPath();
119
120 ctx_13.fillStyle = "#DC143C"; // цвет закраски
121 ctx_13.clearRect(0, 0, width, height); // очистить экран
122 ctx_13.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
123 ctx_13.fill();
124 ctx_13.beginPath();
125
126 ctx_13.fillStyle = "#00008B";
127 ctx_13.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
128 ctx_13.fill();
129 ctx_13.beginPath();
130
131 ctx_21.fillStyle = "#DC143C"; // цвет закраски
132 ctx_21.clearRect(0, 0, width, height); // очистить экран
133 ctx_21.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
134 ctx_21.fill();
135 ctx_21.beginPath();
136
137 ctx_21.fillStyle = "#00008B";
138 ctx_21.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
139 ctx_21.fill();
140 ctx_21.beginPath();
141
142 ctx_22.fillStyle = "#DC143C"; // цвет закраски
143 ctx_22.clearRect(0, 0, width, height); // очистить экран
144 ctx_22.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
145 ctx_22.fill();
146 ctx_22.beginPath();
147
148 ctx_22.fillStyle = "#00008B";
149 ctx_22.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
150 ctx_22.fill();
151 ctx_22.beginPath();
152
153 ctx_23.fillStyle = "#DC143C"; // цвет закраски
154 ctx_23.clearRect(0, 0, width, height); // очистить экран
155 ctx_23.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
156 ctx_23.fill();
157 ctx_23.beginPath();
158
159 ctx_23.fillStyle = "#00008B";
160 ctx_23.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
161 ctx_23.fill();
162 ctx_23.beginPath();
163
164 ctx_31.fillStyle = "#DC143C"; // цвет закраски
165 ctx_31.clearRect(0, 0, width, height); // очистить экран
166 ctx_31.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
167 ctx_31.fill();
168 ctx_31.beginPath();
169
170 ctx_31.fillStyle = "#00008B";
171 ctx_31.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
172 ctx_31.fill();
173 ctx_31.beginPath();
174
175 ctx_32.fillStyle = "#DC143C"; // цвет закраски
176 ctx_32.clearRect(0, 0, width, height); // очистить экран
177 ctx_32.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
178 ctx_32.fill();
179 ctx_32.beginPath();
180
181 ctx_32.fillStyle = "#00008B";
182 ctx_32.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
183 ctx_32.fill();
184 ctx_32.beginPath();
185
186 ctx_33.fillStyle = "#DC143C"; // цвет закраски
187 ctx_33.clearRect(0, 0, width, height); // очистить экран
188 ctx_33.arc(rx_1, ry_1, r, 0, 2 * Math.PI);
189 ctx_33.fill();
190 ctx_33.beginPath();
191
192 ctx_33.fillStyle = "#00008B";
193 ctx_33.arc(rx_2, ry_2, r, 0, 2 * Math.PI);
194 ctx_33.fill();
195 ctx_33.beginPath();
196 }
197
198 setInterval(step, 1000/30); // функция step будет запускаться 30 раз в секунду (30 раз / 1000 мс)
199
200 }
Текст программы на языке JavaScript (разработчик Теницкая Татьяна):
Файл "NNN.js"
1 function main_particle_1() {
2
3 var ctx = canvas_particle_1.getContext("2d");
4 var w_1 = canvas_particle_1.width;
5 var h_1 = canvas_particle_1.height;
6 var w = w_1/3;
7 var h = h_1/3;
8
9 var r = 7;
10 var N = 10;
11 rx = new Array(); //Содержит координаты частиц по оси Х
12 ry = new Array(); //Содержит координаты частиц по оси У
13 rxI0 = new Array();rxI1 = new Array();rxI2 = new Array();rxI3 = new Array();rxI4 = new Array();rxI5 = new Array();rxI6 = new Array();rxI7 = new Array();
14 ryI0 = new Array();ryI1= new Array();ryI2= new Array();ryI3= new Array();ryI4= new Array();ryI5= new Array();ryI6= new Array();ryI7= new Array();
15 vx = new Array(); //Скорость по Х
16 vy = new Array(); //Скорость по У
17 vx_p = new Array();vx_m = new Array();vy_p = new Array();vy_m = new Array();
18 var distR0,distR2,distR3,distR;
19
20 L = new Array();
21 var D = 5;
22 var a0 = w * 0.1;
23 var c = 72 * D/r;
24 var W = Math.sqrt(c);
25 var T = 2 * Math.PI/W;
26 dt = 0.03;
27 //0.04380741654852822
28
29 for (i = 0; i < N/2; ++i)
30 {
31 vx_p[i] = Math.random()*15;
32 vy_p[i] = Math.random()*15;
33 vx_m[i] = -vx_p[i];
34 vy_m[i] = -vy_p[i];
35 vx = vx_p.concat(vx_m);
36 vy = vy_p.concat(vy_m);
37 }
38
39 var kol = 1;
40 var prx = 0;
41 var pry = 0;
42 var dist = 0;
43 var f;
44 rx[0] = Math.random() * (w - 10);
45 ry[0] = Math.random() * (h - 10);
46 while (kol < N)
47 {
48 f = 0;
49 prx = Math.random() * (w - 10);
50 pry = Math.random() * (h - 10);
51 for (i = 0; i < kol; i++)
52 {
53 dist = Math.pow((rx[i] - prx),2)+Math.pow((ry[i] - pry),2);
54 if (dist < Math.pow(2 * a0,2))
55 {
56 f = f+1;
57 }
58 }
59 if (f==0)
60 {
61 rx[kol] = prx;
62 ry[kol] = pry;
63 kol++;
64 }
65 }
66 var steps = 0;
67
68
69 function step()
70 {
71 tick();
72 draw();
73 }
74 var vGraph = new TM_graph( // определить график
75 "#vGraph", // на html-элементе #vGraph
76 1000, // сколько шагов по оси "x" отображается
77 -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
78
79 function tick()
80 {
81 for (i = 0; i < N ; i++)
82 {
83
84 steps += 1;
85
86 rx[i] += vx[i]*dt;
87 ry[i] += vy[i]*dt;
88
89 if (rx[i] >= w) {rx[i] = rx[i] - w;}
90 if (rx[i] <= 0) {rx[i] = rx[i] + w;}
91 if (ry[i] >= h) {ry[i] = ry[i] - h;}
92 if (ry[i] <= 0) {ry[i] = ry[i] + h;}
93
94 rxI0[i] = rx[i] + w;
95 ryI0[i] = ry[i];
96
97 rxI3[i] = rx[i] + w;
98 ryI3[i] = ry[i] + h;
99
100 rxI6[i] = rx[i] + w;
101 ryI6[i] = ry[i] + 2*h;
102
103 rxI1[i] = rx[i] + 2*w;
104 ryI1[i] = ry[i];
105
106 rxI4[i] = rx[i] + 2*w;
107 ryI4[i] = ry[i] + h;
108
109 rxI7[i] = rx[i] + 2*w;
110 ryI7[i] = ry[i] + 2*h;
111
112 rxI2[i] = rx[i];
113 ryI2[i] = ry[i] + h;
114
115 rxI5[i] = rx[i];
116 ryI5[i] = ry[i] + 2*h;
117
118
119
120 //раcсчет расстояний
121
122 for (j = 0; j < N ; j++)
123 {
124 if (i != j)
125 {
126 distR0 = Math.sqrt(Math.pow((rx[i]-rxI0[j]),2)+Math.pow((ry[i]-ryI0[j]),2));
127 distR2 = Math.sqrt(Math.pow((rx[i]-rxI2[j]),2)+Math.pow((ry[i]-ryI2[j]),2));
128 distR3 = Math.sqrt(Math.pow((rx[i]-rxI3[j]),2)+Math.pow((ry[i]-ryI3[j]),2));
129 distR = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
130
131 //раcсчет сил
132 a = 4 * r;
133 if (distR0 < 2*r)
134 {
135 var mod_fR0,fxR0,fyR0;
136
137 mod_fR0 = 12*D*((Math.pow(r/distR0),13)-Math.pow((r/distR0),7))/a;
138 //console.log(mod_fR0);
139 if (mod_fR0 >=0)
140 {
141 fxR0 = mod_fR0*(rx[i]-rxI0[j]);
142 fyR0 = mod_fR0*(ry[i]-ryI0[j]);
143 vx[i]+=fxR0*dt;
144 vx[j]-=fxR0*dt;
145 vy[i]+=fyR0*dt;
146 vy[j]-=fyR0*dt;
147 }
148 }
149 if (distR2 < 2*r)
150 {
151 var mod_fR2,fxR2,fyR2;
152
153 mod_fR2 = 12*D*((Math.pow(r/distR2),13)-Math.pow((r/distR2),7))/a;
154
155 if (mod_fR2 >=0)
156 {
157 fxR2 = mod_fR2*(rx[i]-rxI2[j]);
158 fyR2 = mod_fR2*(ry[i]-ryI2[j]);
159 vx[i]+=fxR2*dt;
160 vx[j]-=fxR2*dt;
161 vy[i]+=fyR2*dt;
162 vy[j]-=fyR2*dt;
163 }
164 }
165 if (distR3 < 2*r)
166 {
167 var mod_fR3,fxR3,fyR3;
168
169 mod_fR3 = 12*D*((Math.pow(r/distR3),13)-Math.pow((r/distR3),7))/a;
170
171 if (mod_fR3 >=0)
172 {
173 fxR3 = mod_fR3*(rx[i]-rxI3[j]);
174 fyR3 = mod_fR3*(ry[i]-ryI3[j]);
175 vx[i]+=fxR3*dt;
176 vx[j]-=fxR3*dt;
177 vy[i]+=fyR3*dt;
178 vy[j]-=fyR3*dt;
179 }
180 }
181
182 if (distR < 2*r)
183 {
184 var mod_fR,fxR,fyR;
185 mod_fR = 12*D*((Math.pow(r/distR),13)-Math.pow((r/distR),7))/a;
186 if (mod_fR >=0)
187 {
188 fxR = mod_fR*(rx[i]-rx[j]);
189 fyR = mod_fR*(ry[i]-ry[j]);
190 vx[i]+=fxR*dt;
191 vx[j]-=fxR*dt;
192 vy[i]+=fyR*dt;
193 vy[j]-=fyR*dt;
194 }
195 }
196
197 Array.prototype.sum = function()
198 {
199 for (var i=0, sum=0; i < this.length; sum += this[i++]);
200 return sum;
201 }
202
203
204 L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/5000;
205 var sumL = L.sum();
206 //график
207 if (steps % 50 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
208 //console.log(sumL);
209
210 }
211
212 }
213 }
214 }
215
216
217 function draw()
218 {
219 ctx.clearRect(0, 0, w_1 , h_1); // очистить экран
220 for (var i = 0; i < N; i++)
221
222 {
223 var x = rx[i];
224 var y = ry[i];
225 ctx.beginPath();
226 ctx.fillStyle = "#00008B";
227 ctx.arc(x, y, r , 0, 2 * Math.PI, false);
228 ctx.closePath();
229 ctx.fill();
230
231 var xI0 = rxI0[i];
232 var yI0 = ryI0[i];
233 ctx.beginPath();
234 ctx.fillStyle = "#00008B";
235 ctx.arc(xI0, yI0, r , 0, 2 * Math.PI, false);
236 ctx.closePath();
237 ctx.fill();
238 var xI1 = rxI1[i];
239 var yI1 = ryI1[i];
240 ctx.beginPath();
241 ctx.fillStyle = "#00008B";
242 ctx.arc(xI1, yI1, r , 0, 2 * Math.PI, false);
243 ctx.closePath();
244 ctx.fill();
245 var xI2 = rxI2[i];
246 var yI2 = ryI2[i];
247 ctx.beginPath();
248 ctx.fillStyle = "#00008B";
249 ctx.arc(xI2, yI2, r , 0, 2 * Math.PI, false);
250 ctx.closePath();
251 ctx.fill();
252 var xI3 = rxI3[i];
253 var yI3 = ryI3[i];
254 ctx.beginPath();
255 ctx.fillStyle = "#00008B";
256 ctx.arc(xI3, yI3, r , 0, 2 * Math.PI, false);
257 ctx.closePath();
258 ctx.fill();
259 var xI4 = rxI4[i];
260 var yI4 = ryI4[i];
261 ctx.beginPath();
262 ctx.fillStyle = "#00008B";
263 ctx.arc(xI4, yI4, r , 0, 2 * Math.PI, false);
264 ctx.closePath();
265 ctx.fill();
266 var xI5 = rxI5[i];
267 var yI5 = ryI5[i];
268 ctx.beginPath();
269 ctx.fillStyle = "#00008B";
270 ctx.arc(xI5, yI5, r , 0, 2 * Math.PI, false);
271 ctx.closePath();
272 ctx.fill();
273 var xI6 = rxI6[i];
274 var yI6 = ryI6[i];
275 ctx.beginPath();
276 ctx.fillStyle = "#00008B";
277 ctx.arc(xI6, yI6, r , 0, 2 * Math.PI, false);
278 ctx.closePath();
279 ctx.fill();
280 var xI7 = rxI7[i];
281 var yI7 = ryI7[i];
282 ctx.beginPath();
283 ctx.fillStyle = "#00008B";
284 ctx.arc(xI7, yI7, r , 0, 2 * Math.PI, false);
285 ctx.closePath();
286 ctx.fill();
287
288 }
289 ctx.beginPath(); // начать рисование
290 ctx.fillStyle="#000000";
291 ctx.moveTo(w, 0); // переместить "карандаш" в точку
292 ctx.lineTo(w, h_1); // нарисовать "карандашом" линию до точки
293 ctx.stroke();
294
295 ctx.beginPath();
296 ctx.fillStyle="#000000";
297 ctx.moveTo(2 * w, 0);
298 ctx.lineTo(2 * w, h_1);
299 ctx.stroke();
300
301 ctx.beginPath();
302 ctx.fillStyle="#000000";
303 ctx.moveTo(0, h);
304 ctx.lineTo(w_1, h);
305 ctx.stroke();
306
307 ctx.beginPath();
308 ctx.fillStyle="#000000";
309 ctx.moveTo(0, 2 * h);
310 ctx.lineTo(w_1, 2 * h);
311 ctx.stroke();
312 }
313
314 setInterval(step, 1000/120); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
315
316 }