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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
А.М. Кривцов > Теоретическая механика > Курсовые проекты ТМ 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 50, где

0, 1 - id частиц

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


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

  • 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].
Пример системы

Смоделируем молекулу из трёх атомов (подобную молекуле углекислого газа, рассматриваемой в курсовом проекте А. Смирнова).

Трёхатомная молекула

Для создания такой системы необходимо последовательно выполнить следующие команды:

Создаём атомы кислорода, углерода и кислорода соответственно.

  • addPoint (100,100) (0,0) 40 5
  • addPoint (250,100) (0,0) 50 10
  • addPoint (400,100) (0,0) 40 5

Соединяем атомы пружинами для моделирования связей. Последняя пружина обеспечивает устойчивость молекулы, не создавая внутреннего напряжения.

  • addSpring #0 #1 20
  • addSpring #1 #2 20
  • addSpring #0 #2 10

Дополнительно можем задать скорости у атомов кислорода для создания колебаний.

  • setVelocity #0 (1,0)
  • setVelocity #2 (-1,0)

Итоговый код:

addPoint (100,100) (0,0) 40 5---addPoint (250,100) (0,0) 50 10---addPoint (400,100) (0,0) 40 5---addSpring #0 #1 20---addSpring #1 #2 20---addSpring #0 #2 10---setVelocity #0 (1,0)---setVelocity #2 (-1,0)

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


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

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

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

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

См. также

Примечания

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