JavaScript-mechanics

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
Кафедра ТМ > Программирование > Интернет > JavaScript > Механика

Если у вас отображается старая версия программы - нажмите "Ctrl + F5"


Левая клавиша мыши по шарику - перетаскивание.

Левая клавиша мыши по полю - заморозить шарик.


Не удается найти HTML-файл mechanics_TM.html

Текст программы на языке JavaScript (разработчики Кривцов Антон, Цветков Денис, использована библиотека oCanvas): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default"> Файл "mechanics.js"

  1 function MainMech(canvas) {
  2 
  3     // Предварительные установки    
  4 
  5     var context = canvas.getContext("2d");
  6 
  7     const Pi = 3.1415926;           // число "пи"    
  8 
  9     const m0 = 1;                   // масштаб массы
 10     const T0 = 1;                   // масштаб времени (период колебаний исходной системы)
 11     const a0 = 1;                   // масштаб расстояния (диаметр шара)
 12 
 13     const g0 = 2 * a0 / T0 / T0;    // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
 14 
 15     const k0 = 2 * Pi / T0;           	// масштаб частоты
 16     const C0 = m0 * k0 * k0;          	// масштаб жесткости
 17     const B0 = 2 * m0 * k0;  	      	// масштаб вязкости
 18 
 19     // *** Задание физических параметров ***
 20 
 21     const Ny = 5;						// Число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
 22     const m = 1 * m0;                 	// масса
 23     const C = 4 * C0;                 	// жесткость 
 24     const B = 0.003 * B0;              	// вязкость среды
 25     const B1 = 0.03 * B0;              	// вязкость на стенках
 26     const mg = 1 * m * g0;          	// сила тяжести
 27     
 28      // *** Задание вычислительных параметров ***
 29 
 30     const fps = 4 * 29;             	// frames per second - число кадров в секунду (качечтво отображения)
 31     const spf = 1000;              		// steps per frame   - число шагов интегрирования между кадрами (edtkbxbdftn скорость расчета)
 32     const dt  = 0.01 * T0 / fps;      	// шаг интегрирования (качество расчета)
 33 
 34     // Выполнение программы
 35 
 36     var scale = canvas.height / Ny / a0;// масштабный коэффициент для перехода от расчетных к экранным координатам
 37     var w = canvas.width / scale;		// ширина окна в расчетных координатах
 38     var h = canvas.height / scale;		// высота окна в расчетных координатах
 39     var r = a0 / 2;               	// радиус шара
 40 
 41     var x = 4 * r;	var y = h - r;		// начальное положение шара
 42 
 43     var count = true;                 	// проводить ли расчет системы
 44 
 45     // создаем объект, связанный с элементом canvas на html странице
 46     var ocanvas = oCanvas.create({
 47         canvas: "#canvasMech",        	// canvasMech - id объекта canvas на html странице
 48         fps: fps                        // сколько кадров в секунду
 49     });
 50 
 51     // создаем шар
 52     var arc = ocanvas.display.arc({
 53         x: x * scale,
 54         y: y * scale,
 55         radius: r * scale,
 56         end: 360,                     // круг 360 градусов
 57         fill: "rgba(0, 0, 255, 1)"    // цвет
 58     }).add();
 59 
 60     // захват шара мышью
 61     var mx, my;       // актуальная позиция мыши
 62     arc.dragAndDrop({
 63         changeZindex: true,           						// если много шариков - захваченный будет нарисован спереди
 64         start: function ()  {
 65             count = false;            						// на время захвата - отключить расчет
 66             this.fill = "rgba(0, 0, 255, 0.5)";     		// пока держим шарик - он полупрозрачен
 67         	mx = ocanvas.mouse.x;    					my = ocanvas.mouse.y;
 68         },
 69         move: function ()  {
 70 			x = arc.x / scale;    		y = arc.y / scale;
 71         	vx = .001*(ocanvas.mouse.x-mx)/dt/fps;   	vy = .001*(ocanvas.mouse.y-my)/dt/fps;
 72         	mx = ocanvas.mouse.x;                   	my = ocanvas.mouse.y;
 73         },
 74         end: function ()    {
 75             count = true;
 76             this.fill = "rgba(0, 0, 255, 1)";       // отпускаем шарик - полупрозрачность убирается
 77        }
 78     });
 79     
 80     ocanvas.bind("mousedown", function () {count = false;});    // заморозить фигуру при клике на поле
 81 
 82     var fx = 0;            var fy = mg;             // сила, действующая на шар
 83     var vx = 0;            var vy = 0;              // скорость
 84 
 85     function physics(){                             // то, что происходит каждый шаг времени
 86 
 87  		if (!count) return;
 88     	for (var s=1; s<=spf; s++) {
 89 
 90 	        fx = - B * vx; fy = mg - B * vy;
 91 	        if (y + r > h) { fy += -C * (y + r - h) - B1 * vy; }
 92 	        if (y - r < 0) { fy += -C * (y - r) - B1 * vy;}
 93 	        if (x + r > w) { fx += -C * (x + r - w) - B1 * vx; }
 94 	        if (x - r < 0) { fx += -C * (x - r) - B1 * vx; }
 95 	
 96 	        vx += fx / m * dt;  vy += fy / m * dt;
 97 	        x  += vx * dt;    	y  += vy * dt;
 98 			
 99 			arc.x = x * scale;    		arc.y = y * scale;
100 	    }
101     }
102     
103     ocanvas.setLoop(physics).start();   // функция, выполняющаяся на каждом шаге
104 }

</toggledisplay>

См. также[править]