Редактирование: 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 MainBalls(canvas) {
function MainBalls() {
 
  
 
     // Предварительные установки
 
     // Предварительные установки
  
    var canvas = canvasBalls;
 
 
     var context = canvas.getContext("2d");                  // на context происходит рисование
 
     var context = canvas.getContext("2d");                  // на context происходит рисование
 
     canvas.oncontextmenu = function (e) {return false;};    // блокировка контекстного меню
 
     canvas.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;                // масштаб частоты
+
     const k0 = 2 * Pi / T0;                // масштаб частоты
     var C0 = m0 * k0 * k0;                // масштаб жесткости
+
     const C0 = m0 * k0 * k0;                // масштаб жесткости
     var B0 = 2 * m0 * 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/a = arCoeff
     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;              // энергия связи между частицами
     var LJCoeff = 12 * D / a2;            // коэффициент для расчета потенциала Л-Дж
+
     const LJCoeff = 12 * D / a2;            // коэффициент для расчета потенциала Л-Дж
 
 
    var Ka = K * a;                      // ___в целях оптимизации___
 
    var K2a2 = K * K * a2;                // ___в целях оптимизации___
 
  
 
     var w = canvas.width / scale;          // ширина окна в расчетных координатах
 
     var w = canvas.width / scale;          // ширина окна в расчетных координатах
Строка 78: Строка 73:
 
             var rx = b.x - m.x;
 
             var rx = b.x - m.x;
 
             var ry = b.y - m.y;
 
             var ry = b.y - m.y;
             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;
 
                     dNd = b;
Строка 173: Строка 168:
 
                     var r2 = rx * rx + ry * ry;                        // квадрат расстояния между шарами
 
                     var r2 = rx * rx + ry * ry;                        // квадрат расстояния между шарами
 
                     if (r2 > aCut2) continue;                          // проверка на радиус обрезания
 
                     if (r2 > aCut2) continue;                          // проверка на радиус обрезания
                     var rLen = (Math.sqrt(r2));
+
                     if (r2 < arCoeff * a2) r2 = arCoeff * a2;           // проверка на минимальный радиус
  
                     // если расстояние между частицами мало, силы будут посчитаны для K * a
+
                     var s2 = a2 / r2;         var s4 = s2 * s2;         // ___в целях оптимизации___
                    if (r2 < K2a2) {
 
                        if (rLen > 0.00001) {                          // проверка, чтобы избежать деления на 0
 
                            rx = rx / rLen * Ka;
 
                            ry = ry / rLen * Ka;
 
                        }
 
                        r2 = K2a2;
 
                        rLen = Ka;                                     // корень K2a2
 
                    }
 
  
                    // сила взаимодействия
 
                    var s2 = a2 / r2;        var s4 = s2 * s2;        // ___в целях оптимизации___
 
 
                     var F = LJCoeff * s4 * s4 * (s4 * s2 - 1);          // сила взаимодействия Леннарда-Джонса
 
                     var F = LJCoeff * s4 * s4 * (s4 * s2 - 1);          // сила взаимодействия Леннарда-Джонса
 +
                    var Fx = F * rx;        var Fy = F * ry;
  
                    var Fx = F * rx;        var Fy = F * ry;
 
 
                     b.fx += Fx;            b.fy += Fy;
 
                     b.fx += Fx;            b.fy += Fy;
 
                     b2.fx -= Fx;            b2.fy -= Fy;
 
                     b2.fx -= Fx;            b2.fy -= Fy;
Строка 196: Строка 181:
 
                 if (b == dNd) continue;  // если шар схвачен курсором - его вз. со стенами и перемещение не считаем
 
                 if (b == dNd) continue;  // если шар схвачен курсором - его вз. со стенами и перемещение не считаем
  
                 if (b.y + r > h) { b.fy += -Cwall * (b.y + r - h) - Bwall * b.vy; }
+
                 if (b.y + r > h) { b.fy += -Cwall * (b.y + r - h) - B1 * b.vy; }
                 if (b.y - r < 0) { b.fy += -Cwall * (b.y - r) - Bwall * b.vy;}
+
                 if (b.y - r < 0) { b.fy += -Cwall * (b.y - r) - B1 * b.vy;}
                 if (b.x + r > w) { b.fx += -Cwall * (b.x + r - w) - Bwall * b.vx; }
+
                 if (b.x + r > w) { b.fx += -Cwall * (b.x + r - w) - B1 * b.vx; }
                 if (b.x - r < 0) { b.fx += -Cwall * (b.x - r) - Bwall * b.vx; }
+
                 if (b.x - r < 0) { b.fx += -Cwall * (b.x - r) - B1 * b.vx; }
  
 
                 b.vx += b.fx / m * dt;        b.vy += b.fy / m * dt;
 
                 b.vx += b.fx / m * dt;        b.vy += b.fy / m * dt;
Строка 233: Строка 218:
 
     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>
Строка 244: Строка 229:
 
<body>
 
<body>
 
     <canvas id="canvasBalls" width="800" height="600" style="border:1px solid #000000;"></canvas>
 
     <canvas id="canvasBalls" width="800" height="600" style="border:1px solid #000000;"></canvas>
 +
    <script type="text/javascript">MainBalls(document.getElementById('canvasBalls'));</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»