Периодические граничные условия — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
(→Результаты) |
(→Результаты) |
||
Строка 165: | Строка 165: | ||
− | setInterval(step, 1000/100); // функция step будет запускаться | + | setInterval(step, 1000/100); // функция step будет запускаться 100 раз в секунду (100 раз / 1000 мс) |
} | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> | ||
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/TwoBalls/TwoBalls.html |width=1400|height=450 |border=0 }} | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/TwoBalls/TwoBalls.html |width=1400|height=450 |border=0 }} | ||
[[Медиа:TwoBalls.rar|Скачать архив]] | [[Медиа: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/NBalls.html |width=1400|height=450 |border=0 }} | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tenitskaya/NBalls/NBalls.html |width=1400|height=450 |border=0 }} | ||
[[Медиа:NBalls.rar|Скачать архив]] | [[Медиа:NBalls.rar|Скачать архив]] | ||
+ | <div class="mw-collapsible mw-collapsed" style="width:100%" > | ||
+ | '''Текст программы на языке JavaScript (разработчик [[Теницкая Татьяна]]):''' <div class="mw-collapsible-content"> | ||
+ | Файл '''"NBalls.js"''' | ||
+ | <syntaxhighlight lang="javascript" line start="1" enclose="div"> | ||
+ | function main_particle_1(canvas_particle_1)//,canvas_particle_2,canvas_particle_3,canvas_particle_4,canvas_particle_5,canvas_particle_6,canvas_particle_7,canvas_particle_8,canvas_particle_9) { | ||
+ | { | ||
+ | |||
+ | var ctx = canvas_particle_1.getContext("2d"); | ||
+ | var W = canvas_particle_1.width; | ||
+ | var H = canvas_particle_1.height; | ||
+ | |||
+ | var dx = 10; | ||
+ | var w = W/3 - dx; | ||
+ | var h = H/3 - dx; | ||
+ | var r = 7; | ||
+ | var N = 15;//количество частиц | ||
+ | |||
+ | var a0 = w*0.1; //равновесное расстояние | ||
+ | var D = 100;//удельная энергия коэффициент в формуле силы | ||
+ | rx = new Array();//Содержит координаты частиц по оси Х | ||
+ | ry = new Array();//Содержит координаты частиц по оси У | ||
+ | vx = new Array();//Скорость по Х | ||
+ | vy = new Array();//Скорость по У | ||
+ | L = new Array(); | ||
+ | num_canv = new Array(); | ||
+ | var mod_f = 0;//модуль силы | ||
+ | var f = 0; | ||
+ | var rass = 0;//расстояние между частицами | ||
+ | var fx_i= 0;//сила по х | ||
+ | var fy_i = 0;//сида по у | ||
+ | var dt = 0.0025;//шаг интегрирования | ||
+ | v = new Array(0,0,0); | ||
+ | //==========Заготовки для создания начальных конфигураций====== | ||
+ | for (j = 0;j<N;j++)//начальные скорости | ||
+ | { | ||
+ | vx[j] = Math.random()*10;//Math.random(); | ||
+ | vy[j] = Math.random()*10;//Math.random() ; | ||
+ | } | ||
+ | var kol = 0; | ||
+ | var prx = 0; | ||
+ | var pry = 0; | ||
+ | var dist = 0; | ||
+ | var f; | ||
+ | rx[0] = Math.random() * w; //w*(0.5+(j-2)*0.15); | ||
+ | ry[0] = Math.random() * h;//h/2; | ||
+ | kol = 1; | ||
+ | while (kol<N) | ||
+ | { | ||
+ | f =0; | ||
+ | prx = Math.random() * w; //w*(0.5+(j-2)*0.15); | ||
+ | pry = Math.random() * h;//h/2; | ||
+ | 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; //w*(0.5+(j-2)*0.15); | ||
+ | ry[kol] = pry;//h/2; | ||
+ | kol++; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //================================================ | ||
+ | |||
+ | var steps = 0; | ||
+ | |||
+ | function step() | ||
+ | { | ||
+ | tick(); | ||
+ | draw(); | ||
+ | } | ||
+ | var vGraph = new TM_graph( // определить график | ||
+ | "#vGraph", // на html-элементе #vGraph | ||
+ | 500, // сколько шагов по оси "x" отображается | ||
+ | -1,1,0.5); | ||
+ | |||
+ | function tick() | ||
+ | { | ||
+ | |||
+ | steps += 1; | ||
+ | for (i = 0; i < N; i++) //расчет сил и скоростей | ||
+ | for (j = 0; j < N; j++) | ||
+ | { | ||
+ | if (i!=j) | ||
+ | { | ||
+ | rass = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2)); | ||
+ | |||
+ | var r2 = r*r; | ||
+ | var b = Math.pow(13/7,1/6)*r; | ||
+ | var b2 = b * b; | ||
+ | var rass2 = rass * rass; | ||
+ | var acut = 2 * r;//14 | ||
+ | var acut2 = acut*acut; | ||
+ | if (rass >= 0 && rass <= b) {k = 1;}//0;7.76 | ||
+ | if (rass >= acut) {k = 0;} | ||
+ | if (rass >= b && rass <= acut) | ||
+ | { | ||
+ | k = Math.pow((1- Math.pow((rass2 - b2)/(acut2-b2),2)),2); | ||
+ | } | ||
+ | |||
+ | mod_f = 5000/r2*k*((Math.pow(r/rass),8)-Math.pow((r/rass),14)); | ||
+ | if (mod_f < 0){mod_f = 4;} | ||
+ | |||
+ | fx_i = mod_f*(rx[i]-rx[j]); | ||
+ | fy_i = mod_f*(ry[i]-ry[j]); | ||
+ | vx[i]+=fx_i*dt; | ||
+ | vx[j]-=fx_i*dt; | ||
+ | vy[i]+=fy_i*dt; | ||
+ | vy[j]-=fy_i*dt; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (i = 0; i < N; i++) //пересчет положений | ||
+ | { | ||
+ | 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;} | ||
+ | |||
+ | |||
+ | var sumL = 0; | ||
+ | L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/1100; | ||
+ | sumL += L[i]; | ||
+ | if (steps % 100 == 0) vGraph.graphIter(steps, sumL); // подать данные на график | ||
+ | //console.log(sumL); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | function draw() | ||
+ | { | ||
+ | |||
+ | |||
+ | ctx.clearRect(0, 0, W , H ); // очистить экран | ||
+ | ctx.beginPath(); | ||
+ | for (var i1 = 1; i1<3;i1++) | ||
+ | for (var i2 = 1;i2<3;i2++) | ||
+ | { | ||
+ | var px = i1 *(h+dx); | ||
+ | var py = i2 *(w+dx); | ||
+ | ctx.moveTo(px, 0); | ||
+ | ctx.lineTo(px, H); | ||
+ | ctx.moveTo(0, py); | ||
+ | ctx.lineTo(W,py); | ||
+ | ctx.strokeStyle = "#000000"; // цвет линии | ||
+ | ctx.stroke(); | ||
+ | } | ||
+ | for (var i = 0; i < rx.length; i++) | ||
+ | for (var ii = 0; ii<3;ii++) | ||
+ | for (var jj = 0; jj<3; jj++) | ||
+ | for (var i = 0; i < N; i++) | ||
+ | { | ||
+ | var xS_Real0 = rx[i] + ii*(h + dx); | ||
+ | var yS_Real0 = ry[i]+ jj*(w + dx); | ||
+ | ctx.beginPath(); | ||
+ | ctx.fillStyle = "#00008B"; | ||
+ | ctx.arc(xS_Real0, yS_Real0, r , 0, 2 * Math.PI, false); | ||
+ | ctx.closePath(); | ||
+ | ctx.fill(); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | setInterval(step, 1000/20); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс) | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | </div> | ||
+ | </div> |
Версия 22:31, 4 февраля 2016
Виртуальная лаборатория>Периодические граничные условияСодержание
Курсовой проект по механике дискретных сред
- разработчик Теницкая Татьяна
- руководитель Кузькин Виталий
Краткое описание
- Метод периодических граничных условий был разработан для решения задач теории жидкостей и плотных газов. Он состоит в том,что вокруг расчетной области строятся ее «образы» с актуальным положением частиц. И частицы «реальной» области взаимодействуют с частицами в «образе», а если частица пересекает границу расчетной области, она появляется с другой стороны.
- В теореме Нетер утверждается, что каждой непрерывной симметрии физической системы соответствует некоторый закон сохранения:
- однородности времени соответствует закон сохранения энергии,
- однородности пространства соответствует закон сохранения импульса,
- изотропии пространства соответствует закон сохранения момента импульса,
- калибровочной симметрии соответствует закон сохранения электрического заряда и т. д.
- Но для классической системы частиц с периодическими условиями сохранение момента импульса нарушается. Этот эффект наглядно проиллюстрирован в данной курсовой работе.
Цель проекта
- Визуализация системы частиц с периодическими граничными условиями.
- Построение графиков зависимости кинетического момента от времени для одной частицы, двух частиц, многих частиц.
Математическая модель
Граничные условия:
если
, тоесли
, тоесли
, тоесли
, тоГде x и у - это координаты частицы, а w и h - ширина и длина окна соответственно.
Кинетический момент вычисляется по формуле:
Результаты
Текст программы на языке JavaScript (разработчик Теницкая Татьяна):
Файл "OneBall.js"
1 function main_particle_1() {
2
3 var ctx = canvas_particle_1.getContext("2d");
4 var w = canvas_particle_1.width; //длина
5 var h = canvas_particle_1.height; //высота
6
7
8 var w_1 = w/3;
9 var h_1 = h/3;
10
11 rx = new Array(0, w_1, 2*w_1, 0, w_1, 2*w_1, 0, w_1, 2*w_1);
12 ry = new Array(60, 60, 60, 60 + h_1, 60 + h_1, 60 + h_1, 60 + 2*h_1, 60 + 2*h_1, 60 + 2*h_1);
13
14 // координаты шара
15 var v0 = 1; // скорость шара
16 var r = 7; // радиус шара
17 var dt = 5;
18 var alfa = 45 / 180 * Math.PI;
19 var steps = 0;
20
21 function step()
22 {
23 tick();
24 draw();
25 }
26
27 var vGraph = new TM_graph( // определить график
28 "#vGraph", // на html-элементе #vGraph
29 250, // сколько шагов по оси "x" отображается
30 -1, 1,0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y
31
32 function tick()
33 {
34 for (i = 0; i < rx.length; i++)
35 {
36 vx = v0 * Math.cos(alfa);
37 vy = v0 * Math.sin(alfa);
38 steps+=1;
39
40 rx[i] += vx*dt;
41 ry[i] += vy*dt;
42
43
44 if (rx[i] >= w)
45 {
46 rx[i] = rx[i] - w;
47 }
48
49 if (rx[i] <= 0)
50 {
51 rx[i] = rx[i] + w;
52 }
53
54 if (ry[i] >= h)
55 {
56 ry[i] = ry[i] - h;
57 }
58
59 if (ry[i] <= 0)
60 {
61 ry[i] = ry[i] + h;
62 }
63 }
64
65 var L = (rx[8] * vy - ry[8] * vx)/240.4164;
66
67 console.log(L);
68
69 if (dt % 0.5 == 0) vGraph.graphIter(steps, L); // подать данные на график
70 }
71
72
73
74
75 function draw()
76 {
77 ctx.clearRect(0, 0, w , h ); // очистить экран
78 for (var i = 0; i < rx.length; i++)
79 {
80 var xS = rx[i];
81 var yS = ry[i];
82
83
84 ctx.beginPath();
85 ctx.fillStyle = "#00008B";
86 ctx.arc(xS, yS, r , 0, 2 * Math.PI, false);
87 ctx.closePath();
88 ctx.fill();
89
90 ctx.beginPath(); // начать рисование
91 ctx.fillStyle="#000000";
92 ctx.moveTo(w_1, 0); // переместить "карандаш" в точку
93 ctx.lineTo(w_1, h); // нарисовать "карандашом" линию до точки
94 ctx.stroke();
95
96 ctx.beginPath();
97 ctx.fillStyle="#000000";
98 ctx.moveTo(2*w_1, 0);
99 ctx.lineTo(2*w_1, h);
100 ctx.stroke();
101
102 ctx.beginPath();
103 ctx.fillStyle="#000000";
104 ctx.moveTo(0, h_1);
105 ctx.lineTo(w, h_1);
106 ctx.stroke();
107
108 ctx.beginPath();
109 ctx.fillStyle="#000000";
110 ctx.moveTo(0, 2*h_1);
111 ctx.lineTo(w, 2*h_1);
112 ctx.stroke();
113
114 }
115 }
116
117
118 setInterval(step, 1000/100); // функция step будет запускаться 100 раз в секунду (100 раз / 1000 мс)
119
120 }
Текст программы на языке 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 (разработчик Теницкая Татьяна):
Файл "NBalls.js"
1 function main_particle_1(canvas_particle_1)//,canvas_particle_2,canvas_particle_3,canvas_particle_4,canvas_particle_5,canvas_particle_6,canvas_particle_7,canvas_particle_8,canvas_particle_9) {
2 {
3
4 var ctx = canvas_particle_1.getContext("2d");
5 var W = canvas_particle_1.width;
6 var H = canvas_particle_1.height;
7
8 var dx = 10;
9 var w = W/3 - dx;
10 var h = H/3 - dx;
11 var r = 7;
12 var N = 15;//количество частиц
13
14 var a0 = w*0.1; //равновесное расстояние
15 var D = 100;//удельная энергия коэффициент в формуле силы
16 rx = new Array();//Содержит координаты частиц по оси Х
17 ry = new Array();//Содержит координаты частиц по оси У
18 vx = new Array();//Скорость по Х
19 vy = new Array();//Скорость по У
20 L = new Array();
21 num_canv = new Array();
22 var mod_f = 0;//модуль силы
23 var f = 0;
24 var rass = 0;//расстояние между частицами
25 var fx_i= 0;//сила по х
26 var fy_i = 0;//сида по у
27 var dt = 0.0025;//шаг интегрирования
28 v = new Array(0,0,0);
29 //==========Заготовки для создания начальных конфигураций======
30 for (j = 0;j<N;j++)//начальные скорости
31 {
32 vx[j] = Math.random()*10;//Math.random();
33 vy[j] = Math.random()*10;//Math.random() ;
34 }
35 var kol = 0;
36 var prx = 0;
37 var pry = 0;
38 var dist = 0;
39 var f;
40 rx[0] = Math.random() * w; //w*(0.5+(j-2)*0.15);
41 ry[0] = Math.random() * h;//h/2;
42 kol = 1;
43 while (kol<N)
44 {
45 f =0;
46 prx = Math.random() * w; //w*(0.5+(j-2)*0.15);
47 pry = Math.random() * h;//h/2;
48 for (i = 0; i < kol;i++)
49 {
50 dist = Math.pow((rx[i]-prx),2)+Math.pow((ry[i]-pry),2);
51 if (dist<Math.pow(2*a0,2))
52 {
53 f = f+1;
54 }
55 }
56 if (f==0)
57 {
58 rx[kol] = prx; //w*(0.5+(j-2)*0.15);
59 ry[kol] = pry;//h/2;
60 kol++;
61 }
62 }
63
64 //================================================
65
66 var steps = 0;
67
68 function step()
69 {
70 tick();
71 draw();
72 }
73 var vGraph = new TM_graph( // определить график
74 "#vGraph", // на html-элементе #vGraph
75 500, // сколько шагов по оси "x" отображается
76 -1,1,0.5);
77
78 function tick()
79 {
80
81 steps += 1;
82 for (i = 0; i < N; i++) //расчет сил и скоростей
83 for (j = 0; j < N; j++)
84 {
85 if (i!=j)
86 {
87 rass = Math.sqrt(Math.pow((rx[i]-rx[j]),2)+Math.pow((ry[i]-ry[j]),2));
88
89 var r2 = r*r;
90 var b = Math.pow(13/7,1/6)*r;
91 var b2 = b * b;
92 var rass2 = rass * rass;
93 var acut = 2 * r;//14
94 var acut2 = acut*acut;
95 if (rass >= 0 && rass <= b) {k = 1;}//0;7.76
96 if (rass >= acut) {k = 0;}
97 if (rass >= b && rass <= acut)
98 {
99 k = Math.pow((1- Math.pow((rass2 - b2)/(acut2-b2),2)),2);
100 }
101
102 mod_f = 5000/r2*k*((Math.pow(r/rass),8)-Math.pow((r/rass),14));
103 if (mod_f < 0){mod_f = 4;}
104
105 fx_i = mod_f*(rx[i]-rx[j]);
106 fy_i = mod_f*(ry[i]-ry[j]);
107 vx[i]+=fx_i*dt;
108 vx[j]-=fx_i*dt;
109 vy[i]+=fy_i*dt;
110 vy[j]-=fy_i*dt;
111 }
112 }
113
114 for (i = 0; i < N; i++) //пересчет положений
115 {
116 rx[i] += vx[i]*dt;
117 ry[i] += vy[i]*dt;
118 if (rx[i] >= w) {rx[i] = rx[i] - w;}
119 if (rx[i] <= 0) {rx[i] = rx[i] + w;}
120 if (ry[i] >= h) {ry[i] = ry[i] - h;}
121 if (ry[i] <= 0) {ry[i] = ry[i] + h;}
122
123
124 var sumL = 0;
125 L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/1100;
126 sumL += L[i];
127 if (steps % 100 == 0) vGraph.graphIter(steps, sumL); // подать данные на график
128 //console.log(sumL);
129 }
130 }
131
132
133 function draw()
134 {
135
136
137 ctx.clearRect(0, 0, W , H ); // очистить экран
138 ctx.beginPath();
139 for (var i1 = 1; i1<3;i1++)
140 for (var i2 = 1;i2<3;i2++)
141 {
142 var px = i1 *(h+dx);
143 var py = i2 *(w+dx);
144 ctx.moveTo(px, 0);
145 ctx.lineTo(px, H);
146 ctx.moveTo(0, py);
147 ctx.lineTo(W,py);
148 ctx.strokeStyle = "#000000"; // цвет линии
149 ctx.stroke();
150 }
151 for (var i = 0; i < rx.length; i++)
152 for (var ii = 0; ii<3;ii++)
153 for (var jj = 0; jj<3; jj++)
154 for (var i = 0; i < N; i++)
155 {
156 var xS_Real0 = rx[i] + ii*(h + dx);
157 var yS_Real0 = ry[i]+ jj*(w + dx);
158 ctx.beginPath();
159 ctx.fillStyle = "#00008B";
160 ctx.arc(xS_Real0, yS_Real0, r , 0, 2 * Math.PI, false);
161 ctx.closePath();
162 ctx.fill();
163 }
164
165 }
166
167
168 setInterval(step, 1000/20); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс)
169
170 }