Редактирование: Периодические граничные условия
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 455: | Строка 455: | ||
function main_particle_1() { | 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(); | |
− | + | ||
− | + | L = new Array(); | |
− | + | Array.prototype.sum = function() | |
− | + | { | |
− | + | for (var i=0, sum=0; i < this.length; sum += this[i++]); | |
− | + | return sum; | |
− | + | } | |
− | + | ||
− | + | ||
− | + | var distR0,distR2,distR3,distR; | |
− | + | ||
− | + | var D = 5; | |
− | + | var a; | |
− | + | var a0 = w * 0.1; | |
− | + | ||
− | + | vx = new Array(); //Скорость по Х | |
− | + | vy = new Array(); //Скорость по У | |
− | + | dt = 0.01; | |
− | + | ||
− | + | ||
− | + | ||
− | + | for (i = 0; i < N; ++i) | |
− | + | { | |
− | + | vx[i] = Math.random()*55; | |
− | + | vy[i] = Math.random()*55; | |
− | + | } | |
− | + | 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 | |
− | + | 250, // сколько шагов по оси "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; | |
− | + | ||
− | + | //расчет расстояний | |
− | + | ||
− | + | 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)); | |
− | + | ||
− | + | //расчет сил | |
− | + | 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; | |
− | + | } | |
− | + | } | |
− | + | ||
− | + | L[i] = (rx[i] * vy[i] - ry[i] * vx[i])/35000; | |
− | + | var sumL = L.sum(); | |
− | + | if (steps % 100 == 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/60); // функция step будет запускаться 60 раз в секунду (60 раз / 1000 мс) | ||
+ | |||
+ | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> |