[GPL v3]

Мёртвая петля

Описание


Цель проекта: разработать программный продукт, представляющий собой виртуальную физическую лабораторию, моделирующую движение шарика в «мёртвой петле» при различных начальных условиях

Язык программирования: C++

Фреймворк: Qt4 / Qt5

Лицензия: GNU GPL v3

В программе моделируется поведение шарика, который совершает «Мёртвую петлю», то есть катится по круговому сектору. В модели можно изменять: угол наклона начального сектора (по которому шар набирает скорость), его длину, радиус проходимой шаром окружности и радиус шара.

В программе выводятся графики:


Скриншоты

 


Загрузка

Исходный код:
deathloop_v1.0.zip
deathloop_v1.0.tar.gz

Git:
https://fami.codefreak.ru/gitlab/fami-net/deathloop.git
https://github.com/AlienCowEatCake/deathloop.git

Бинарные сборки:
Компилятор / Qt ОС Ссылка
MSVC 2015 x86, Qt 5.6.2 Windows XP SP3 и выше deathloop_qt5.6_msvc2015_x86.exe
MSVC 2015 x64, Qt 5.6.2 Windows XP x64 SP2 и выше deathloop_qt5.6_msvc2015_x64.exe
MinGW 3.4.2, Qt 4.4.3 Windows 98 SE и выше deathloop_qt4.4_mingw32.exe
GCC 4.8.5 i486, Qt 5.6.2 GNU/Linux i486 deathloop_qt5.6_i486-linux-gnu.elf
GCC 4.8.5 x86_64, Qt 5.6.2 GNU/Linux x86_64 deathloop_qt5.6_x86_64-linux-gnu.elf
Apple Clang 7.3.0, Qt 5.6.2 Mac OS X 10.6 и выше deathloop_qt5.6_clang64_libstdc++.dmg

Архив версий:
files/


Список изменений

[v1.0] - 31 Dec 2016 Предыдущие версии
[v0.38] - 25 Aug 2015
  • Добавлен альтернативный софтверный рендер для систем, плохо поддерживающих OpenGL
  • Исправлено восстановление исходного состояния сцены
  • Обновлены ссылки на проект
  • Обновлены сборочные скрипты под Windows
[v0.37] - 05 Jan 2015
  • Построитель графиков перенесен с OpenGL на QPainter, исправлены найденные ошибки
  • Исправлены ошибки линковки при использовании Qt 5.4 в конфигурации -opengl dynamic
  • В сборочных скриптах под Linux добавлено экранирование переменных
  • Поправлены опции компиляции
[v0.36] - 24 Aug 2014
  • Добавлен антиалиасинг
  • Исправлены баги с освещением
  • Исправлены баги с непрорисовкой моделек из некоторых положений
  • Переписан построитель графиков
  • Исправлена и включена по умолчанию анимация качения шарика
  • Исправлена ошибка в расчетах угловой скорости
  • Скорость эксперимента теперь можно регулировать в реальном времени
  • Добавлен индикатор времени, прошедшего с начала эксперимента
[v0.35] - 20 Aug 2014
  • Исправлен глюк с отображением шрифтов в Windows 98 (сломано в v0.34)
  • Улучшена поддержка системных шрифтов
[v0.34] - 07 Aug 2014
  • Добавлена совместимость с Qt5
  • Форма основного окна теперь одна для всех платформ
  • В основном окне теперь используются системные шрифты, если они поддерживают кириллицу
  • Добавлено управление с клавиатуры графическим виджетом, если он в фокусе
  • Изменен порядок передачи фокуса между элементами управления на адекватный
  • Анимация шарика сделана опциональной
  • В окне лицензии исправлены адреса ссылок, сами ссылки теперь кликабельны
  • Убрано все ненужное из файла проекта
  • Исправлены и доработаны сборочные скрипты
  • MinGW 4.8.x некорректно работал с __attribute__((packed)), заменено на #pragma pack
  • Убраны ненужные подключения <GL/glext.h>
  • Вместо <GL/glu.h> используется платформонезависимый <QtOpenGL>
  • Проект портирован под MSVC (протестировано на MSVC 2005 и MSVC 2013)
  • Исправлены все предупреждения компилятора
  • Исправлены найденные утечки памяти и переполнения
  • Бинарные билды теперь собираются в MSVC 2013 (кроме legacy), появиласть сборка для x64
[v0.33] - 09 Jan 2014
  • Исправлены и оптимизированы сборочные скрипты для Win32
  • В заголовок главного окна добавлена версия программы
[v0.32] - 02 Dec 2013
  • Добавлен обработчик ошибки численного моделирования, которая приводила к зависанию программы в бесконечном цикле
[v0.31] - 02 Dec 2013
  • Исправлена ошибка в анимации качения шарика
[v0.30] - 02 Dec 2013
  • Добавлена анимация качения шарика
  • В случае, когда шар не может преодолеть петлю, теперь указывается причина
[v0.29] - 01 Dec 2013
  • Убран скроллбар в окне с лицензией в Win32 версии
  • Добавлен пункт меню "О Qt"
  • Исправлена подпись окна-заставки
  • Увеличена производительность при отрисовке графиков
  • Увеличена производительность при масштабировании 3D моделей
  • Исправлен баг: при старте программы фактические начальные значения не всегда соответствовали положениям ползунков
  • Текстура желоба заменена на более светлую
[v0.28] - 11 Nov 2013
  • Почти полный рефакторинг кода, исправлено множество багов, движок обновлен до последней версии, используемой в проекте pendulum
Список предыдущих изменений, увы, не сохранился.


Модель

В рамках данного проекта мы моделируем движение шарика с качением без скольжения в «мёртвой петле», образованной прямоугольным желобом.

[image]

Траектория движения центра шарика при прохождении петли

β - угол наклона начального участка

L - длина начального участка петли

R - радиус петли

r - радиус шарика

α - текущий угол, с помощью которого задаём положение шарика

Движение шарика разбивается на четыре основных участка: движение по наклонной части желоба, движение по входному в петлю сектору β, движение в петле и выкатывание шарика по горизонтальному участку желоба.

Поскольку мы имеем дело с качением, для решения задачи нам необходимо составить уравнение динамики вращательного движения твёрдого тела относительно оси вращения.

M=I*dω/dt

Необходимо вычислить момент инерции. Рассмотрим вращение шарика относительно неподвижной оси, совпадающей в данный момент времени с мгновенной осью вращения. Нам известен момент инерции шарика относительно оси, проходящей через центр масс. Поэтому мы можем воспользоваться теоремой Штейнера, если найдём расстояние между осями:

[image]

h=r/sqrt(2)

Поперечное сечение шарика и желоба

Вращение шарика при качении происходит вокруг оси, обозначенной пунктиром.

Воспользуемся теоремой Штейнера.

I=(2/5)*m*r^2+m*h^2

Теперь рассмотрим первый участок движения шарика:

Относительно данной оси в уравнении динамики вращательного движения твёрдого тела ненулевым является только момент силы тяжести.

M_gr=m*g*h*sin(β)

Мы можем вычислить характеристики шарика:

I*ε=M_gr -> ε=M_gr/I

a=ε*h, x=x_0+g*t^2*sin(β)*cos(β)/3.6, y=y_0-g*t^2*sin(β)*sin(β)/3.6, v_x=g*t*sin(β)*cos(β)/1.8, v_y=g*t*sin(β)*sin(β)/1.8, v=sqrt(v_x^2+v_y^2)

На втором участке при расчёте углового ускорения шарика и мгновенного ускорения поступаем аналогично. Движение рассматриваем как движение по окружности (пунктир на рисунке соответствует траектории движения центра шарика).

Угол α изменяется от – β до 2π

x=(R-r*sqrt(2))*sin(α)+(L*cos(β)+R*sin(β)), y=-(R-r*sqrt(2))*cos(α)+R

a=(-5/9)*g*sin(α), ε_tr=a/(R-r*sqrt(2))

Так как α=f(ε(α),ω), найдём α при помощи метода Эйлера. Реализация его алгоритма находится непосредственно в коде.

v=ω*(R-r*sqrt(2))

Третий участок отличается от второго смещением по ещё одной оси координат (необходимо для движения именно по петле, а не по замкнутой окружности).

Движение по последнему участку:

x=L*cos(β)+R*sin(β)+v*t

Случай падения находим, если выполняется:

v^2/(R-r/2)<g*cos(α+π)