Balls v1 — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
Строка 5: Строка 5:
  
 
Скачать программу: [[Медиа:Balls_v1_release.zip|Balls_v1_release.zip]]
 
Скачать программу: [[Медиа:Balls_v1_release.zip|Balls_v1_release.zip]]
Текст программы на языке JavaScript (разработчики [[Кривцов Антон]], [[Цветков Денис]]): <toggledisplay status=hide showtext="Показать↓" hidetext="Скрыть↑" linkstyle="font-size:default">  
+
Текст программы на языке JavaScript (разработчики [[Кривцов Антон]], [[Цветков Денис]]): <div class="mw-collapsible mw-collapsed" style="width:65%" >
 
Файл '''"Balls_v1_release.js"'''
 
Файл '''"Balls_v1_release.js"'''
 
<source lang="javascript" first-line="1">
 
<source lang="javascript" first-line="1">
Строка 100: Строка 100:
 
</source>
 
</source>
 
Файл '''"Balls_v1_release.html"'''
 
Файл '''"Balls_v1_release.html"'''
<source lang="html" first-line="1">
+
<source lang="html5" first-line="1">
 
<!DOCTYPE html>
 
<!DOCTYPE html>
 
<html>
 
<html>
Строка 112: Строка 112:
 
</html>
 
</html>
 
</source>
 
</source>
</toggledisplay>
+
</div>
  
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Виртуальная лаборатория]]
 
[[Category: Программирование]]
 
[[Category: Программирование]]

Версия 16:44, 3 марта 2015

Виртуальная лаборатория > Динамика взаимодействующих частиц > Balls - версии > Balls v1


Скачать программу: Balls_v1_release.zip

Текст программы на языке JavaScript (разработчики Кривцов Антон, Цветков Денис):

Файл "Balls_v1_release.js"

window.addEventListener("load", MainBalls, true);
function MainBalls() {

    // Предварительные установки

    var context = canvasBalls.getContext("2d");  // на context происходит рисование

    var Pi = 3.1415926;                   // число "пи"

    var m0 = 1;                           // масштаб массы
    var T0 = 1;                           // масштаб времени (период колебаний исходной системы)
    var a0 = 1;                           // масштаб расстояния (диаметр шара)

    var g0 = a0 / T0 / T0;                // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
    var k0 = 2 * Pi / T0;                 // масштаб частоты
    var C0 = m0 * k0 * k0;                // масштаб жесткости
    var B0 = 2 * m0 * k0;                 // масштаб вязкости

    // *** Задание физических параметров ***

    var Ny = 5;                           // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
    var m = 1 * m0;                       // масса
    var Cwall = 10 * C0;                  // жесткость стен
    var B = 0.008 * B0;                   // вязкость среды
    var B1 = 0.03 * B0;                   // вязкость на стенках
    var mg = 0.25 * m * g0;               // сила тяжести
    var r = 0.5 * a0;                     // радиус частицы в расчетных координатах

    // *** Задание вычислительных параметров ***

    var fps = 50;                         // frames per second - число кадров в секунду (качечтво отображения)
    var spf = 100;                        // steps per frame   - число шагов интегрирования между кадрами (скорость расчета)
    var dt  = 0.045 * T0 / fps;           // шаг интегрирования (качество расчета)

    // Выполнение программы

    var scale = canvasBalls.height / Ny / a0;  // масштабный коэффициент для перехода от расчетных к экранным координатам

    var w = canvasBalls.width / scale;           // ширина окна в расчетных координатах
    var h = canvasBalls.height / scale;          // высота окна в расчетных координатах

    // Добавление шара

    var b = [];


    b.x = w / 2;            b.y = h / 2;    // расчетные координаты шара
    b.fx = 0;               b.fy = mg;      // сила, действующая на шар
    b.vx = 3;               b.vy = -1.5;    // начальная скорость

    // Основной цикл программы

    function control() {
        physics();
        draw();
    }

    // Расчетная часть программы

    function physics() {                    // то, что происходит каждый шаг времени
        for (var s = 1; s <= spf; s++) {
            b.fx = - B * b.vx;
            b.fy = mg - B * 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) - B1 * b.vy;}
            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) - B1 * b.vx; }

            b.vx += b.fx / m * dt;        b.vy += b.fy / m * dt;
            b.x += b.vx * dt;             b.y += b.vy * dt;
        }
    }


    // Рисование

    context.fillStyle = "#3070d0";                          // цвет
    function draw() {
        context.clearRect(0, 0, w * scale, h * scale);      // очистить экран
        context.beginPath();

        context.arc(b.x * scale, b.y * scale, r * scale, 0, 2 * Math.PI, false);
        context.fill();

        context.closePath();
    }

    setInterval(control, 1000 / fps);                       // Запуск системы
}

Файл "Balls_v1_release.html"

<!DOCTYPE html>
<html>
<head>
    <title>Balls</title>
    <script src="Balls_v1_release.js"></script>
</head>
<body>
    <canvas id="canvasBalls" width="800" height="600" style="border:1px solid #000000;"></canvas>
</body>
</html>