КП: Многочастичный симулятор

Материал из Department of Theoretical and Applied Mechanics
Версия от 01:50, 30 мая 2015; 95.27.57.105 (обсуждение) (Команды консоли)

Перейти к: навигация, поиск
А.М. Кривцов > Теоретическая механика > Курсовые проекты ТМ 2015 > Многочастичный симулятор
Ткань из пружин

Курсовой проект по Теоретической механике

Исполнитель: Старобинский Егор

Группа: 09 (23604)

Семестр: весна 2015

Аннотация проекта

Формулировка задачи

Цель работы

Создание интернет-сайта, позволяющего пользователю моделировать многоточечную систему онлайн.

Решаемые задачи
  1. решение уравнения движения;
  2. визуализация.

Общие сведения по теме

Уравнение движения

Пусть мы наблюдаем тело в момент времени [math]t[/math].

Хотим знать, где окажется тело через малое изменение времени - [math]\Delta t[/math].

Рассмотрим базовый метод Верле :

[math]\vec{x}(t + \Delta t) = 2\vec{x}(t) - \vec{x}(t - \Delta t) +\frac{ \vec{R}(t) \Delta t^2 }m[/math], где

[math]\vec{x}[/math] - позиция точки,

[math]\vec{R}[/math] - равнодействующая всех сил, действующих на тело,

[math]m[/math] - масса тела,

[math]t[/math] - текущий момент времени,

[math]\Delta t[/math] - малое изменение времени.

Метод Верле позволяет вычислять траекторию по упрощённой схеме: зная предыдущее и текущее положения ([math]\vec{x}(t - \Delta t)[/math] и [math]\vec{x}(t)[/math] соответственно)  и мгновенное значение равнодействующей приложенных сил в текущем положении [math]\vec{R}(t)[/math].

Достоинства метода: самокоррекция и бóльшая точность по сравнению с численным методом Эйлера.

Язык реализации: JavaScript.

Визуализация

Язык рализации: pure SCSS.

Обработка событий: JavaScript.

Отказ от WebGL продиктован выбором методов оптимизации для возможности работы с тысячами частиц.

Решение

Страница решения

Нахождение периода в простом движении
Элементы системы
  • Частицы;
  • Стержни и пружины[1];
  • Стенки;
  • Поле сил;
  • Рабочее окно;
  • Сетки разметки;
  • Консоль;
  • Плеер.


Пример вывода консоли
Возможности консоли
  • Конфигурация начальной системы тел;
  • Изменение системы в процессе работы ("на лету");
  • Запуск алгоритмов анализа системы;
  • Распознавание и вывод ошибок в пользовательских запросах и в исходном коде;
  • Распознавание и вывод предупреждений в пользовательских запросах и в исходном коде;
  • Подключение/отключение сеток разметки, в том числе с пользовательскими размерами ячейки;
  • Тетрис.
Команды консоли

Координаты пишутся в декартовой системе (х,у), единица измерения - пиксели, орт х направлен от левого края к правому, орт у от верхнего края к нижнему. Пример: (0,100) - координаты точки, лежащей на левом краю экрана на 100 пикселей ниже верхней границы.

Консоль выводит каждое сообщение как одну строку. Если доступной длины строки не хватает, сообщение обрезается. Для отображения полной версии сообщения необходимо кликнуть по нему мышью.

Основные запросы Очистить поле консоли

  • clrscr

Отобразить статистику элементов системы и чилто тиков:

  • getInfo

Создать частицу

  • addPoint (100,100) (0,10) 80 5[2], где

(100,100) - текущие координаты

(0,10) - вектор скорости относительно начала координат

80 - радиус частицы в пикселях

5 - масса частицы в у. е.

Задать вектор скорости (относительно начала координат)

  • setVelocity #0 (10,10), где

0 - id частицы[3]

Задать массу

  • setProps #0 'mass' 10, где

0 - id частицы

10 - новая масса

  • setProps #0 'invmass' 0.1, где

0 - id частицы

10 - обратное значение новой массы

Задать радиус

  • setProps #0 'radius' 100, где

0 - id частицы

100 - радиус частицы

Создать пружину между частицами

  • addSpring #0 #1 c, где

0, 1 - id частиц

c - жёсткость пружины

Изменить жёсткость пружины

  • changeSpring #5 10, где

5 - id пружины

10 - новая жёсткость

Изменить жёсткость одинаковых пружин

  • changeSprings 10->15, где

10 - текущая жёсткость

15 - новая жёсткость

Изменить жёсткость всех пружин

  • changeSprings all->20, где

20 - новая жёсткость

Создать стержень между частицами

  • addStick #2 #1, где

2, 1 - id частиц

Отключение гравитации

  • gravy disable

Задать вектор ускорения свободного падения (относительно начала координат)

  • gravy (0,10)

Отобразить сетку

  • showGrid type 0
  • showGrid type 1
  • showGrid type 2

Спрятать сетку

  • hideTable

Запустить симуляцию

  • play
  • быстрая кнопка §
  • быстрая кнопка ~

Остановить симуляцию

  • stop
  • быстрая кнопка §
  • быстрая кнопка ~

Промотать симуляцию

  • step(100), где

100 - число пропускаемых отрисовкой тиков

Исполнить внутренний метод

  • execute nameMethod(params), где

nameMethod - название метода params - сообщаемые параметры

Посмотреть историю запросов

Взаимодействие с частицами
  • Get point's id

После нажатия на кнопку, а затем на частицу выводит её id в консоль.

  • Move point

После нажатия на кнопку, а затем на частицу закрепляет управление положением последним за курсором мыши.

Дальнейшие нажатия на свободные участки поля переносят эту частицу в точку нажатия, при этом её скорость считается нулевой.

Для прекращения управления следует вновь нажать кнопку.


Возможности плеера
  • Воспроизведение/пауза симуляции с заданным [math]\Delta t[/math];
  • Скачок вперёд на кратное [math]\Delta t[/math] время;
  • "Замедление времени"[5].

Обсуждение результатов и выводы


Скачать отчет:
Скачать презентацию:

Ссылки по теме

Опорный материал:

Thomas Jakobsen. "Advanced Character Physics", January 21, 2003. (перевод статьи )

См. также

Примечания

  1. Стержни рассчитываются на расстяжение/сжатие методом коррекции координат.
    Действие пружин учитывается как действие силы упругости.
  2. Без выделения жирным написаны необязательные параметры. Значения по умолчанию: вектор скорости нулевой, радиус равен 50 пикселям, масса равна 5 у. е. При желании указать необязательный параметр все значения слева от него следует считать обязательными (во избежание путаницы при парсинге безразмерных величин в команде)
  3. Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы, для стенок, стержней, пружин и частиц. Может быть отображён в консоли нажатиями на кнопку "Get point's id" и на отображаемую частицу.
  4. Запросы выводятся в всплывающем окне одной цельной командой, для воспроизведения цепочки запросов достаточно ввести выведенную команду в консоль. Внимание! Учитываются только запросы, успешно введённые в консоль. Воздействия на систему при помощи кнопки "Move point" будут потеряны.
  5. При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управлятся через консоль.