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

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
м (Команды консоли)
м (Решение)
Строка 95: Строка 95:
 
Создать частицу
 
Создать частицу
  
*'''addPoint (100,100)''' (100,90) 80 5<ref>Без выделения жирным написаны необязательные параметры. Значения по умолчанию: предыдущие координаты совпадают с текущими, радиус равен 50 пикселям, масса равна 5 у. е. При желании указать необязательный параметр все значения слева от него следует считать обязательными (во избежание путаницы при парсинге безразмерных величин в команде)</ref>, где
+
*'''addPoint (100,100)''' (0,10) 80 5<ref>Без выделения жирным написаны необязательные параметры. Значения по умолчанию: вектор скорости нулевой, радиус равен 50 пикселям, масса равна 5 у. е. При желании указать необязательный параметр все значения слева от него следует считать обязательными (во избежание путаницы при парсинге безразмерных величин в команде)</ref>, где
  
 
(100,100) - текущие координаты
 
(100,100) - текущие координаты
  
(100,90) - предыдущие координаты
+
(0,10) - вектор скорости относительно начала координат
  
 
80 -  радиус частицы в пикселях
 
80 -  радиус частицы в пикселях
Строка 109: Строка 109:
 
*'''setVelocity #0 (10,10)''', где
 
*'''setVelocity #0 (10,10)''', где
  
0 - id частицы<ref>Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы,  для стенок, стержней, пружин и частиц. Может быть получен нажатиями на кнопку "Get point's id" и на отображаемую частицу. </ref>
+
0 - id частицы<ref>Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы,  для стенок, стержней, пружин и частиц. Может быть отображён в консоли нажатиями на кнопку "Get point's id" и на отображаемую частицу.</ref>
  
 
Задать массу
 
Задать массу
Строка 216: Строка 216:
 
</small>
 
</small>
 
{{конец цитаты}}
 
{{конец цитаты}}
 +
 +
===== Взаимодействие с частицами =====
 +
*'''Get point's id'''
 +
 +
После нажатия на кнопку, а затем на частицу выводит её id в консоль.
 +
 +
*'''Move point'''
 +
 +
После нажатия на кнопку, а затем на частицу закрепляет управление её положением за курсором мыши.
 +
 +
Дальнейшие нажатия на свободные участки поля переносят эту частицу в точку нажатия с сохранением вектора скорости
 +
 +
Для прекращения управления следует вновь нажать кнопку.
 +
  
 
===== Возможности плеера =====
 
===== Возможности плеера =====

Версия 21:18, 26 мая 2015

А.М. Кривцов > Теоретическая механика > Курсовые проекты ТМ 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)

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

  • showTable type 0
  • showTable type 1
  • showTable type 2

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

  • hideTable

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

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

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

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

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

  • step(100), где

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

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

  • execute nameMethod(params), где

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

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

  • getHistory

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

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

  • Move point

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

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

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


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

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


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

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

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

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

См. также

Примечания

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