Редактирование: Balls v4

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
[[Виртуальная лаборатория]] > [[Динамика взаимодействующих частиц]] > [[Balls - версии]] > [[Balls v4]] <HR>
+
[[ТМ|Кафедра ТМ]] > [[Программирование]] > [[Программирование и моделирование в Интернет|Интернет]] > [[JavaScript-программирование|JavaScript]] > [[JavaScript - Balls|Balls]] > '''Balls v4''' <HR>
  
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Tcvetkov/Balls/Balls_v4_release/Balls_v4_release.html |width=830 |height=630 |border=0 }}
+
<addscript src=Balls_v4_release/>
 +
<htmlet nocache="yes">Balls_v4_TM</htmlet>
  
  
 
Скачать программу: [[Медиа:Balls_v4_release.zip|Balls_v4_release.zip]]
 
Скачать программу: [[Медиа:Balls_v4_release.zip|Balls_v4_release.zip]]
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
Текст программы на языке JavaScript (разработчики [[Кривцов Антон]], [[Цветков Денис]]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
'''Текст программы на языке JavaScript (разработчики [[Кривцов Антон]], [[Цветков Денис]]):''' <div class="mw-collapsible-content">
 
 
Файл '''"Balls_v4_release.js"'''
 
Файл '''"Balls_v4_release.js"'''
<syntaxhighlight lang="javascript" line start="1" enclose="div">
+
<source lang="javascript" first-line="1">
window.addEventListener("load", MainBalls, true);
+
function MainMech(canvas) {
function MainBalls() {
 
  
 
     // Предварительные установки
 
     // Предварительные установки
  
    var canvas = canvasBalls;
 
 
     var context = canvas.getContext("2d");                  // на context происходит рисование
 
     var context = canvas.getContext("2d");                  // на context происходит рисование
     canvas.oncontextmenu = function (e) {return false;};   // блокировка контекстного меню
+
     document.oncontextmenu=function(e){return false};       // блокировка контекстного меню
  
     var Pi = 3.1415926;                  // число "пи"
+
     const Pi = 3.1415926;                  // число "пи"
  
     var m0 = 1;                          // масштаб массы
+
     const m0 = 1;                          // масштаб массы
     var T0 = 1;                          // масштаб времени (период колебаний исходной системы)
+
     const T0 = 1;                          // масштаб времени (период колебаний исходной системы)
     var a0 = 1;                          // масштаб расстояния (диаметр шара)
+
     const a0 = 1;                          // масштаб расстояния (диаметр шара)
  
     var g0 = a0 / T0 / T0;                // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
+
     const g0 = a0 / T0 / T0;                // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
     var k0 = 2 * Pi / T0;                 // масштаб частоты
+
 
     var C0 = m0 * k0 * k0;               // масштаб жесткости
+
     const k0 = 2 * Pi / T0;               // масштаб частоты
     var B0 = 2 * m0 * k0;                 // масштаб вязкости
+
     const C0 = m0 * k0 * k0;             // масштаб жесткости
 +
     const B0 = 2 * m0 * k0;           // масштаб вязкости
  
 
     // *** Задание физических параметров ***
 
     // *** Задание физических параметров ***
  
     var Ny = 5;                           // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
+
     const Ny = 5;     // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
     var m = 1 * m0;                       // масса
+
     const m = 1 * m0;                     // масса
     var Cwall = 10 * C0;                 // жесткость стен
+
     const Cwall = 10 * C0;                 // жесткость стен
     var Cball = 0.1 * Cwall;              // жесткость между частицами
+
     const Cball = 0.1 * Cwall;              // жесткость между частицами
     var B = 0.008 * B0;                   // вязкость среды
+
     const B = 0.008 * B0;                 // вязкость среды
     var Bwall = 0.03 * B0;               // вязкость на стенках
+
     const B1 = 0.03 * B0;                 // вязкость на стенках
     var mg = 0.25 * m * g0;               // сила тяжести
+
     const mg = 0.25 * m * g0;             // сила тяжести
     var r = 0.5 * a0;                     // радиус частицы в расчетных координатах
+
     const r = 0.5 * a0;                   // радиус частицы в расчетных координатах
     var K = 0.85;                         // сила взаимодействия ограничивается значением, реализующимся при r/a = K
+
     const arCoeff = 0.75;                   // если r < arCoeff*a, то потенциал будет считаться для arCoeff*a
     var a = 2 * r;                        // равновесное расстояние между частицами
+
     const a = 2 * r;                        // равновесное расстояние между частицами
     var aCut = 2 * a;                    // радиус обрезания
+
     const aCut = 2 * a;                    // радиус обрезания
  
 
     // *** Задание вычислительных параметров ***
 
     // *** Задание вычислительных параметров ***
  
     var fps = 50;                         // frames per second - число кадров в секунду (качечтво отображения)
+
     const fps = 50;                     // frames per second - число кадров в секунду (качечтво отображения)
     var spf = 100;                       // steps per frame  - число шагов интегрирования между кадрами (скорость расчета)
+
     const spf = 100;                 // steps per frame  - число шагов интегрирования между кадрами (скорость расчета)
     var dt  = 0.045 * T0 / fps;           // шаг интегрирования (качество расчета)
+
     const dt  = 0.045 * T0 / fps;         // шаг интегрирования (качество расчета)
  
 
     // Выполнение программы
 
     // Выполнение программы
  
     var scale = canvas.height / Ny / a0;  // масштабный коэффициент для перехода от расчетных к экранным координатам
+
     const scale = canvas.height / Ny / a0;  // масштабный коэффициент для перехода от расчетных к экранным координатам
     var r2 = r * r;                       // ___в целях оптимизации___
+
     const r2 = r*r;                         // ___в целях оптимизации___
     var aCut2 = aCut * aCut;              // ___в целях оптимизации___
+
     const aCut2 = aCut * aCut;              // ___в целях оптимизации___
     var a2 = a * a;                       // ___в целях оптимизации___
+
     const a2 = a*a;                         // ___в целях оптимизации___
     var D = a2 * Cball / 72;             // энергия связи между частицами
+
     const D = a2*Cball/72.0;               // энергия связи между частицами
     var LJCoeff = 12 * D / a2;           // коэффициент для расчета потенциала Л-Дж
+
     const LJCoeff = 12*D/a2;               // коэффициент для расчета потенциала Л-Дж
  
     var Ka = K * a;                       // ___в целях оптимизации___
+
     var w = canvas.width / scale;     // ширина окна в расчетных координатах
     var K2a2 = K * K * a2;               // ___в целях оптимизации___
+
    var h = canvas.height / scale;     // высота окна в расчетных координатах
 +
     var xStart = 4 * r; var yStart = h - r-3; // начальное положение шара
  
     var w = canvas.width / scale;          // ширина окна в расчетных координатах
+
     var dragAndDropBall = null;             // ссылка на захваченный курсором шар
    var h = canvas.height / scale;          // высота окна в расчетных координатах
 
 
 
    var dNd = null;                         // ссылка на захваченный курсором шар (drag & drop)
 
  
 
     // Работа с мышью
 
     // Работа с мышью
  
     var mx_, my_;                          // буфер позиции мыши (для расчета скорости при отпускании шара)
+
     var mouseX;    var mouseY;            // координаты курсора мыши
 +
    var mx, my;                          // буфер позиции мыши (для расчета скорости при отпускании шара)
  
     canvas.onmousedown = function(e) {     // функция при нажатии клавиши мыши
+
     canvas.onmousedown = function(e){       // функция при нажатии клавиши мыши
         var m = mouseCoords(e);             // получаем расчетные координаты курсора мыши
+
         refreshMouseCoords(e);             // обновить координаты в переменных mouseX, mouseY
 
         // цикл в обратную сторону, чтобы захватывать шар, нарисованный "сверху"
 
         // цикл в обратную сторону, чтобы захватывать шар, нарисованный "сверху"
 
         // (т.к. цикл рисования идет в обычном порядке)
 
         // (т.к. цикл рисования идет в обычном порядке)
         for (var i = balls.length - 1; i >= 0; i--) {
+
        var mouseXX = mouseX/scale;    var mouseYY = mouseY/scale;
 +
         for (var i = balls.length-1; i >= 0; i--){
 
             var b = balls[i];
 
             var b = balls[i];
             var rx = b.x - m.x;
+
             var rx = b.xx - mouseXX;
             var ry = b.y - m.y;
+
             var ry = b.yy - mouseYY;
             var rLen2 = rx * rx + ry * ry;     // квадрат расстояния между курсором и центром шара
+
             b.rLen2 = rx*rx + ry*ry;       // квадрат расстояния между курсором и центром шара
             if (rLen2 <= r2) {                 // курсор нажал на шар
+
             if (b.rLen2 <= r2) {           // курсор нажал на шар
                 if (e.which == 1) {             // нажата левая клавиша мыши
+
                 if (e.which == 1) {         // нажата левая клавиша мыши
                     dNd = b;
+
                     dragAndDropBall = b;
                     dNd.xPlus = dNd.x - m.x;   // сдвиг курсора относительно центра шара по x
+
                     dragAndDropBall.xPlus = dragAndDropBall.xx - mouseXX; // сдвиг курсора относительно центра шара по x
                     dNd.yPlus = dNd.y - m.y;   // сдвиг курсора относительно центра шара по y
+
                     dragAndDropBall.yPlus = dragAndDropBall.yy - mouseYY; // сдвиг курсора относительно центра шара по y
                     mx_ = m.x;    my_ = m.y;
+
                     mx = mouseXX;    my = mouseYY;
 
                     canvas.onmousemove = mouseMove;    // пока клавиша нажата - работает функция перемещения
 
                     canvas.onmousemove = mouseMove;    // пока клавиша нажата - работает функция перемещения
 
                 } else if (e.which == 3) {              // нажата правая клавиша мыши
 
                 } else if (e.which == 3) {              // нажата правая клавиша мыши
                     balls.splice(i, 1);                 // удалить шар
+
                     balls.splice(i,1);                 // удалить шар
 
                 }
 
                 }
 
                 return;
 
                 return;
Строка 93: Строка 92:
 
         }
 
         }
  
         // если не вышли по return из цикла - нажатие было вне шара, добавляем новый
+
         // если не вышли по return из цикла - нажатие было вне шара, проверяем, можно ли добавить новый
 +
        // расстояние между курсором и шаром должно быть 2r, между курсором и стеной - r;
 +
        if (mouseXX-r < 0 || mouseXX+r > w || mouseYY-r < 0 || mouseYY+r > h) return;
 +
        for (var i0=0; i0<balls.length; i0++)
 +
            if (balls[i0].rLen2 < 4*r2) return; // все rLen2 были посчитаны, т.к. мы не вышли по return
 
         if (e.which == 1) {
 
         if (e.which == 1) {
             dNd = addNewBall(m.x, m.y);         // добавляем шар и сразу захватываем его курсором
+
             dragAndDropBall = addNewBall(mouseX, mouseY);           // добавляем шар и сразу захватываем его курсором
             if (dNd == null) return;            // если шар не добавился (из за стен или других шаров) - возвращаемся
+
             dragAndDropBall.xPlus = 0;  dragAndDropBall.yPlus = 0; // держим шар по центру
            dNd.xPlus = 0;  dNd.yPlus = 0;     // держим шар по центру
+
             mx = mouseXX;    my = mouseYY;
             mx_ = m.x;    my_ = m.y;
 
 
             canvas.onmousemove = mouseMove;    // пока клавиша нажата - работает функция перемещения
 
             canvas.onmousemove = mouseMove;    // пока клавиша нажата - работает функция перемещения
 
         }
 
         }
 
     };
 
     };
  
     document.onmouseup = function(e) {         // функция при отпускании клавиши мыши
+
     document.onmouseup = function(e){           // функция при отпускании клавиши мыши
 
         canvas.onmousemove = null;              // когда клавиша отпущена - функции перемещения нету
 
         canvas.onmousemove = null;              // когда клавиша отпущена - функции перемещения нету
         dNd = null;                             // когда клавиша отпущена - захваченного курсором шара нету
+
         dragAndDropBall = null;                 // когда клавиша отпущена - захваченного курсором шара нету
 
     };
 
     };
  
     function mouseMove(e) {                     // функция при перемещении мыши, работает только с зажатой ЛКМ
+
     function mouseMove(e){                     // функция при перемещении мыши, работает только с зажатой ЛКМ
         var m = mouseCoords(e);                 // получаем расчетные координаты курсора мыши
+
         refreshMouseCoords(e);                 // обновить координаты в переменных mouseX, mouseY
         dNd.x = m.x + dNd.xPlus;
+
        var mouseXX = mouseX/scale;    var mouseYY = mouseY/scale;
         dNd.y = m.y + dNd.yPlus;
+
         dragAndDropBall.xx = mouseXX + dragAndDropBall.xPlus;
         dNd.vx = 0.6 * (m.x - mx_) / dt / fps;  dNd.vy = 0.6 * (m.y - my_) / dt / fps;
+
        dragAndDropBall.yy = mouseYY + dragAndDropBall.yPlus;
         mx_ = m.x;    my_ = m.y;
+
         dragAndDropBall.x = dragAndDropBall.xx * scale;    dragAndDropBall.y = dragAndDropBall.yy * scale;
 +
         dragAndDropBall.vx = .6*(mouseXX-mx)/dt/fps;  dragAndDropBall.vy = .6*(mouseYY-my)/dt/fps;
 +
         mx = mouseXX;    my = mouseYY;
 
     }
 
     }
  
     function mouseCoords(e) {                   // функция возвращает расчетные координаты курсора мыши
+
     function refreshMouseCoords(e){             // процедура обновляет координаты в переменных mouseX и mouseY
        var m = [];
 
 
         var rect = canvas.getBoundingClientRect();
 
         var rect = canvas.getBoundingClientRect();
         m.x = (e.clientX - rect.left) / scale;
+
         mouseX = e.clientX - rect.left;
         m.y = (e.clientY - rect.top) / scale;
+
         mouseY = e.clientY - rect.top;
        return m;
 
 
     }
 
     }
  
 
     // Работа с массивом
 
     // Работа с массивом
  
     var balls = [];                             // массив шаров
+
     var balls = [];                                 // массив шаров
     var addNewBall =  function(x, y) {
+
     var addNewBall =  function(x, y){
        // проверка - не пересекается ли новый шар со стенами или уже существующими шарами
 
        if (x - r < 0 || x + r > w || y - r < 0 || y + r > h) return null;
 
        for (var i = 0; i < balls.length; i++) {
 
            var rx = balls[i].x - x;
 
            var ry = balls[i].y - y;
 
            var rLen2 = rx * rx + ry * ry;
 
            if (rLen2 < 4 * r2) return null;
 
        }
 
 
         var b = [];
 
         var b = [];
  
         b.x = x;               b.y = y;       // расчетные координаты шара
+
         b.x = x;               b.y = y;             // экранные координаты шара
         b.fx = 0;               b.fy = mg;     // сила, действующая на шар
+
        b.xx = x / scale;      b.yy = y / scale;    // расчетные координаты шара
         b.vx = 0;               b.vy = 0;       // скорость
+
         b.fx = 0;             b.fy = mg;           // сила, действующая на шар
 +
         b.vx = 0;             b.vy = 0;           // скорость
  
         balls[balls.length] = b;               // добавить элемент в конец массива
+
         balls[balls.length] = b;                   // добавить элемент в конец массива
 
         return b;
 
         return b;
 
     };
 
     };
Строка 155: Строка 150:
 
     // Расчетная часть программы
 
     // Расчетная часть программы
  
     function physics() {                       // то, что происходит каждый шаг времени
+
     function physics(){                             // то, что происходит каждый шаг времени
         for (var s = 1; s <= spf; s++) {
+
         for (var s=1; s<=spf; s++) {
  
 
             // пересчет сил идет отдельным массивом, т.к. далее будут добавляться силы взаимодействия между шарами
 
             // пересчет сил идет отдельным массивом, т.к. далее будут добавляться силы взаимодействия между шарами
             for (var i0 = 0; i0 < balls.length; i0++) {
+
             for (var i0=0; i0<balls.length; i0++){
                 balls[i0].fx = - B * balls[i0].vx;
+
                 balls[i0].fx = - B * balls[i0].vx; balls[i0].fy = mg - B * balls[i0].vy;
                balls[i0].fy = mg - B * balls[i0].vy;
 
 
             }
 
             }
  
             for (var i = 0; i < balls.length; i++) {
+
             for (var i=0; i<balls.length; i++){
 
                 // расчет взаимодействия производится со всеми следующими шарами в массиве,
 
                 // расчет взаимодействия производится со всеми следующими шарами в массиве,
 
                 // чтобы не считать каждое взаимодействие дважды
 
                 // чтобы не считать каждое взаимодействие дважды
                var b = balls[i];
+
                 for (var ii=i+1; ii < balls.length; ii++) {
                 for (var j = i + 1; j < balls.length; j++) {
 
                    var b2 = balls[j];
 
                    var rx = b.x - b2.x;  var ry = b.y - b2.y;        // вектор смотрит на первый шар (b)
 
                    var r2 = rx * rx + ry * ry;                        // квадрат расстояния между шарами
 
                    if (r2 > aCut2) continue;                          // проверка на радиус обрезания
 
                    var rLen = (Math.sqrt(r2));
 
  
                     // если расстояние между частицами мало, силы будут посчитаны для K * a
+
                     var b1 = balls[i];      var b2 = balls[ii];            // ссылки на шары
                     if (r2 < K2a2) {
+
                     var rx = b1.xx - b2.xx;  var ry = b1.yy - b2.yy;      // вектор смотрит на первый шар (b1)
                        if (rLen > 0.00001) {                          // проверка, чтобы избежать деления на 0
+
                    var r2 = rx*rx + ry*ry;                                // квадрат расстояния между шарами
                            rx = rx / rLen * Ka;
+
                    if (r2 > aCut2) continue;                               // проверка на радиус обрезания
                            ry = ry / rLen * Ka;
+
                    if (r2 < arCoeff*a2) r2 = arCoeff*a2;                   // проверка на минимальный радиус
                        }
 
                        r2 = K2a2;
 
                        rLen = Ka;                                     // корень K2a2
 
                    }
 
  
                    // сила взаимодействия
+
                     var s2 = a2/r2;        var s4 = s2*s2;                 // ___в целях оптимизации___
                     var s2 = a2 / r2;        var s4 = s2 * s2;         // ___в целях оптимизации___
 
                    var F = LJCoeff * s4 * s4 * (s4 * s2 - 1);          // сила взаимодействия Леннарда-Джонса
 
  
                     var Fx = F * rx;       var Fy = F * ry;
+
                    var F = LJCoeff * s4 * s4 * (s4 * s2 - 1);              // сила взаимодействия Леннарда-Джонса
                     b.fx += Fx;             b.fy += Fy;
+
                     var Fx = F*rx;         var Fy = F*ry;
 +
 
 +
                     b1.fx += Fx;           b1.fy += Fy;
 
                     b2.fx -= Fx;            b2.fy -= Fy;
 
                     b2.fx -= Fx;            b2.fy -= Fy;
 
                 }
 
                 }
  
                 if (b == dNd) continue;  // если шар схвачен курсором - его вз. со стенами и перемещение не считаем
+
                 if (balls[i] == dragAndDropBall) continue;  // если шар схвачен курсором - его вз. со стенами и перемещение не считаем
  
                 if (b.y + r > h) { b.fy += -Cwall * (b.y + r - h) - Bwall * b.vy; }
+
                 if (balls[i].yy + r > h) { balls[i].fy += -Cwall * (balls[i].yy + r - h) - B1 * balls[i].vy; }
                 if (b.y - r < 0) { b.fy += -Cwall * (b.y - r) - Bwall * b.vy;}
+
                 if (balls[i].yy - r < 0) { balls[i].fy += -Cwall * (balls[i].yy - r) - B1 * balls[i].vy;}
                 if (b.x + r > w) { b.fx += -Cwall * (b.x + r - w) - Bwall * b.vx; }
+
                 if (balls[i].xx + r > w) { balls[i].fx += -Cwall * (balls[i].xx + r - w) - B1 * balls[i].vx; }
                 if (b.x - r < 0) { b.fx += -Cwall * (b.x - r) - Bwall * b.vx; }
+
                 if (balls[i].xx - r < 0) { balls[i].fx += -Cwall * (balls[i].xx - r) - B1 * balls[i].vx; }
  
                 b.vx += b.fx / m * dt;        b.vy += b.fy / m * dt;
+
                 balls[i].vx += balls[i].fx / m * dt;        balls[i].vy += balls[i].fy / m * dt;
                 b.x += b.vx * dt;             b.y += b.vy * dt;
+
                 balls[i].xx += balls[i].vx * dt;       balls[i].yy += balls[i].vy * dt;
 +
 
 +
                balls[i].x = balls[i].xx * scale;    balls[i].y = balls[i].yy * scale;
 
             }
 
             }
 
         }
 
         }
Строка 209: Строка 195:
 
     // Рисование
 
     // Рисование
  
     var rScale13 = r * scale * 1.3;         // ___в целях оптимизации___
+
     var rScale13 = r * scale*1.3;           // ___в целях оптимизации___
     var rScaleShift = r * scale / 5;        // ___в целях оптимизации___
+
     var rScaleShift = r * scale/5.0;        // ___в целях оптимизации___
     function draw() {
+
     function draw(){
         context.clearRect(0, 0, w * scale, h * scale);     // очистить экран
+
         context.clearRect(0, 0, w*scale, h*scale);         // очистить экран
 
         for (var i = 0; i < balls.length; i++){
 
         for (var i = 0; i < balls.length; i++){
             var xS = balls[i].x * scale;          var yS = balls[i].y * scale;
+
             var b = balls[i];
 +
 
 
             // расчет градиента нужно проводить для каждого шара
 
             // расчет градиента нужно проводить для каждого шара
             var gradient = context.createRadialGradient(xS, yS, rScale13, xS - rScaleShift, yS + rScaleShift, 0);
+
             var gradient=context.createRadialGradient(b.x, b.y, rScale13, b.x-rScaleShift, b.y+rScaleShift,0);
             gradient.addColorStop(0, "#0000bb");
+
             gradient.addColorStop(0,"#0000bb");
             gradient.addColorStop(1, "#44ddff");
+
             gradient.addColorStop(1,"#44ddff");
             context.fillStyle = gradient;
+
             context.fillStyle=gradient;
  
 
             context.beginPath();
 
             context.beginPath();
             context.arc(xS, yS, r * scale, 0, 2 * Math.PI, false);
+
             context.arc(b.x, b.y, r*scale,0,2*Math.PI);
 
             context.closePath();
 
             context.closePath();
 
             context.fill();
 
             context.fill();
Строка 229: Строка 216:
  
 
     // Запуск системы
 
     // Запуск системы
     for (var i = 0; i < 1000; i++)
+
 
        addNewBall(Math.random() * w, Math.random() * h);
+
     addNewBall(xStart * scale, yStart * scale);
     setInterval(control, 1000 / fps);
+
     setInterval(control, 1000/fps);
 +
 
 
}
 
}
</syntaxhighlight>
+
</source>
 
Файл '''"Balls_v4_release.html"'''
 
Файл '''"Balls_v4_release.html"'''
<syntaxhighlight lang="html5" line start="1" enclose="div">
+
<source lang="html" first-line="1">
 
<!DOCTYPE html>
 
<!DOCTYPE html>
 
<html>
 
<html>
 
<head>
 
<head>
     <title>Balls</title>
+
     <title>Simple Mechanics</title>
 
     <script src="Balls_v4_release.js"></script>
 
     <script src="Balls_v4_release.js"></script>
 
</head>
 
</head>
 
<body>
 
<body>
     <canvas id="canvasBalls" width="800" height="600" style="border:1px solid #000000;"></canvas>
+
     <canvas id="canvasMech" width="800" height="600" style="border:1px solid #000000;"></canvas>
 +
    <script type="text/javascript">MainMech(document.getElementById('canvasMech'));</script>
 
</body>
 
</body>
 
</html>
 
</html>
</syntaxhighlight>
+
</source>
</div>
+
</toggledisplay>
</div>
 
  
[[Category: Виртуальная лаборатория]]
 
 
[[Category: Программирование]]
 
[[Category: Программирование]]
 +
[[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/Balls_v4»