КП: Многочастичный симулятор — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
м (Пример системы)
м (Решение)
Строка 100: Строка 100:
 
Очистить поле консоли
 
Очистить поле консоли
  
*'''clrscr'''
+
* '''clrscr'''
  
  
 
Отобразить статистику элементов системы и чилто тиков:
 
Отобразить статистику элементов системы и чилто тиков:
  
*'''getInfo'''
+
* '''getInfo'''
  
  
 
Создать частицу
 
Создать частицу
  
*'''addPoint (100,100)''' (0,10) 80 5<ref>Без выделения жирным написаны необязательные параметры. Значения по умолчанию: вектор скорости нулевой, радиус равен 50 пикселям, масса равна 5 у. е. При желании указать необязательный параметр все значения слева от него следует считать обязательными (во избежание путаницы при парсинге безразмерных величин в команде)</ref>, где
+
* '''addPoint (100,100)''' (0,10) 80 5<ref>Без выделения жирным написаны необязательные параметры. Значения по умолчанию: вектор скорости нулевой, радиус равен 50 пикселям, масса равна 5 у. е. При желании указать необязательный параметр все значения слева от него следует считать обязательными (во избежание путаницы при парсинге безразмерных величин в команде)</ref>, где
  
 
(100,100) - текущие координаты
 
(100,100) - текущие координаты
Строка 123: Строка 123:
 
Задать вектор скорости (относительно начала координат)
 
Задать вектор скорости (относительно начала координат)
  
*'''setVelocity #0 (10,10)''', где
+
* '''setVelocity #0 (10,10)''', где
  
 
0 - id частицы<ref>Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы,  для стенок, стержней, пружин и частиц. Может быть отображён в консоли нажатиями на кнопку "Get point's id" и на отображаемую частицу.</ref>
 
0 - id частицы<ref>Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы,  для стенок, стержней, пружин и частиц. Может быть отображён в консоли нажатиями на кнопку "Get point's id" и на отображаемую частицу.</ref>
Строка 130: Строка 130:
 
Задать массу
 
Задать массу
  
*'''setProps #0 'mass' 10''', где
+
* '''setProps #0 'mass' 10''', где
  
 
0 - id частицы
 
0 - id частицы
Строка 136: Строка 136:
 
10 - новая масса
 
10 - новая масса
  
*'''setProps #0 'invmass' 0.1''', где
+
* '''setProps #0 'invmass' 0.1''', где
  
 
0 - id частицы
 
0 - id частицы
Строка 145: Строка 145:
 
Задать радиус
 
Задать радиус
  
*'''setProps #0 'radius' 100''', где
+
* '''setProps #0 'radius' 100''', где
  
 
0 - id частицы
 
0 - id частицы
Строка 154: Строка 154:
 
Создать пружину между частицами
 
Создать пружину между частицами
  
*'''addSpring #0 #1''' 50, где
+
* '''addSpring #0 #1''' 50, где
  
 
0, 1 - id частиц
 
0, 1 - id частиц
Строка 162: Строка 162:
  
 
Изменить жёсткость пружины
 
Изменить жёсткость пружины
*'''changeSpring #5 10''', где
+
* '''changeSpring #5 10''', где
  
 
5 - id пружины
 
5 - id пружины
Строка 170: Строка 170:
  
 
Изменить жёсткость одинаковых пружин
 
Изменить жёсткость одинаковых пружин
*'''changeSprings 10->15''', где
+
* '''changeSprings 10->15''', где
  
 
10 - текущая жёсткость
 
10 - текущая жёсткость
Строка 178: Строка 178:
  
 
Изменить жёсткость всех пружин
 
Изменить жёсткость всех пружин
*'''changeSprings all->20''', где
+
* '''changeSprings all->20''', где
  
 
20 - новая жёсткость
 
20 - новая жёсткость
Строка 185: Строка 185:
 
Создать стержень между частицами
 
Создать стержень между частицами
  
*'''addStick #2 #1''', где
+
* '''addStick #2 #1''', где
  
 
2, 1 - id частиц
 
2, 1 - id частиц
Строка 192: Строка 192:
 
Отключение гравитации
 
Отключение гравитации
  
*'''gravy disable'''
+
* '''gravy disable'''
  
  
 
Задать вектор ускорения свободного падения (относительно начала координат)
 
Задать вектор ускорения свободного падения (относительно начала координат)
  
*'''gravy (0,10)'''
+
* '''gravy (0,10)'''
  
  
 
Отобразить сетку
 
Отобразить сетку
  
*'''showGrid type 0'''
+
* '''showGrid type 0'''
  
*'''showGrid type 1'''
+
* '''showGrid type 1'''
  
*'''showGrid type 2'''
+
* '''showGrid type 2'''
  
  
 
Спрятать сетку
 
Спрятать сетку
  
*'''hideTable'''
+
* '''hideTable'''
  
  
 
Запустить симуляцию
 
Запустить симуляцию
*'''play'''
+
* '''play'''
 
 
*быстрая кнопка '''§'''
 
 
 
*быстрая кнопка '''~'''
 
 
 
  
 
Остановить симуляцию
 
Остановить симуляцию
*'''stop'''
+
* '''stop'''
 
 
*быстрая кнопка '''§'''
 
 
 
*быстрая кнопка '''~'''
 
 
 
  
 
"Промотать" симуляцию
 
"Промотать" симуляцию
*'''step(100)''', где
+
* '''step(100)''', где
  
 
100 - число пропускаемых отрисовкой тиков
 
100 - число пропускаемых отрисовкой тиков
Строка 237: Строка 227:
  
 
Исполнить внутренний метод
 
Исполнить внутренний метод
*'''execute nameMethod(params)''', где
+
* '''execute nameMethod(params)''', где
  
 
nameMethod - название метода
 
nameMethod - название метода
Строка 244: Строка 234:
  
 
Посмотреть историю запросов
 
Посмотреть историю запросов
*'''getHistory''' <ref>Запросы выводятся в всплывающем окне одной цельной командой, для воспроизведения цепочки запросов достаточно ввести выведенную команду в консоль.
+
* '''getHistory''' <ref>Запросы выводятся в всплывающем окне одной цельной командой, для воспроизведения цепочки запросов достаточно ввести выведенную команду в консоль.
 
<br>
 
<br>
 
'''Внимание!''' Учитываются только запросы, успешно введённые в консоль. Воздействия на систему при помощи кнопки "Move point" будут потеряны.</ref>
 
'''Внимание!''' Учитываются только запросы, успешно введённые в консоль. Воздействия на систему при помощи кнопки "Move point" будут потеряны.</ref>
 +
 +
 +
Выполнить несколько команд
 +
* '''commandOne---commandTwo'''---comandThird, где
 +
 +
commandOne, commandTwo, commandThird - команды консоли
 
</small>
 
</small>
 
{{конец цитаты}}
 
{{конец цитаты}}

Версия 02:59, 30 мая 2015

А.М. Кривцов > Теоретическая механика > Курсовые проекты ТМ 2015 > Многочастичный симулятор
IPhone image 2015-4-13-1431495674163 1.jpg

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

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

Группа: 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 продиктован выбором методов оптимизации для возможности работы с тысячами частиц.

Решение

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

Вы можете попробовать возможности симулятора прямо здесь, либо перейдя на полноразмерную страницу решения.

В пункте 4.6 представлена команда для создания трёхатомной молекулы.

Нахождение периода в простом движении
Элементы системы
  • Частицы;
  • Стержни и пружины[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 - сообщаемые параметры


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

  • getHistory [4]


Выполнить несколько команд

  • commandOne---commandTwo---comandThird, где

commandOne, commandTwo, commandThird - команды консоли

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

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

  • Move point

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

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

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

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

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

PhenDefaultExample.png

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

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

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

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

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

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

  • 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 #2 10---addSpring #0 #1 20---addSpring #1 #2 20---setVelocity #0 (1,0)---setVelocity #2 (-1,0)

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


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

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

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

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

Александр Смирнов. "Курсовой проект: молекула углекислого газа", 2015. (страница проекта)

См. также

Примечания

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