Текущая версия |
Ваш текст |
Строка 6: |
Строка 6: |
| '''Исполнитель:''' [[Старобинский Егор]] | | '''Исполнитель:''' [[Старобинский Егор]] |
| | | |
− | '''Группа:''' [[Группа 09|09]] | + | '''Группа:''' [[Группа 09|09]] (23604) |
| | | |
| '''Семестр:''' весна 2015 | | '''Семестр:''' весна 2015 |
Строка 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|Нахождение периода в простом движении]] |
| + | |
| | | |
| ===== Элементы системы ===== | | ===== Элементы системы ===== |
Строка 310: |
Строка 311: |
| * Воспроизведение/пауза симуляции с заданным <math>\Delta t</math>; | | * Воспроизведение/пауза симуляции с заданным <math>\Delta t</math>; |
| * Скачок вперёд на кратное <math>\Delta t</math> время; | | * Скачок вперёд на кратное <math>\Delta t</math> время; |
− | * "Замедление времени"<ref>При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управляется через консоль.</ref>. | + | * "Замедление времени"<ref>При малой производительности клиента уменьшаем число отрисовок в единицу времени для сохранения гладкости анимации. Управлятся через консоль.</ref>. |
| + | |
| | | |
| ===== Кнопки интерфейса ===== | | ===== Кнопки интерфейса ===== |
Строка 342: |
Строка 344: |
| '''►►''' - переход на 50 тиков вперёд (эквивалентна команде консоли step(50)). | | '''►►''' - переход на 50 тиков вперёд (эквивалентна команде консоли step(50)). |
| | | |
− | '''►|''' - переход на 100 тиков вперёд (эквивалентна команде консоли step(100)). | + | '''►|''' - переход на 100 тиков вперёд (эквивалентн команде консоли step(100)). |
| + | |
| | | |
| ===== Пример системы ===== | | ===== Пример системы ===== |
Строка 1487: |
Строка 1490: |
| Отличие от семейства версий '''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"'''
| |
− | <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());
| |
− | }
| |
| | | |
| + | [[File:MultiparticleSimulator.pdf]] |
| | | |
− | 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 страница
| |
− | |}
| |
| | | |
| == Ссылки по теме == | | == Ссылки по теме == |