Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
− | '''Исполнители:''' [[ Егорова Екатерина]], [[Эдель Мария]] <br> | + | '''Исполнители:''' [http://tm.spbstu.ru/%D0%95%D0%B3%D0%BE%D1%80%D0%BE%D0%B2%D0%B0_%D0%95%D0%BA%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D0%BD%D0%B0 Егорова Екатерина], Эдель Мария <br> |
| '''Группа:''' 3630103/90003 <br> | | '''Группа:''' 3630103/90003 <br> |
| '''Семестр:''' весна 2020 года.<br> | | '''Семестр:''' весна 2020 года.<br> |
Строка 17: |
Строка 17: |
| == Визуализация == | | == Визуализация == |
| {{#widget: Iframe | url=http://tm.spbstu.ru/htmlets/js2020/Egorova/mindex.html | width=700 | height=600 | border=0}} | | {{#widget: Iframe | url=http://tm.spbstu.ru/htmlets/js2020/Egorova/mindex.html | width=700 | height=600 | border=0}} |
− | | + | == Код программы на языке JavaScript == |
− | ==Скрипт== | |
| <div class="mw-collapsible mw-collapsed"> | | <div class="mw-collapsible mw-collapsed"> |
− | '''Код программы на языке JavaScript:''' <div class="mw-collapsible-content"> | + | '''Код программы:''' <div class="mw-collapsible-content"> |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| + | {{#widget: Iframe | url=http://tm.spbstu.ru/htmlets/js2020/Egorova/mscript.js | width=1000 | height=1000 | border=0}} |
− | window.addEventListener('load', main, false);
| |
− | function main(){
| |
− | | |
− | var ctx = canvas_example.getContext('2d');
| |
− | var w = canvas_example.width;
| |
− | var h = canvas_example.height;
| |
− | | |
− | | |
− | function ball(x, y, r, m, Fx, Fy) {
| |
− | this.x = x;
| |
− | this.y = y;
| |
− | this.vx = 0;
| |
− | this.vy = 0;
| |
− | this.r = r;
| |
− | this.m = m;
| |
− | this.Fx = Fx;
| |
− | this.Fy = Fy;
| |
− | }
| |
− | | |
− |
| |
− |
| |
− | var X_c = w/2;
| |
− | var Y_c = h/3;
| |
− | var Vy_c = 0;
| |
− | | |
− | var balls = [];
| |
− | var r = 10;
| |
− |
| |
− |
| |
− | for (var i=0; i<27; i++) {
| |
− | balls.push(new ball(r+(w)*(i/27), h-r, r, 1, 0, 0));
| |
− | }
| |
− | for (var i=0; i<26; i++) {
| |
− | balls.push(new ball(2*r+(w)*(i/27), h-3*r, r, 1, 0, 0));
| |
− | }
| |
− | for (var i=0; i<27; i++) {
| |
− | balls.push(new ball(r+(w)*(i/27), h-5*r, r, 1, 0, 0));
| |
− | }
| |
− | for (var i=0; i<26; i++) {
| |
− | balls.push(new ball(2*r+(w)*(i/27), h-7*r, r, 1, 0, 0));
| |
− | }
| |
− | for (var i=0; i<27; i++) {
| |
− | balls.push(new ball(r+(w)*(i/27), h-9*r, r, 1, 0, 0));
| |
− | }
| |
− | for (var i=0; i<26; i++) {
| |
− | balls.push(new ball(2*r+(w)*(i/27), h-11*r, r, 1, 0, 0));
| |
− | }
| |
− | for (var i=0; i<27; i++) {
| |
− | balls.push(new ball(r+(w)*(i/27), h-13*r, r, 1, 0, 0));
| |
− | }
| |
− |
| |
− | /*console.log(radius(R));
| |
− | console.log(svyaz(D));
| |
− |
| |
− | start.onclick = function() {
| |
− | R = radius();
| |
− | D = svyaz();*/
| |
− |
| |
− |
| |
− | var r_ball = new ball(X_c, Y_c, R, 50, 0, 0)
| |
− | r_ball.vy = 20;
| |
− | var N = 159;
| |
− | var a = 40;
| |
− | var dt = 0.001;
| |
− | var g = 1;
| |
− |
| |
− |
| |
− |
| |
− | function draw() {
| |
− | ctx.clearRect(0,0,w,h);
| |
− | for (var i=0; i<N; i++) {
| |
− | ctx.beginPath();
| |
− | ctx.arc(balls[i].x, balls[i].y, balls[i].r, 0, 2*Math.PI);
| |
− | ctx.fillStyle = '#FF4500'
| |
− | ctx.stroke();
| |
− | ctx.fill();
| |
− | | |
− | }
| |
− | | |
− |
| |
− | ctx.beginPath();
| |
− | ctx.fillStyle = '#0000FF'
| |
− | ctx.strokeStyle = '#000000';
| |
− | ctx.arc(r_ball.x, r_ball.y, r_ball.r, 0, 2*Math.PI);
| |
− | ctx.stroke();
| |
− | ctx.fill();
| |
− |
| |
− | }
| |
− | | |
− |
| |
− | | |
− | function phys() {
| |
− | // обнуляем силы шариков
| |
− | for (var i=0; i<N; i++) {
| |
− | balls[i].Fx = 0;
| |
− | balls[i].Fy = 0;
| |
− | }
| |
− | r_ball.Fx = 0;
| |
− | r_ball.Fy = 0;
| |
− | // считаем силы
| |
− | for (var i=0; i<N-1; i++) {
| |
− | for (var j=i+1; j<N; j++) {
| |
− | var a = balls[i].r+balls[j].r;
| |
− | var r2 = (balls[i].x-balls[j].x)*(balls[i].x-balls[j].x)+(balls[i].y-balls[j].y)*(balls[i].y-balls[j].y);
| |
− | var Fx = 12*D/a/a*(Math.pow(a, 14)/Math.pow(r2, 7)-Math.pow(a, 8)/Math.pow(r2, 4))*(balls[i].x-balls[j].x);
| |
− | var Fy = 12*D/a/a*(Math.pow(a, 14)/Math.pow(r2, 7)-Math.pow(a, 8)/Math.pow(r2, 4))*(balls[i].y-balls[j].y);
| |
− | balls[i].Fx += Fx/balls[i].m;
| |
− | balls[i].Fy += Fy/balls[i].m;
| |
− | balls[j].Fx -= Fx/balls[j].m;
| |
− | balls[j].Fy -= Fy/balls[j].m;
| |
− | }
| |
− | var a = balls[i].r+r_ball.r;
| |
− | var r2 = (balls[i].x-r_ball.x)*(balls[i].x-r_ball.x)+(balls[i].y-r_ball.y)*(balls[i].y-r_ball.y);
| |
− | if (r2<a*a) {
| |
− | var Fx = 12*D/a*(Math.pow(a, 14)/Math.pow(r2, 7)-Math.pow(a, 8)/Math.pow(r2, 4))*(balls[i].x-r_ball.x);
| |
− | var Fy = 12*D/a*(Math.pow(a, 14)/Math.pow(r2, 7)-Math.pow(a, 8)/Math.pow(r2, 4))*(balls[i].y-r_ball.y);
| |
− | balls[i].Fx += Fx/balls[i].m;
| |
− | balls[i].Fy += Fy/balls[i].m;
| |
− | r_ball.Fx -= Fx/r_ball.m;
| |
− | r_ball.Fy -= Fy/r_ball.m;
| |
− | }
| |
− | }
| |
− |
| |
− | // двигаем шарики
| |
− | for (var i=0; i<N; i++) {
| |
− | balls[i].vx += balls[i].Fx*dt;
| |
− | balls[i].vy += (balls[i].Fy+g)*dt;
| |
− | balls[i].x += balls[i].vx*dt;
| |
− | balls[i].y += balls[i].vy*dt;
| |
− |
| |
− | if (balls[i].y < r) {
| |
− | balls[i].y = r;
| |
− | }
| |
− |
| |
− | if (balls[i].y > h-r) {
| |
− | balls[i].y = h-r;
| |
− | }
| |
− |
| |
− | if (balls[i].x>w-r) {
| |
− | balls[i].x = w-r;
| |
− | }
| |
− |
| |
− | if (balls[i].x<r) {
| |
− | balls[i].x = r;
| |
− | }
| |
− | var betta = 0.7;
| |
− | r_ball.vx += (r_ball.Fx-betta*r_ball.vx)*dt;
| |
− | r_ball.vy += (r_ball.Fy+g-betta*r_ball.vy)*dt;
| |
− | r_ball.x += r_ball.vx*dt;
| |
− | r_ball.y += r_ball.vy*dt;
| |
− |
| |
− | if (r_ball.y < r) {
| |
− | r_ball.vy *=-1;
| |
− | }
| |
− |
| |
− | if (r_ball.y > h-20) {
| |
− | r_ball.vy *=-1;
| |
− | }
| |
− |
| |
− | if (r_ball.x>w-20) {
| |
− | r_ball.vx *=-1;
| |
− | }
| |
− |
| |
− | if (r_ball.x<20) {
| |
− | r_ball.vx *=-1;
| |
− | }
| |
− | }
| |
− | }
| |
− | | |
− | | |
− | draw();
| |
− | | |
− | function control() {
| |
− | phys();
| |
− | draw();
| |
− | }
| |
− | | |
− | var timer = setInterval(control, 10);
| |
− | }
| |
− | }
| |
− |
| |
− | | |
− | </syntaxhighlight>
| |
− | </div>
| |