Редактирование: JavaScript-mechanics

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
[[ТМ|Кафедра ТМ]] > [[Программирование]] > [[Программирование и моделирование в Интернет|Интернет]] > [[JavaScript-программирование|JavaScript]] > '''Механика''' <HR>
 
 
 
Если у вас отображается старая версия программы - нажмите "'''Ctrl + F5'''"
 
Если у вас отображается старая версия программы - нажмите "'''Ctrl + F5'''"
 
+
<addscript src=ocanvas-251/>
 
+
<addscript src=Vector2D/>
Левая клавиша мыши по шарику - перетаскивание.
+
<addscript src=mechanics/>
 
 
Левая клавиша мыши по полю - заморозить шарик.
 
 
 
 
 
 
 
 
<htmlet nocache="yes">mechanics_TM</htmlet>
 
<htmlet nocache="yes">mechanics_TM</htmlet>
  
Текст программы на языке JavaScript (разработчики [[Кривцов Антон]], [[Цветков Денис]], использована библиотека [http://ocanvas.org/ oCanvas]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
+
Текст программы на языке JavaScript (разработчик [[Цветков Денис]], использована библиотека [http://ocanvas.org/ oCanvas]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
 
Файл '''"mechanics.js"'''
 
Файл '''"mechanics.js"'''
<syntaxhighlight lang="javascript" line start="1" enclose="div">
+
<source lang="javascript" first-line="1">
 
function MainMech(canvas) {
 
function MainMech(canvas) {
 
    // Предварительные установки   
 
 
 
     var context = canvas.getContext("2d");
 
     var context = canvas.getContext("2d");
 +
    var w = canvas.width;
 +
    var h = canvas.height;
  
     const Pi = 3.1415926;           // число "пи"   
+
     const g0 = 1;                    // масштаб ускорения
 +
    const r0 = h;                    // масштаб длины - высота окна
 +
    const t0 = Math.sqrt(2*r0/g0);   // масштаб времени - за сколько времени шар пролетит весь экран по вертикали
 +
    const v0 = g0*t0;                // масштаб скорости - скорость в нижней точке экрана
  
     const m0 = 1;                   // масштаб массы
+
     const r = r0  / 40;               // радиус шара
     const T0 = 1;                   // масштаб времени (период колебаний исходной системы)
+
     const g = g0*20000;               // 9.8 px, а не метров
     const a0 = 1;                   // масштаб расстояния (диаметр шара)
+
     const dt = 1/(t0*2);             // шаг интегрирования
  
    const g0 = 2 * a0 / T0 / T0;    // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
+
     var count = true;                 // проводить ли расчет системы
 
 
    const k0 = 2 * Pi / T0;          // масштаб частоты
 
    const C0 = m0 * k0 * k0;          // масштаб жесткости
 
    const B0 = 2 * m0 * k0;        // масштаб вязкости
 
 
 
    // *** Задание физических параметров ***
 
 
 
    const Ny = 5; // Число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
 
    const m = 1 * m0;                // масса
 
    const C = 4 * C0;                // жесткость
 
    const B = 0.003 * B0;              // вязкость среды
 
    const B1 = 0.03 * B0;              // вязкость на стенках
 
    const mg = 1 * m * g0;          // сила тяжести
 
   
 
    // *** Задание вычислительных параметров ***
 
 
 
    const fps = 4 * 29;            // frames per second - число кадров в секунду (качечтво отображения)
 
    const spf = 1000;              // steps per frame  - число шагов интегрирования между кадрами (edtkbxbdftn скорость расчета)
 
    const dt  = 0.01 * T0 / fps;      // шаг интегрирования (качество расчета)
 
 
 
    // Выполнение программы
 
 
 
    var scale = canvas.height / Ny / a0;// масштабный коэффициент для перехода от расчетных к экранным координатам
 
    var w = canvas.width / scale; // ширина окна в расчетных координатах
 
    var h = canvas.height / scale; // высота окна в расчетных координатах
 
    var r = a0 / 2;              // радиус шара
 
 
 
    var x = 4 * r; var y = h - r; // начальное положение шара
 
 
 
     var count = true;                 // проводить ли расчет системы
 
  
 
     // создаем объект, связанный с элементом canvas на html странице
 
     // создаем объект, связанный с элементом canvas на html странице
 
     var ocanvas = oCanvas.create({
 
     var ocanvas = oCanvas.create({
         canvas: "#canvasMech",       // canvasMech - id объекта canvas на html странице
+
         canvas: "#canvasMech",       // canvasMech - id объекта canvas на html странице
         fps: fps                        // сколько кадров в секунду
+
         fps: t0*2                    // сколько кадров в секунду
 
     });
 
     });
  
     // создаем шар
+
     // создаем круг
 
     var arc = ocanvas.display.arc({
 
     var arc = ocanvas.display.arc({
         x: x * scale,
+
         x: 4*r,
         y: y * scale,
+
         y: r0/2,
         radius: r * scale,
+
         radius: r,
         end: 360,                     // круг 360 градусов
+
        start: 0,
 +
         end: 360,
 
         fill: "rgba(0, 0, 255, 1)"    // цвет
 
         fill: "rgba(0, 0, 255, 1)"    // цвет
 
     }).add();
 
     }).add();
  
     // захват шара мышью
+
     // захват объекта мышью
     var mx, my;      // актуальная позиция мыши
+
    var m0x = 0;    var m0y = 0;      // предыдущая позиция мыши
 +
     var mx = 0;    var my = 0;      // актуальная позиция мыши
 
     arc.dragAndDrop({
 
     arc.dragAndDrop({
         changeZindex: true,           // если много шариков - захваченный будет нарисован спереди
+
         changeZindex: true,           // если много шариков - захваченный будет нарисован спереди
 
         start: function ()  {
 
         start: function ()  {
             count = false;           // на время захвата - отключить расчет
+
             count = false;           // на время захвата - отключить расчет
             this.fill = "rgba(0, 0, 255, 0.5)";     // пока держим шарик - он полупрозрачен
+
             this.fill = "rgba(0, 0, 255, 0.5)";     // пока держим шарик - он полупрозрачен
        mx = ocanvas.mouse.x;   my = ocanvas.mouse.y;
+
            m0x = 0;    m0y = 0;
 +
            mx = 0;     my = 0;
 
         },
 
         },
 
         move: function ()  {
 
         move: function ()  {
x = arc.x / scale;    y = arc.y / scale;
+
            m0x = mx;   m0y = my;
        vx = .001*(ocanvas.mouse.x-mx)/dt/fps;   vy = .001*(ocanvas.mouse.y-my)/dt/fps;
+
            mx = ocanvas.mouse.x;
        mx = ocanvas.mouse.x;                   my = ocanvas.mouse.y;
+
            my = ocanvas.mouse.y;
 
         },
 
         },
 
         end: function ()    {
 
         end: function ()    {
 
             count = true;
 
             count = true;
 
             this.fill = "rgba(0, 0, 255, 1)";      // отпускаем шарик - полупрозрачность убирается
 
             this.fill = "rgba(0, 0, 255, 1)";      // отпускаем шарик - полупрозрачность убирается
      }
+
            // толкаем шарик по направлению движения мыши
 +
            vx = (mx-m0x)*100;
 +
            vy = (my-m0y)*100;
 +
        }
 
     });
 
     });
   
+
     ocanvas.bind("mousedown", function () {count = false;});    // заморозить объект при клике на поле
     ocanvas.bind("mousedown", function () {count = false;});    // заморозить фигуру при клике на поле
 
  
     var fx = 0;            var fy = mg;             // сила, действующая на шар
+
     var vvx = 0;            var vvy = g;           // ускорение
     var vx = 0;           var vy = 0;             // скорость
+
     var vx = 0;             var vy = 0;             // скорость
 +
    function physics(){                            // то, что происходит каждый шаг времени
 +
        if (!count) return;
  
     function physics(){                            // то, что происходит каждый шаг времени
+
        vx += vvx*dt;      vy += vvy*dt;
 +
        var dx = vx*dt;     var dy = vy*dt;
 +
        arc.x += dx;        arc.y += dy;
  
if (!count) return;
+
        // проверка граничных условий
    for (var s=1; s<=spf; s++) {
+
        if (arc.y + r > r0) {          // нижняя граница (ось "y" направлена вниз)
 +
            arc.y = r0-r;
 +
            vy = -vy;
 +
        }
 +
        if (arc.y - r < 0) {            // верхняя граница
 +
            arc.y = r;
 +
            vy = -vy;
 +
        }
  
        fx = - B * vx; fy = mg - B * vy;
+
        if (arc.x + r > w) {           // правая граница
        if (y + r > h) { fy += -C * (y + r - h) - B1 * vy; }
+
            arc.x = w-r;
        if (y - r < 0) { fy += -C * (y - r) - B1 * vy;}
+
            vx = -vx;
        if (x + r > w) { fx += -C * (x + r - w) - B1 * vx; }
+
        }
        if (x - r < 0) { fx += -C * (x - r) - B1 * vx; }
+
        if (arc.x - r + dx < 0) {       // левая граница
+
            arc.x = r;
        vx += fx / m * dt;  vy += fy / m * dt;
+
            vx = -vx;
        x  += vx * dt;    y  += vy * dt;
+
        }
 
arc.x = x * scale;   arc.y = y * scale;
 
    }
 
 
     }
 
     }
   
 
 
     ocanvas.setLoop(physics).start();  // функция, выполняющаяся на каждом шаге
 
     ocanvas.setLoop(physics).start();  // функция, выполняющаяся на каждом шаге
 
}
 
}
</syntaxhighlight>
+
</source>
 
</toggledisplay>
 
</toggledisplay>
  
 
== См. также ==
 
== См. также ==
*[[JavaScript-пружина]]
 
 
*[[JavaScript-mechanics-box2D]]
 
*[[JavaScript-mechanics-box2D]]
 
*[[JavaScript-приложения]]
 
*[[JavaScript-приложения]]
  
[[Category: Виртуальная лаборатория]]
 
 
[[Category: Программирование]]
 
[[Category: Программирование]]
 
[[Category: JavaScript]]
 
[[Category: JavaScript]]
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)
Источник — «http://tm.spbstu.ru/JavaScript-mechanics»