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

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 6: Строка 6:
 
'''Исполнитель:''' [[Старобинский Егор]]
 
'''Исполнитель:''' [[Старобинский Егор]]
  
'''Группа:''' [[Группа 09|09]]
+
'''Группа:''' [[Группа 09|09]] (23604)
  
 
'''Семестр:''' весна 2015
 
'''Семестр:''' весна 2015
  
 
== Аннотация проекта ==
 
== Аннотация проекта ==
Рассматриваемой задачей этого проекта является определение поведения задаваемой механической двухмерной системы<ref>Строго говоря, мы рассматриваем проекцию трёхмерной системы на двухмерное пространство. Так, на изображении в заголовке страницы демонстрируется следующий эксперимент: есть тело в форме параллелепипеда (набор частиц со связями: пружинами), на тело сверху падает стержень. Проекцией этого тела является его слой: треугольная решётка, закреплённая на концах. Проекция стержня - частица (на изображении отсутствует).</ref> из частиц, сил и ограничений. Для этого был создан интернет-сайт с программой, позволяющей найти решение уравнения движения системы (физический движок). Также на базе этой программы был реализован пользовательский интерфейс с возможностями создания и редактирования исходной системы и визуализацией её поведения.
 
  
В процессе решения широко применялись знания из классической механики и программирования, благодаря чему была реализована возможность моделирования тел из большого числа частиц и ограничений (интерес с точки зрения механики) и консоль управления с упрощёнными интерпретируемыми командами (интерес с точки зрения программирования). Был внедрён ряд математических методов как для вычисления решения уравнения движения, так и для анализа разрешённой системы. Были проведены проверки получившегося движка на предварительно решённых задачах.
 
 
 
''' Научная новизна '''
 
 
Созданный движок позволяет человеку без специальных знаний в области программирования проводить моделирование собственных систем. Не требуется установки никакого дополнительного софта, программа запускается при помощи браузера как на компьютерах, так и на телефонах, планшетах, телевизорах класса Smart.
 
 
Визуализация не применяет технологию WebGL, благодаря чему многократно увеличивается диапазон устройств, способных запустить сайт с полноценной функциональностью.
 
 
Применён метод нахождения периода движения частицы по участку траектории путём последовательного разбиения поля на сетки с возрастающей плотностью ячеек (идея позаимствована из теории слов).
 
 
 
 
Движок представляет все тела как набор частиц со связями и применяет базовый двухшаговый метод численного интегрирования Верле и другие математические методы для разрешения уравнения движения в короткое время.
 
 
По возможности упрощено интегрирование в систему новых алгоритмов анализа (требует знаний в программировании на javascript как для реализации алгоритма, так и для его интегрирования), при этом все пользователи оперируют только актуальной версией программы.
 
 
 
Объединение физического движка и пользовательского интерфейса получило название "Многочастичный симулятор", имеет открытый исходный код и выполнено без использования готовых решений по теме проекта.
 
  
 
== Формулировка задачи ==
 
== Формулировка задачи ==
 
 
===== Цель работы =====
 
===== Цель работы =====
 
Создание интернет-сайта, позволяющего пользователю моделировать многоточечную систему онлайн.
 
Создание интернет-сайта, позволяющего пользователю моделировать многоточечную систему онлайн.
Строка 68: Строка 47:
  
 
Язык реализации: JavaScript.
 
Язык реализации: JavaScript.
 
  
 
===== Визуализация =====
 
===== Визуализация =====
Строка 74: Строка 52:
  
 
Обработка событий: JavaScript.
 
Обработка событий: JavaScript.
 
Манипуляции с DOM: jQuery (безболезненно заменяется на Zepto).
 
  
 
Отказ от WebGL продиктован выбором методов оптимизации для возможности работы с тысячами частиц.
 
Отказ от WebGL продиктован выбором методов оптимизации для возможности работы с тысячами частиц.
  
 
== Решение ==
 
== Решение ==
 
 
 
===== Результат =====
 
===== Результат =====
 
<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: Строка 68:
  
 
[[File:iPhone_image_2015-4-13-1431495673979_0.jpg|thumb|Нахождение периода в простом движении]]
 
[[File:iPhone_image_2015-4-13-1431495673979_0.jpg|thumb|Нахождение периода в простом движении]]
 
 
===== Элементы системы =====
 
===== Элементы системы =====
 
* Частицы;
 
* Частицы;
Строка 108: Строка 81:
  
 
[[File:iPhone_image_2015-4-13-1431495674173_2.jpg|thumb|Пример вывода консоли]]
 
[[File:iPhone_image_2015-4-13-1431495674173_2.jpg|thumb|Пример вывода консоли]]
 
  
 
===== Возможности консоли =====
 
===== Возможности консоли =====
Строка 118: Строка 90:
 
* Подключение/отключение сеток разметки, в том числе с пользовательскими размерами ячейки;
 
* Подключение/отключение сеток разметки, в том числе с пользовательскими размерами ячейки;
 
* Тетрис.
 
* Тетрис.
 
  
 
===== Команды консоли =====
 
===== Команды консоли =====
Строка 125: Строка 96:
 
Консоль выводит каждое сообщение как одну строку. Если доступной длины строки не хватает, сообщение обрезается. Для отображения полной версии сообщения необходимо кликнуть по нему мышью.
 
Консоль выводит каждое сообщение как одну строку. Если доступной длины строки не хватает, сообщение обрезается. Для отображения полной версии сообщения необходимо кликнуть по нему мышью.
  
 +
{{начало цитаты}}
 +
'''Основные запросы'''
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
<small>
  <big>'''Примеры основных запросов'''</big>
 
<div class="mw-collapsible-content">
 
{{начало цитаты}}
 
 
Очистить поле консоли
 
Очистить поле консоли
  
Строка 135: Строка 105:
  
  
Отобразить статистику элементов системы и число тиков:
+
Отобразить статистику элементов системы и чилто тиков:
  
 
* '''getInfo'''
 
* '''getInfo'''
Строка 157: Строка 127:
 
* '''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: Строка 143:
 
Задать массу
 
Задать массу
  
* '''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: Строка 158:
 
Задать радиус
 
Задать радиус
  
* '''setProp #0 radius 100''', где
+
* '''setProps #0 radius 100''', где
  
 
0 - id частицы<ref name="pointsId" />
 
0 - id частицы<ref name="pointsId" />
  
100 - радиус частицы в пикселях
+
100 - радиус частицы
  
  
Строка 203: Строка 171:
 
0, 1 - id частиц<ref name="pointsId" />
 
0, 1 - id частиц<ref name="pointsId" />
  
50 - жёсткость пружины в у. е.
+
50 - жёсткость пружины
  
  
Строка 211: Строка 179:
 
5 - id пружины<ref name="pointsId" />
 
5 - id пружины<ref name="pointsId" />
  
10 - новая жёсткость в у. е.
+
10 - новая жёсткость
  
  
Строка 217: Строка 185:
 
* '''changeSprings 10->15''', где
 
* '''changeSprings 10->15''', где
  
10 - текущая жёсткость в у. е.
+
10 - текущая жёсткость
  
15 - новая жёсткость в у. е.
+
15 - новая жёсткость
  
  
Строка 225: Строка 193:
 
* '''changeSprings all->20''', где
 
* '''changeSprings all->20''', где
  
20 - новая жёсткость в у. е.
+
20 - новая жёсткость
  
  
Строка 237: Строка 205:
 
Отключение гравитации
 
Отключение гравитации
  
* '''gravity disable'''
+
* '''gravy disable'''
  
  
 
Задать вектор ускорения свободного падения (относительно начала координат)
 
Задать вектор ускорения свободного падения (относительно начала координат)
  
* '''gravity (0,10)'''
+
* '''gravy (0,10)'''
  
  
Отобразить сетку<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: Строка 259:
  
 
commandOne, commandTwo - команды консоли, могут также состоять из объединённых команд
 
commandOne, commandTwo - команды консоли, могут также состоять из объединённых команд
 +
</small>
 
{{конец цитаты}}
 
{{конец цитаты}}
</div>
 
</div>
 
 
===== Возможности плеера =====
 
* Воспроизведение/пауза симуляции с заданным <math>\Delta t</math>;
 
* Скачок вперёд на кратное <math>\Delta t</math> время;
 
* "Замедление времени"<ref>При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управляется через консоль.</ref>.
 
  
 
===== Кнопки интерфейса =====
 
===== Кнопки интерфейса =====
Строка 316: Строка 266:
  
 
После нажатия на кнопку, а затем на частицу выводит id последней в консоль.
 
После нажатия на кнопку, а затем на частицу выводит id последней в консоль.
 
  
 
* Кнопка '''Move point'''<ref name="workWithVisualisation" />
 
* Кнопка '''Move point'''<ref name="workWithVisualisation" />
Строка 322: Строка 271:
 
Эквивалентна команде консоли movePoint без флага saveV.
 
Эквивалентна команде консоли movePoint без флага saveV.
  
После нажатия на кнопку, а затем на частицу закрепляет управление положением последней за курсором мыши.
+
После нажатия на кнопку, а затем на частицу закрепляет управление положением последним за курсором мыши.
  
 
Дальнейшие нажатия на свободные участки поля переносят эту частицу в точку нажатия, при этом её скорость считается нулевой.
 
Дальнейшие нажатия на свободные участки поля переносят эту частицу в точку нажатия, при этом её скорость считается нулевой.
  
Для прекращения управления следует вновь нажать исходную кнопку.
+
Для прекращения управления следует вновь нажать кнопку.
 
 
  
 
* Клавиша клавиатуры '''~''' (также '''`''', '''ё''',  '''Ё''')
 
* Клавиша клавиатуры '''~''' (также '''`''', '''ё''',  '''Ё''')
  
Эквивалентна командам консоли play/stop и кнопкам <big>'''►'''</big> / <big>'''| |'''</big> плеера.
+
Эквивалентна командам консоли play/stop и крайней левой кнопке плеера.
 
 
  
 
* Кнопки плеера
 
* Кнопки плеера
  
<big>'''►'''</big> / <big>'''| |'''</big>  - воспроизведение/остановка симуляции (эквивалентна командам консоли play/stop).
+
Слева направо:
  
'''►''' - переход на тик вперёд (эквивалентна команде консоли step(1)).
+
Воспроизведение/остановка симуляции (эквивалентно командам консоли play/step), переход на тик вперёд (эквивалентно команде консоли step(1))переход на 50 тиков вперёд (эквивалентно команде консоли step(50)), переход на 100 тиков вперёд (эквивалентно команде консоли step(100)).
  
'''►►''' - переход на 50 тиков вперёд (эквивалентна команде консоли step(50)).
+
===== Возможности плеера =====
 
+
* Воспроизведение/пауза симуляции с заданным <math>\Delta t</math>;
'''►|''' - переход на 100 тиков вперёд (эквивалентна команде консоли step(100)).
+
* Скачок вперёд на кратное <math>\Delta t</math> время;
 +
* "Замедление времени"<ref>При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управлятся через консоль.</ref>.
  
 
===== Пример системы =====
 
===== Пример системы =====
Строка 383: Строка 331:
 
== Выдержки кода решения ==
 
== Выдержки кода решения ==
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
'''Исходный код некоторых файлов [HTML, JS, CSS]'''
+
'''Исходный код некоторых файлов'''
 
<div class="mw-collapsible-content">
 
<div class="mw-collapsible-content">
 
Файл '''"point.js"'''
 
Файл '''"point.js"'''
Строка 389: Строка 337:
 
function Point(mass, radius, coorXY, oldCoorXY, isExpToPot)
 
function Point(mass, radius, coorXY, oldCoorXY, isExpToPot)
 
{
 
{
    this.mass = mass;
+
  this.mass = mass;
 
     this.invmass = 1 / mass;
 
     this.invmass = 1 / mass;
 
     this.radius = radius;
 
     this.radius = radius;
Строка 1157: Строка 1105:
 
     -ms-user-select: none;
 
     -ms-user-select: none;
 
     -o-user-select: none;
 
     -o-user-select: none;
     user-select: none;
+
     user-select: none;
 
}
 
}
 
#screen{
 
#screen{
Строка 1224: Строка 1172:
 
width: 2px;
 
width: 2px;
 
position:absolute;
 
position:absolute;
-webkit-transform-origin:       50% 0;
+
-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: Строка 1218:
 
     padding: 15px;
 
     padding: 15px;
 
     -webkit-transition: all 400ms;
 
     -webkit-transition: all 400ms;
     -khtml-transition: all 400ms;
+
     -khtml-transition: all 400ms;
 
       -moz-transition: all 400ms;
 
       -moz-transition: all 400ms;
 
         -o-transition: all 400ms;
 
         -o-transition: all 400ms;
Строка 1436: Строка 1384:
 
   <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-2.1.3.min.js"></script>
        <script type="text/javascript" src="./jquery-css-transform.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="./point.js"></script>
        <script type="text/javascript" src="./spring.js"></script>
+
    <script type="text/javascript" src="./spring.js"></script>
        <script type="text/javascript" src="./stick.js"></script>
+
    <script type="text/javascript" src="./stick.js"></script>
        <script type="text/javascript" src="./func.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="./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>
+
    <script type="text/javascript" src="./clean.js"></script>
 
</head>
 
</head>
 
<body>
 
<body>
Строка 1461: Строка 1409:
 
     </div>
 
     </div>
 
     <div id="consoleWindow" class="show">
 
     <div id="consoleWindow" class="show">
        <div id="consoleInput">
+
    <div id="consoleInput">
            <input id="console" type="text" autofocus="autofocus">
+
    <input id="console" type="text" autofocus="autofocus">
            <input id="consoleBtn" type="button" value="Enter">
+
<input id="consoleBtn" type="button" value="Enter">
        </div>
+
    </div>
        <div id="consoleLog">
+
    <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>
 
     </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: Строка 1429:
 
</div>
 
</div>
  
[[ Медиа : MultiparticleSimulator.zip|Исходный код [php js css].zip]]
+
== Обсуждение результатов и выводы ==
  
Суммарно код текущей версии ('''v2.0 b''' от 2 июня 2015 года) движка занимает 2 500 строк без учёта библиотеки.
+
<br>
 
+
Скачать отчет:
Отличие от семейства версий '''1.*''' в полностью переписанной логике проекта для оптимизации вычислений и соблюдения принципов OOP JS.
+
<br>
 
+
Скачать презентацию:
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''Разбор кода файла point.js'''
 
<div class="mw-collapsible-content">
 
Файл '''"point.js"'''
 
<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(){
 
    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>
 
 
 
== Сопроводительная информация ==
 
{| 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:

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