РГЗ по Информатике. Пояснительная записка к расчетнографической работе Группа авт809 Студент Колпаков А. А
Скачать 1.58 Mb.
|
Новосибирск 2018. НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ Пояснительная записка к расчетно-графической работе Группа: АВТ-809 Студент: Колпаков А.А. Новосибирск 2018. 2 Оглавление ......................................................................... Ошибка! Закладка не определена. 1. Постановка задачи .................................................................................................................3 2. Основная идея ........................................................................................................................3 3. Основные методы и решения ...............................................................................................3 4. Принцип работы ....................................................................................................................4 5. Демонстрация работы и тесты ...........................................................................................12 6. Список литературы ..............................................................................................................16 Новосибирск 2018. 3 1. Постановка задачи Задание: визуализировать движение маятника на пружине, отпущенного под произвольным углом к креплению пружины. Изначально пружина растянута на произвольную длину, а может быть и сжата. Отобразить сжатие/растяжение пружины и приближенное к реальности поведение груза, висящего на ней. 2. Основная идея Для решения данной задачи необходимо было обдумать несколько подзадач: 1. Действие силы притяжения на груз 2. Действие силы сжатия/растяжения на пружину и груз, висящий на ней 3. Влияние коэффициента жесткости пружины на характер движения груза 4. Влияние коэффициента вязкости среды на характер движения груза 5. Определение характера движения груза исходя из описанных выше проблем 3. Основные методы и решения Для решения данной задачи было решено использовать фреймворк «SFML», доступный для языка C++ как достаточно простой в установке и использовании. Решение задачи основывалось на реализациях подзадач, описанных выше. 1. Действие силы притяжения на груз. Для решения данной подзадачи, было решено «разложить один маятник на два отдельных». В данном случае использовался маятник, с якобы жестким креплением (например, палкой). То есть можно отбросить растяжение пружины и сосредоточиться на силе притяжения. Ведь на груз теперь действует только она. 2. Действие силы сжатия/растяжения на пружину и груз, висящий на ней. Для решения данной подзадачи, было решено «разложить один маятник на два отдельных». В данном случае использовался маятник в невесомости, где нет силы притяжения. То есть на груз действует только сила сжатия/растяжения пружины. Соответственно груз либо притягивается к креплению пружиной, либо отталкивается от него ей же. 3. Влияние коэффициента жесткости пружины на характер движения груза. Жесткость пружины влияет на характер движение так: чем жестче пружина, тем быстрее она приходит в состояние покоя. Соответственно если пружина абсолютно жесткая, но растянута, то она моментально сожмется и станет Новосибирск 2018. 4 «каменной». Обратно, если пружина имеет нулевую жесткость, то она никогда не придет в состояние покоя (разумеется, этого не бывает в реальном мире). 4. Влияние коэффициента вязкости среды на характер движения груза. Вязкость среды определяется характером самой среды. Например, у воды коэффициент вязкости один, у воздуха другой. Влияние среды на движение предмета в ней неоспоримо. Соответственно, груз будет двигаться быстрее, если вязкость среды будет меньше. 5. Определение характера движения груза исходя из описанных выше проблем. Для решения данной подзадачи достаточно сложить решения описанных выше проблем. То есть совместить движения математического и пружинного маятника. Либо добавить в маятник с жестким креплением пружину вместо жесткого крепления, либо добавить в маятник без силы притяжения силу притяжения. Данные решения подзадач были мной разработаны и отображены в программе. 4. Принцип работы Для начала работы необходимо установить фреймворк «SFML» с официальной web- страницы разработчиков https://www.sfml-dev.org Затем требуется установить данный фреймворк. Я работал на компьютере от Apple, в установленной на нем среде разработке XCode. Процесс установки «SFML» в XCode описан на том же сайте разработчиков https://www.sfml-dev.org/tutorials/2.5/start-osx.php Для начала работы непосредственно в коде определяются библиотеки для работы: Затем необходимо определить «main». Это главная функция. Все действие будет происходить в ней. Далее следует создать окно для рисования в нем нашего маятника. Здесь мы видим создание окна размером 2800х1800 пикселей и с названием ―SFML window‖. Далее переходим к объявлению всех основных переменных, которые потребуются нам в дальнейшей работе. Новосибирск 2018. 5 Здесь мы видим объявление и задание коэффициента жесткости пружины, коэффициента сопротивления среды, которые влияют на характер движения груза на пружине. Так же, угловой скорости, углового ускорения, что нужны для изменения угла Массы и ускорения свободного падения для физического движения. Длина пружины в состоянии покоя, величина растяжения/сжатия и максимально возможное сжатие. Координаты покоя по X, Y. Угол отклонения Координаты X, Y в данный момент. Энергия (сумма кинетической и потенциальной) и максимальная энергия, которые нужны для отслеживания правильности движения. То есть если максимальная энергия начинает расти, это неправильно. Ускорения по X, Y. Скорости по X, Y. Некоторые вспомогательные переменные. Далее идет создания груза. В данном случае его обозначает круг. Новосибирск 2018. 6 Здесь задается круг радиусом 50 пикселей и центром отсчета координат в центре. Позиция изначально устанавливается в центр окна. Цвет – красный. Далее происходит создание линии, изображающей пружину. Здесь один конец линии находится в центре окна, то есть креплении пружины, а другой прикреплен к центру круга, изображающего груз. Цвет – белый. Устанавливается иконка приложения. Где Icon.png заранее загруженный файл Затем создается текст, который выводится на экран для отслеживания значений. Здесь используется шрифт sensation.ttf предварительно загруженный из интернета. Начальный текст выводит только два значения – положение круга по X и Y. Цвет белый. Следующее действие — это создание часов и времени для отслеживания работоспособности программы. Новосибирск 2018. 7 Далее идет основные действия. Создание основной подпрограммы, называемой game loop. Эта часть – обязательна для каждой программы, написанной на SFML. Все, что написано снаружи game loop выполняется один раз. Так что нужные нам для рисования вычисления будем проводить внутри game loop. Выход из game loop происходит тогда, когда перестает выполняться условие window.isOpen() то есть, когда закроется окно рисования. Так же, внутри game loop происходит обработка событий извне. Например, нажатий клавиш на клавиатуре. В этой части кода можем увидеть обработку нажатия клавиши Escape и последующее закрытие окна для рисования. Следующая строка содержит только время, но она важна для удобства отслеживания работоспособности программы. Далее идут части кода, ответственные непосредственно за вычисления данных, которые необходимы для визуализирования движения маятника. Новосибирск 2018. 8 Данная часть кода содержит вычисления, которые происходят при срабатывании триггера check и когда сжатие пружины максимально. Срабатывание происходит тогда, когда сжатие пружины стало максимальным только что. При этом обнуляются все скорости и ускорения становятся равными силе тяжести. Затем скорости увеличиваются на ускорение, а триггер check становится true, что исключает повторное срабатывание условия до того момента, пока нам это не понадобится. Внутри этого условия есть еще одно вложенное. Оно отвечает за корректность вычисления. Если груз находится ниже центра окна, то длина пружины вычисляется при помощи скорости по Y умноженной на косинус угла. ( ) Если ниже, то при помощи скорости по X умноженной на синус угла. ( ) Затем, идет другое условие. Новосибирск 2018. 9 Оно срабатывает тогда, когда сжатие пружины стало максимальным и продолжает оставаться максимальным какой-то момент времени. То есть на следующий круг после первого условия, где check было false. Здесь проверяется true ли оно. После проверки, если все соответствует условиям, происходит приравнивание ускорений силе тяжести и увеличение скоростей на ускорения. Далее следует вложенное условие, в котором проверяется положение груза по отношению к центру. Если груз находится ниже центра или прямо в центре окна (по Y), то переходим в еще одно вложенное условие, где проверяется начальный угол. Если этот угол меньше либо равен , то проверка на триггер check2. Если он ложен, то скорость по Y увеличивается на 1. Далее, если координата груза по X находится слева от центра, то check2 становится истинным. Если же начальный угол больше , то происходит проверка на check2. Если он ложен, то так же увеличиваем скорость по Y на 1. Затем, если координата по X находится справа от центра окна или прямо по центру, то check2 становится истинным. После этого растяжение пружины изменяется с помощью скорости по Y, косинуса угла и вспомогательной переменной а, которая представляет собой разницу между спокойным состоянием пружины и максимальным сжатием. ( ) Если проверка на положение груза по Y не сработала и он находится выше центра, то растяжение пружины меняется с помощью скорости по X и синуса угла. ( ) Если же максимального сжатия не происходит, то срабатывает else. Новосибирск 2018. 10 Здесь мы можем увидеть основные формулы для движения маятника. Все происходит из-за приравинивания ускорений по X и Y формулам: ( ) ( ) Далее происхдит изменение растяжени/сжатия пружины по описанной ранне формуле с косинусом угла. ( ) Затем увеличиваем скорости по X, Y на ускорения по X, Y. И в конце ставим триггер check в положение false, что означает, что максимального сжатия в данный момент не происходит. После данного блока условий следует важный блок изменения углового ускорения, угловой скорости и угла. Здесь можно увидеть важную формулу изменения углового ускорения. ( ) Далее идет изменение угла на угловую скорость и увеличение на угловое ускорение. После всего этого идет само изменение координат груза. Эта часть состоит из изменения X и Y. ( ) ( ) ( ) ( ) Новосибирск 2018. 11 Затем происходят вычисления, необходимые для отслеживания правильного выполнения программы. Происходит вычисление энергии, которая состоит из потенциальной и кинетической энергии пружинного маятника и потенциальной и кинетической энергии математического маятника. ( ) ( ) ( ) Затем полученная энергия сравнивается с максимальной и если она больше, то максимальная изменяется на текущую. После вычисления энергии переходим к передаче координат грузу и пружине, то есть кругу и линии. Здесь с помощью метода setPosition мы устанавливаем у объекта circle ранее найденные координаты X, Y. После этого передаем координаты circle одному из концов линии line. Следующее действие – передача данных объекту text для вывода этих данных на экран, что помогает нам отслеживать работоспособность программы. В объект передаются значения: X, Y для отслеживания координат Скорости по X, Y для понимания характера передвижения груза Ускорения по X, Y для отображения характера изменения скорости Угловое ускорение и угловая скорость для отслеживания изменения угла Новосибирск 2018. 12 Энергия и максимальная энеригия для отслеживания правильности происходящих процессов Растяжение/сжатие пружины для отслеживания характера движения Угол для отслеживания изменения угла Время для отслеживания выполнения программы Далее «выход на финишную прямую». Очистка окна и передача в него новых объектов. С помощью метода clear() очищается окно для рисования. Методом draw() передаются объекты line, circle, text. И последний компонент программы состоит из одного элемента. Обновления окна, для отображения в нем переданных объектов. 5. Демонстрация работы и тесты Ниже будут представлены некоторые изображения, показывающие работу программы действии при разных значениях. При R = 500 и =29 /30 При R = 0 =29 /30 Новосибирск 2018. 13 При R = -100 =29 /30 При R = 500 и =15 /30 При R = 500 и =0 Новосибирск 2018. 14 Тесты на правильность движения можно провести путем сравнения графиков движения. На графиках горизонатльная ось отображает время t, а вертикальная требуемое значение. Графики для произвольного (t) и R(t) В данном случае R = 500, = 29 /30 График для (t) График для R(t) Новосибирск 2018. 15 Графики для абсолютно жесткой пружины R при достижении 0 дальше не изменяется. =29 /30. Графики для =0 R=500; Так как = 0, график отражает движение пружинного маятника. Графики для = и R = 500. График для R(t) График для (t) График для R(t) Новосибирск 2018. 16 Как можно увидеть графики изменения отображают затухающее движение, что означает наличие в системе сил, мешающих движению. Графики изменения R так же отображают затухание, что свидетельствует о затуханиях колебания пружины. Соответственно, сравнив графики мы пришли к выводу, что код написан правильно и движения заданы верно. 6. Список литературы 1. К. Магнус «Колебания» [ http://www.newlibrary.ru/book/magnus_k_/kolebanija.html ] 2. https://physics.ru/courses/op25part1/content/chapter2/section/paragraph2/theory.ht ml#.XBUFlS1ePRZ 3. http://www.eduspb.com/node/1783 4. http://fizmat.by/kursy/kolebanija_volny/majatniki 5. https://physics.ru/courses/op25part1/content/chapter2/section/paragraph3/theory.ht ml#.XBUGMS1ePRY График для R(t) График для (t) |