Периодические граничные условия — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Результаты)
 
(не показано 36 промежуточных версий 2 участников)
Строка 6: Строка 6:
 
* руководитель [[Кузькин Виталий]]
 
* руководитель [[Кузькин Виталий]]
  
Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе». А если частица пересекает границу расчетной области, она появляется с другой стороны. В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:<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>,
Строка 35: Строка 38:
  
 
Кинетический момент вычисляется по формуле:
 
Кинетический момент вычисляется по формуле:
 +
<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 />
  
<math>L(t) = \sum_{i\in\wedge(t)} r_i\times mV_i </math>
+
[[Медиа:NNN.rar|Скачать архив]]
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/One/Ex12.html |width=1000 |height=640 |border=0 }}
+
<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>
  
Скачать [[Медиа:One.zip|One.zip]].
+
==Ссылки==
 +
* [[Виртуальная лаборатория]]
 +
<br/>
 +
[[Category: Виртуальная лаборатория]]
 +
[[Category: Программирование]]
 +
[[Category: JavaScript]]

Текущая версия на 14:50, 15 февраля 2016

Виртуальная лаборатория>Периодические граничные условия

Курсовой проект по механике дискретных сред[править]

Краткое описание[править]

Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.
В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:
  • однородности времени соответствует закон сохранения энергии,
  • однородности пространства соответствует закон сохранения импульса,
  • изотропии пространства соответствует закон сохранения момента импульса,
  • калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.
Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.

Цель проекта[править]

  • Визуализация системы частиц с периодическими граничными условиями.
  • Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.

Математическая модель[править]

Граничные условия:

если [math]x \gt w[/math], то [math]x = x - w[/math]

если [math] x \lt 0 [/math], то [math] x = x + w [/math]

если [math] y \gt h [/math], то [math] y = y - h [/math]

если [math] y \lt 0 [/math], то [math] y = y + h [/math]

Где x и у - это координаты частицы, а w и h - ширина и длина окна соответственно.

Кинетический момент вычисляется по формуле: [math]L(t) = \sum_{i\in\wedge(t)} r_i\times mV_i [/math]

Результаты[править]


Скачать архив

Текст программы на языке 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 }

Ссылки[править]