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

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 6: Строка 6:
 
'''Исполнитель:''' [[Старобинский Егор]]
 
'''Исполнитель:''' [[Старобинский Егор]]
  
'''Группа:''' [[Группа 09|09]]
+
'''Группа:''' [[Группа 09|09]] (23604)
  
 
'''Семестр:''' весна 2015
 
'''Семестр:''' весна 2015
Строка 20: Строка 20:
 
Созданный движок позволяет человеку без специальных знаний в области программирования проводить моделирование собственных систем. Не требуется установки никакого дополнительного софта, программа запускается при помощи браузера как на компьютерах, так и на телефонах, планшетах, телевизорах класса Smart.
 
Созданный движок позволяет человеку без специальных знаний в области программирования проводить моделирование собственных систем. Не требуется установки никакого дополнительного софта, программа запускается при помощи браузера как на компьютерах, так и на телефонах, планшетах, телевизорах класса Smart.
  
Визуализация не применяет технологию WebGL, благодаря чему многократно увеличивается диапазон устройств, способных запустить сайт с полноценной функциональностью.
+
Визуализация не применяет технологию WebGL, благодаря чему многократно увеличивается диапазон устроств, способных запустить сайт с полноценной функциональностью.
  
 
Применён метод нахождения периода движения частицы по участку траектории путём последовательного разбиения поля на сетки с возрастающей плотностью ячеек (идея позаимствована из теории слов).
 
Применён метод нахождения периода движения частицы по участку траектории путём последовательного разбиения поля на сетки с возрастающей плотностью ячеек (идея позаимствована из теории слов).
Строка 84: Строка 84:
 
===== Результат =====
 
===== Результат =====
 
<center>
 
<center>
{{#widget:Iframe|url=https://ailurus.ru/stands/phen/|width=960|height:540|border=0}}
+
{{#widget:Iframe|url=http://cl49743.tmweb.ru/node/phen/|width=960|height:540|border=0}}
  
<big>[//ailurus.ru/stands/phen/ Страница решения]</big>
+
<big>[http://cl49743.tmweb.ru/node/phen/ Страница решения]</big>
 
</center>
 
</center>
  
Строка 94: Строка 94:
  
 
[[File:iPhone_image_2015-4-13-1431495673979_0.jpg|thumb|Нахождение периода в простом движении]]
 
[[File:iPhone_image_2015-4-13-1431495673979_0.jpg|thumb|Нахождение периода в простом движении]]
 +
  
 
===== Элементы системы =====
 
===== Элементы системы =====
Строка 125: Строка 126:
 
Консоль выводит каждое сообщение как одну строку. Если доступной длины строки не хватает, сообщение обрезается. Для отображения полной версии сообщения необходимо кликнуть по нему мышью.
 
Консоль выводит каждое сообщение как одну строку. Если доступной длины строки не хватает, сообщение обрезается. Для отображения полной версии сообщения необходимо кликнуть по нему мышью.
  
 +
{{начало цитаты}}
 +
'''Основные запросы'''
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
<small>
  <big>'''Примеры основных запросов'''</big>
 
<div class="mw-collapsible-content">
 
{{начало цитаты}}
 
 
Очистить поле консоли
 
Очистить поле консоли
  
Строка 135: Строка 135:
  
  
Отобразить статистику элементов системы и число тиков:
+
Отобразить статистику элементов системы и чилто тиков:
  
 
* '''getInfo'''
 
* '''getInfo'''
Строка 157: Строка 157:
 
* '''setVelocity #0 (10,10)''', где
 
* '''setVelocity #0 (10,10)''', где
  
0 - id частицы<ref name="pointsId">Идентификационный номер элемента в системе. Генерируется последовательно, начиная с нуля, для стенок, стержней, пружин и частиц при их добавлении. Для частиц значение id можно найти нажатием сначала на кнопку "Get point's id", а затем на частицу: тогда Id отобразится в консоли.</ref>
+
0 - id частицы<ref name="pointsId">Идентификационный номер элемента в системе. Генерируется последовательно, начиная с единицы, для стенок, стержней, пружин и частиц. Для частиц значение id можно найти нажатием сначала на кнопку "Get point's id", а затем на частицу: тогда Id отобразится в консоли.</ref>
 
 
(10,10) - новый вектор скорости относительно начала координат
 
  
  
Строка 175: Строка 173:
 
Задать массу
 
Задать массу
  
* '''setProp #0 mass 10''', где
+
* '''setProps #0 mass 10''', где
  
 
0 - id частицы<ref name="pointsId" />
 
0 - id частицы<ref name="pointsId" />
  
10 - новая масса в у. е.
+
10 - новая масса
  
* '''setProp #0 invmass 0.1''', где
+
* '''setProps #0 invmass 0.1''', где
  
 
0 - id частицы<ref name="pointsId" />
 
0 - id частицы<ref name="pointsId" />
Строка 190: Строка 188:
 
Задать радиус
 
Задать радиус
  
* '''setProp #0 radius 100''', где
+
* '''setProps #0 radius 100''', где
  
 
0 - id частицы<ref name="pointsId" />
 
0 - id частицы<ref name="pointsId" />
  
100 - радиус частицы в пикселях
+
100 - радиус частицы
  
  
Строка 203: Строка 201:
 
0, 1 - id частиц<ref name="pointsId" />
 
0, 1 - id частиц<ref name="pointsId" />
  
50 - жёсткость пружины в у. е.
+
50 - жёсткость пружины
  
  
Строка 211: Строка 209:
 
5 - id пружины<ref name="pointsId" />
 
5 - id пружины<ref name="pointsId" />
  
10 - новая жёсткость в у. е.
+
10 - новая жёсткость
  
  
Строка 217: Строка 215:
 
* '''changeSprings 10->15''', где
 
* '''changeSprings 10->15''', где
  
10 - текущая жёсткость в у. е.
+
10 - текущая жёсткость
  
15 - новая жёсткость в у. е.
+
15 - новая жёсткость
  
  
Строка 225: Строка 223:
 
* '''changeSprings all->20''', где
 
* '''changeSprings all->20''', где
  
20 - новая жёсткость в у. е.
+
20 - новая жёсткость
  
  
Строка 245: Строка 243:
  
  
Отобразить сетку<ref>''' Важно! ''' Отображается максимум одна таблица за раз.</ref>
+
Отобразить сетку
  
 
* '''showGrid type 0'''
 
* '''showGrid type 0'''
 
Сетка 100х50 пикселей.
 
  
 
* '''showGrid type 1'''
 
* '''showGrid type 1'''
 
Сетка 50х25 пикселей.
 
  
 
* '''showGrid type 2'''
 
* '''showGrid type 2'''
 
Сетка 20х10 пикселей.
 
 
* '''showGrid 100x75''', где
 
 
100 - ширина ячеек в пикселях
 
 
50 - высота ячеек в пикселях
 
  
  
Строка 303: Строка 289:
  
 
commandOne, commandTwo - команды консоли, могут также состоять из объединённых команд
 
commandOne, commandTwo - команды консоли, могут также состоять из объединённых команд
 +
</small>
 
{{конец цитаты}}
 
{{конец цитаты}}
</div>
+
 
</div>
 
  
 
===== Возможности плеера =====
 
===== Возможности плеера =====
 
* Воспроизведение/пауза симуляции с заданным <math>\Delta t</math>;  
 
* Воспроизведение/пауза симуляции с заданным <math>\Delta t</math>;  
 
* Скачок вперёд на кратное <math>\Delta t</math> время;
 
* Скачок вперёд на кратное <math>\Delta t</math> время;
* "Замедление времени"<ref>При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управляется через консоль.</ref>.
+
* "Замедление времени"<ref>При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управлятся через консоль.</ref>.
 +
 
  
 
===== Кнопки интерфейса =====
 
===== Кнопки интерфейса =====
Строка 331: Строка 318:
 
* Клавиша клавиатуры '''~''' (также '''`''', '''ё''',  '''Ё''')
 
* Клавиша клавиатуры '''~''' (также '''`''', '''ё''',  '''Ё''')
  
Эквивалентна командам консоли play/stop и кнопкам <big>'''►'''</big> / <big>'''| |'''</big> плеера.
+
Эквивалентна командам консоли play/stop и крайней левой кнопке плеера.
  
  
 
* Кнопки плеера
 
* Кнопки плеера
  
<big>'''►'''</big> / <big>'''| |'''</big>  - воспроизведение/остановка симуляции (эквивалентна командам консоли play/stop).
+
<big>'''►'''</big> / <big>'''| |'''</big>  - воспроизведение/остановка симуляции (эквивалентно командам консоли play/stop).
  
'''►''' - переход на тик вперёд (эквивалентна команде консоли step(1)).
+
'''►''' - переход на тик вперёд (эквивалентно команде консоли step(1)).
  
'''►►''' - переход на 50 тиков вперёд (эквивалентна команде консоли step(50)).
+
'''►►''' - переход на 50 тиков вперёд (эквивалентно команде консоли step(50)).
 +
 
 +
'''►|''' - переход на 100 тиков вперёд (эквивалентно команде консоли step(100)).
  
'''►|''' - переход на 100 тиков вперёд (эквивалентна команде консоли step(100)).
 
  
 
===== Пример системы =====
 
===== Пример системы =====
Строка 1481: Строка 1469:
 
</div>
 
</div>
  
[[ Медиа : MultiparticleSimulator.zip|Исходный код [php js css].zip]]
 
  
 
Суммарно код текущей версии ('''v2.0 b''' от 2 июня 2015 года) движка занимает 2 500 строк без учёта библиотеки.
 
Суммарно код текущей версии ('''v2.0 b''' от 2 июня 2015 года) движка занимает 2 500 строк без учёта библиотеки.
Строка 1487: Строка 1474:
 
Отличие от семейства версий '''1.*''' в полностью переписанной логике проекта для оптимизации вычислений и соблюдения принципов OOP JS.
 
Отличие от семейства версий '''1.*''' в полностью переписанной логике проекта для оптимизации вычислений и соблюдения принципов OOP JS.
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
== Обсуждение результатов и выводы ==
'''Разбор кода файла point.js'''
+
Общая презентация симулятора (12 страниц)
<div class="mw-collapsible-content">
+
 
Файл '''"point.js"'''
+
[[File:MultiparticleSimulator.pdf]]
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
function Point(mass, radius, coorXY, oldCoorXY, isExpToPot)
 
{
 
    this.mass = mass;
 
    this.invmass = 1 / mass;
 
    this.radius = radius;
 
    this.coor = coorXY;
 
    this.oldCoor = oldCoorXY || coorXY;
 
    this.id = getId();
 
    this.type = 'point';
 
    this.isExpToPot = isExpToPot || false;
 
   
 
// log
 
    console.log('Create: '+this.toString());
 
}
 
 
 
  
Point.prototype.checkCoor = function(){
+
Подробная презентация физического движка в составе симулятора (55 страниц)
    if (this.coor.isNaN())
 
    {
 
        console.error('Coor is NaN: ' + this);
 
        player.stop();
 
    }
 
    else
 
    {
 
        if (this.oldCoor.isNaN())
 
        {
 
            console.warning('OldCoor is NaN: ' + this);
 
            this.oldCoor = new Coor(this.coor);
 
        }
 
        else
 
        {
 
            return ;
 
        }
 
    }
 
}
 
 
 
Point.prototype.toString = function(type){
 
    if (type === 'full')
 
    {
 
        return JSON.stringify(this, [ 
 
                                        'type',
 
                                        'id',
 
                                        'coor',
 
                                        'mass_',
 
                                        'radius_',
 
                                        'x',
 
                                        'y',
 
                                        'begin',
 
                                        'end'
 
                                ], 4)
 
    }
 
    else
 
    {
 
        return JSON.stringify(this, [ 
 
                                        'type',
 
                                        'id',
 
                                        'coor',
 
                                        'x',
 
                                        'y',
 
                                        'begin',
 
                                        'end'
 
                                ], 4)
 
    }
 
}
 
 
 
Point.prototype.move = function(coorXY){
 
var delta = minusCoor(this.coor, this.oldCoor);
 
    this.coor = coorXY;
 
    this.oldCoor = minusCoor(coorXY, delta);
 
// log
 
    console.log('Move: '+this.toString());
 
}
 
 
 
Point.prototype.moveEase = function(coorXY){
 
    this.coor = coorXY;
 
    this.oldCoor = coorXY;
 
// log
 
    console.log('Move: '+this.toString());
 
}
 
</syntaxhighlight>
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="3" enclose="div">this.mass = mass;</syntaxhighlight>
 
 
 
Сообщаем нашей частице массу, равную mass.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="4" enclose="div">this.invmass = 1 / mass;</syntaxhighlight>
 
 
 
Вводим обратную массу, равную 1/mass. В дальнейшем работаем именно с обратным значением массы, так как это позволит вводить  “бесконечно тяжёлые” частицы (значение invmass можно задать отдельно впоследствие).
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="5" enclose="div">this.radius = radius;</syntaxhighlight>
 
 
 
Задаём радиус, равный radius. Измеряется в пикселях.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="6" enclose="div">this.coor = coorXY;</syntaxhighlight>
 
 
 
Задаём текущие координаты значениями coorXY.x и coorXY.y.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="7" enclose="div">this.oldCoor = oldCoorXY || coorXY;</syntaxhighlight>
 
 
 
Если были заданы предыдущие координаты (oldCoor.x и oldCoor.y), то записываем их. Иначе записываем текущие координаты, тогда частица будет обладать нулевым вектором скорости
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="8" enclose="div">this.id = getId();</syntaxhighlight>
 
 
 
Генерируем уникальный номер для частицы.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="9" enclose="div">this.type = 'point';</syntaxhighlight>
 
 
 
Указываем тип элемента как “point”, чтобы обработчик отличал частицу от других объектов.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="10" enclose="div">this.isExpToPot = isExpToPot || false;</syntaxhighlight>
 
 
 
Сообщаем, должна ли участвовать в потенциальном парном взаимодействии. Да - если isExpToPot равняется true, нет - во всех прочих случаях.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="13" enclose="div">console.log('Create: ‘+this.toString());</syntaxhighlight>
 
 
 
Выводим в консоль подробную информацию о созданной частице.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="17" enclose="div">Point.prototype.checkCoor</syntaxhighlight>
 
 
 
Метод проверки значений координат положений частицы. Если текущее положение частицы не может быть определено (не верный запрос, статически неопределимая система и пр.), останавливаем симуляцию и выводим в консоль ошибку. Если не удаётся определить значения координат предыдущего положения (симуляция запущена пользователем после получения ошибки в текущих координатах частицы и пр.), выдаём предупреждение, используем координаты текущего положения также и как координаты предыдущего.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="37" enclose="div">Point.prototype.toString</syntaxhighlight>
 
 
 
Метод, собирающий информацию о частице и выдающий её в удобном виде.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="66" enclose="div">Point.prototype.move</syntaxhighlight>
 
 
 
Метод перемещения частицы в указанные координаты. Вектор скорости сохраняется, в консоль записывается информация о перемещении.
 
 
 
 
 
<syntaxhighlight lang="javascript" line start="74" enclose="div">Point.prototype.moveEase</syntaxhighlight>
 
 
 
Другой метод перемещения частицы в указанные координаты. Вектор скорости зануляется, в консоль записывается информация о перемещении.
 
</div>
 
  
== Сопроводительная информация ==
+
[[File:PhysicsEngine.pdf]]
{| class="wikitable" style="text-align:center; width: 100%;"
 
|-
 
! Общая презентация <br>симулятора
 
! Подробная презентация <br> физического движка <br>в составе симулятора
 
! Отчёт
 
|-
 
| [[File:MultiparticleSimulator.pdf]]
 
| [[File:PhysicsEngine.pdf]]
 
| [[File:MultiparticleSimulatorReport.pdf]]
 
|-
 
| 12 слайдов
 
| 55 слайдов
 
| 21 страница
 
|}
 
  
 
== Ссылки по теме ==
 
== Ссылки по теме ==
T. Jakobsen. "Advanced Character Physics", 2003. ([http://dkhramov.dp.ua/uploads/Comp/Jakobsen/jakobsen.pdf перевод статьи <nowiki></nowiki>])
+
T, Jakobsen. "Advanced Character Physics", 2003. ([http://dkhramov.dp.ua/uploads/Comp/Jakobsen/jakobsen.pdf перевод статьи <nowiki></nowiki>])
  
Л. Ландау, Е. Лифшиц. "Теоретическая физика", том первый, "Механика", 1988.
+
Л. Ландау, Е. Лифшиц, "Теоретическая физика", том первый, "Механика", 2001.
  
А. Смирнов. "Курсовой проект: молекула углекислого газа", 2015. ([[КП: Молекула углекислого газа|страница проекта]])
+
А, Смирнов. "Курсовой проект: молекула углекислого газа", 2015. ([[КП: Молекула углекислого газа|страница проекта]])
  
 
== См. также ==
 
== См. также ==
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)