Редактирование: КП: Многочастичный симулятор
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 6: | Строка 6: | ||
'''Исполнитель:''' [[Старобинский Егор]] | '''Исполнитель:''' [[Старобинский Егор]] | ||
− | '''Группа:''' [[Группа 09|09]] | + | '''Группа:''' [[Группа 09|09]] (23604) |
'''Семестр:''' весна 2015 | '''Семестр:''' весна 2015 | ||
Строка 14: | Строка 14: | ||
В процессе решения широко применялись знания из классической механики и программирования, благодаря чему была реализована возможность моделирования тел из большого числа частиц и ограничений (интерес с точки зрения механики) и консоль управления с упрощёнными интерпретируемыми командами (интерес с точки зрения программирования). Был внедрён ряд математических методов как для вычисления решения уравнения движения, так и для анализа разрешённой системы. Были проведены проверки получившегося движка на предварительно решённых задачах. | В процессе решения широко применялись знания из классической механики и программирования, благодаря чему была реализована возможность моделирования тел из большого числа частиц и ограничений (интерес с точки зрения механики) и консоль управления с упрощёнными интерпретируемыми командами (интерес с точки зрения программирования). Был внедрён ряд математических методов как для вычисления решения уравнения движения, так и для анализа разрешённой системы. Были проведены проверки получившегося движка на предварительно решённых задачах. | ||
− | |||
''' Научная новизна ''' | ''' Научная новизна ''' | ||
Созданный движок позволяет человеку без специальных знаний в области программирования проводить моделирование собственных систем. Не требуется установки никакого дополнительного софта, программа запускается при помощи браузера как на компьютерах, так и на телефонах, планшетах, телевизорах класса Smart. | Созданный движок позволяет человеку без специальных знаний в области программирования проводить моделирование собственных систем. Не требуется установки никакого дополнительного софта, программа запускается при помощи браузера как на компьютерах, так и на телефонах, планшетах, телевизорах класса Smart. | ||
− | |||
− | |||
Применён метод нахождения периода движения частицы по участку траектории путём последовательного разбиения поля на сетки с возрастающей плотностью ячеек (идея позаимствована из теории слов). | Применён метод нахождения периода движения частицы по участку траектории путём последовательного разбиения поля на сетки с возрастающей плотностью ячеек (идея позаимствована из теории слов). | ||
− | |||
− | |||
Движок представляет все тела как набор частиц со связями и применяет базовый двухшаговый метод численного интегрирования Верле и другие математические методы для разрешения уравнения движения в короткое время. | Движок представляет все тела как набор частиц со связями и применяет базовый двухшаговый метод численного интегрирования Верле и другие математические методы для разрешения уравнения движения в короткое время. | ||
По возможности упрощено интегрирование в систему новых алгоритмов анализа (требует знаний в программировании на javascript как для реализации алгоритма, так и для его интегрирования), при этом все пользователи оперируют только актуальной версией программы. | По возможности упрощено интегрирование в систему новых алгоритмов анализа (требует знаний в программировании на javascript как для реализации алгоритма, так и для его интегрирования), при этом все пользователи оперируют только актуальной версией программы. | ||
− | |||
− | |||
− | |||
== Формулировка задачи == | == Формулировка задачи == | ||
Строка 84: | Строка 76: | ||
===== Результат ===== | ===== Результат ===== | ||
<center> | <center> | ||
− | {{#widget:Iframe|url= | + | {{#widget:Iframe|url=http://cl49743.tmweb.ru/node/phen/|width=960|height:540|border=0}} |
− | <big>[// | + | <big>[http://cl49743.tmweb.ru/node/phen/ Страница решения]</big> |
</center> | </center> | ||
Строка 94: | Строка 86: | ||
[[File:iPhone_image_2015-4-13-1431495673979_0.jpg|thumb|Нахождение периода в простом движении]] | [[File:iPhone_image_2015-4-13-1431495673979_0.jpg|thumb|Нахождение периода в простом движении]] | ||
+ | |||
===== Элементы системы ===== | ===== Элементы системы ===== | ||
Строка 125: | Строка 118: | ||
Консоль выводит каждое сообщение как одну строку. Если доступной длины строки не хватает, сообщение обрезается. Для отображения полной версии сообщения необходимо кликнуть по нему мышью. | Консоль выводит каждое сообщение как одну строку. Если доступной длины строки не хватает, сообщение обрезается. Для отображения полной версии сообщения необходимо кликнуть по нему мышью. | ||
+ | {{начало цитаты}} | ||
+ | '''Основные запросы''' | ||
− | < | + | <small> |
− | |||
− | |||
− | |||
Очистить поле консоли | Очистить поле консоли | ||
Строка 135: | Строка 127: | ||
− | Отобразить статистику элементов системы и | + | Отобразить статистику элементов системы и чилто тиков: |
* '''getInfo''' | * '''getInfo''' | ||
Строка 157: | Строка 149: | ||
* '''setVelocity #0 (10,10)''', где | * '''setVelocity #0 (10,10)''', где | ||
− | 0 - id частицы<ref name="pointsId">Идентификационный номер элемента в системе. Генерируется последовательно, начиная с | + | 0 - id частицы<ref name="pointsId">Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы, для стенок, стержней, пружин и частиц. Для частиц значение id можно найти нажатием сначала на кнопку "Get point's id", а затем на частицу: тогда Id отобразится в консоли.</ref> |
− | |||
− | |||
Строка 175: | Строка 165: | ||
Задать массу | Задать массу | ||
− | * ''' | + | * '''setProps #0 mass 10''', где |
0 - id частицы<ref name="pointsId" /> | 0 - id частицы<ref name="pointsId" /> | ||
− | 10 - новая масса | + | 10 - новая масса |
− | * ''' | + | * '''setProps #0 invmass 0.1''', где |
0 - id частицы<ref name="pointsId" /> | 0 - id частицы<ref name="pointsId" /> | ||
Строка 190: | Строка 180: | ||
Задать радиус | Задать радиус | ||
− | * ''' | + | * '''setProps #0 radius 100''', где |
0 - id частицы<ref name="pointsId" /> | 0 - id частицы<ref name="pointsId" /> | ||
− | 100 - радиус частицы | + | 100 - радиус частицы |
Строка 203: | Строка 193: | ||
0, 1 - id частиц<ref name="pointsId" /> | 0, 1 - id частиц<ref name="pointsId" /> | ||
− | 50 - жёсткость пружины | + | 50 - жёсткость пружины |
Строка 211: | Строка 201: | ||
5 - id пружины<ref name="pointsId" /> | 5 - id пружины<ref name="pointsId" /> | ||
− | 10 - новая жёсткость | + | 10 - новая жёсткость |
Строка 217: | Строка 207: | ||
* '''changeSprings 10->15''', где | * '''changeSprings 10->15''', где | ||
− | 10 - текущая жёсткость | + | 10 - текущая жёсткость |
− | 15 - новая жёсткость | + | 15 - новая жёсткость |
Строка 225: | Строка 215: | ||
* '''changeSprings all->20''', где | * '''changeSprings all->20''', где | ||
− | 20 - новая жёсткость | + | 20 - новая жёсткость |
Строка 245: | Строка 235: | ||
− | Отобразить сетку | + | Отобразить сетку |
* '''showGrid type 0''' | * '''showGrid type 0''' | ||
− | |||
− | |||
* '''showGrid type 1''' | * '''showGrid type 1''' | ||
− | |||
− | |||
* '''showGrid type 2''' | * '''showGrid type 2''' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Строка 303: | Строка 281: | ||
commandOne, commandTwo - команды консоли, могут также состоять из объединённых команд | commandOne, commandTwo - команды консоли, могут также состоять из объединённых команд | ||
+ | </small> | ||
{{конец цитаты}} | {{конец цитаты}} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===== Кнопки интерфейса ===== | ===== Кнопки интерфейса ===== | ||
Строка 331: | Строка 303: | ||
* Клавиша клавиатуры '''~''' (также '''`''', '''ё''', '''Ё''') | * Клавиша клавиатуры '''~''' (также '''`''', '''ё''', '''Ё''') | ||
− | Эквивалентна командам консоли play/stop и | + | Эквивалентна командам консоли play/stop и крайней левой кнопке плеера. |
* Кнопки плеера | * Кнопки плеера | ||
− | <big>'''►'''</big> / <big>'''| |'''</big> - воспроизведение/остановка симуляции ( | + | <big>'''►'''</big> / <big>'''| |'''</big> - воспроизведение/остановка симуляции (эквивалентно командам консоли play/stop). |
− | '''►''' - переход на тик вперёд ( | + | '''►''' - переход на тик вперёд (эквивалентно команде консоли step(1)). |
− | '''►►''' - переход на 50 тиков вперёд ( | + | '''►►''' - переход на 50 тиков вперёд (эквивалентно команде консоли step(50)). |
− | '''►|''' - переход на 100 тиков вперёд ( | + | '''►|''' - переход на 100 тиков вперёд (эквивалентно команде консоли step(100)). |
− | ===== Пример системы ===== | + | |
− | Смоделируем молекулу из трёх атомов (подобную молекуле углекислого газа, рассматриваемой в [[КП: Молекула углекислого газа|курсовом проекте]] [[Смирнов Александр|А. Смирнова]]). | + | ===== Возможности плеера ===== |
+ | * Воспроизведение/пауза симуляции с заданным <math>\Delta t</math>; | ||
+ | * Скачок вперёд на кратное <math>\Delta t</math> время; | ||
+ | * "Замедление времени"<ref>При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управлятся через консоль.</ref>. | ||
+ | |||
+ | |||
+ | ===== Пример системы ===== | ||
+ | Смоделируем молекулу из трёх атомов (подобную молекуле углекислого газа, рассматриваемой в [[КП: Молекула углекислого газа|курсовом проекте]] [[Смирнов Александр|А. Смирнова]]). | ||
[[File:phenCO2Example.png|center]] | [[File:phenCO2Example.png|center]] | ||
Строка 389: | Строка 368: | ||
function Point(mass, radius, coorXY, oldCoorXY, isExpToPot) | function Point(mass, radius, coorXY, oldCoorXY, isExpToPot) | ||
{ | { | ||
− | + | this.mass = mass; | |
this.invmass = 1 / mass; | this.invmass = 1 / mass; | ||
this.radius = radius; | this.radius = radius; | ||
Строка 1157: | Строка 1136: | ||
-ms-user-select: none; | -ms-user-select: none; | ||
-o-user-select: none; | -o-user-select: none; | ||
− | user-select: | + | user-select: none; |
} | } | ||
#screen{ | #screen{ | ||
Строка 1224: | Строка 1203: | ||
width: 2px; | width: 2px; | ||
position:absolute; | position:absolute; | ||
− | -webkit-transform-origin: | + | -webkit-transform-origin: 50% 0; |
-khtml-transform-origin: 50% 0; | -khtml-transform-origin: 50% 0; | ||
-moz-transform-origin: 50% 0; | -moz-transform-origin: 50% 0; | ||
Строка 1270: | Строка 1249: | ||
padding: 15px; | padding: 15px; | ||
-webkit-transition: all 400ms; | -webkit-transition: all 400ms; | ||
− | -khtml-transition: | + | -khtml-transition: all 400ms; |
-moz-transition: all 400ms; | -moz-transition: all 400ms; | ||
-o-transition: all 400ms; | -o-transition: all 400ms; | ||
Строка 1436: | Строка 1415: | ||
<title>Phen v2.0 a</title> | <title>Phen v2.0 a</title> | ||
<link rel="stylesheet" href="./phen.css"> | <link rel="stylesheet" href="./phen.css"> | ||
− | + | <script type="text/javascript" src="./jquery-2.1.3.min.js"></script> | |
− | + | <script type="text/javascript" src="./jquery-css-transform.js"></script> | |
− | + | <script type="text/javascript" src="./point.js"></script> | |
− | + | <script type="text/javascript" src="./spring.js"></script> | |
− | + | <script type="text/javascript" src="./stick.js"></script> | |
− | + | <script type="text/javascript" src="./func.js"></script> | |
<script type="text/javascript" src="./renderer.js"></script> | <script type="text/javascript" src="./renderer.js"></script> | ||
<script type="text/javascript" src="./wall.js"></script> | <script type="text/javascript" src="./wall.js"></script> | ||
<script type="text/javascript" src="./phen.js"></script> | <script type="text/javascript" src="./phen.js"></script> | ||
− | + | <script type="text/javascript" src="./parser.js"></script> | |
<script type="text/javascript" src="./console.js"></script> | <script type="text/javascript" src="./console.js"></script> | ||
<script type="text/javascript" src="./player.js"></script> | <script type="text/javascript" src="./player.js"></script> | ||
<script type="text/javascript" src="./cycle.js"></script> | <script type="text/javascript" src="./cycle.js"></script> | ||
− | + | <script type="text/javascript" src="./clean.js"></script> | |
</head> | </head> | ||
<body> | <body> | ||
Строка 1461: | Строка 1440: | ||
</div> | </div> | ||
<div id="consoleWindow" class="show"> | <div id="consoleWindow" class="show"> | ||
− | + | <div id="consoleInput"> | |
− | + | <input id="console" type="text" autofocus="autofocus"> | |
− | + | <input id="consoleBtn" type="button" value="Enter"> | |
− | + | </div> | |
− | + | <div id="consoleLog"> | |
− | + | </div> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</div> | </div> | ||
+ | <div id="controls" class="show" type="0"> | ||
+ | <div id="playerBtns"> | ||
+ | <span id="stop"></span> | ||
+ | <span id="stepMin"></span> | ||
+ | <span id="stepMid"></span> | ||
+ | <span id="stepMax"></span> | ||
+ | </div> | ||
+ | </div> | ||
</body> | </body> | ||
</html> | </html> | ||
Строка 1481: | Строка 1460: | ||
</div> | </div> | ||
− | |||
Суммарно код текущей версии ('''v2.0 b''' от 2 июня 2015 года) движка занимает 2 500 строк без учёта библиотеки. | Суммарно код текущей версии ('''v2.0 b''' от 2 июня 2015 года) движка занимает 2 500 строк без учёта библиотеки. | ||
Строка 1487: | Строка 1465: | ||
Отличие от семейства версий '''1.*''' в полностью переписанной логике проекта для оптимизации вычислений и соблюдения принципов OOP JS. | Отличие от семейства версий '''1.*''' в полностью переписанной логике проекта для оптимизации вычислений и соблюдения принципов OOP JS. | ||
− | + | == Обсуждение результатов и выводы == | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <br> | |
− | + | Скачать отчет: | |
− | + | <br> | |
− | + | Скачать презентацию: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | < | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Ссылки по теме == | == Ссылки по теме == | ||
− | T | + | T, Jakobsen. "Advanced Character Physics", 2003. ([http://dkhramov.dp.ua/uploads/Comp/Jakobsen/jakobsen.pdf перевод статьи <nowiki></nowiki>]) |
− | Л. Ландау, Е. Лифшиц | + | Л. Ландау, Е. Лифшиц, "Теоретическая физика", том первый, "Механика", 2001. |
− | А | + | А, Смирнов. "Курсовой проект: молекула углекислого газа", 2015. ([[КП: Молекула углекислого газа|страница проекта]]) |
== См. также == | == См. также == |