Фізична модель Сонячної системи
Ознайомлення з модулями, за допомогою яких реалізується робота розробленого програмного забезпечення. Дослідження та характеристика основних методів класу main window. Розгляд опису та особливостей інтерфейсу користувача моделі Сонячної системи.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | украинский |
Дата добавления | 10.07.2017 |
Размер файла | 192,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Міністерство освіти і науки України
Чернівецький національний університет імені Юрія Федьковича
Програмного забезпечення комп`ютерних систем
Контрольна робота з об'єктно-орієнтованого програмування
На тему: «Фізична модель Сонячної системи»
Виконав: студент (ка) 1 курсу, групи 143
спеціальності 6.121 Інженерія програмного забезпечення
Циганович О. В.
Керівник: Миронів І. В.
Нороконтролер Комісарчук В. В.
Чернівці-2017
Реферат
У проекті розроблено програму для моделювання фізичної динаміки Сонячної системи. Програма призначена для персональних комп`ютерів.
Базис програми розрахований на новачка: доступ у користувача є до обмеженої кількості функцій, що робить розробку простою у сприйнятті.
Область застосування - програмне забезпечення для персональних комп'ютерів.
Програма реалізована на мові С++, у середовищі Qt 4.8.
Дана розробка у майбутньому може бути розширена із добавленням нового функціоналу і видозміненою логікою обробки.
Операційна система, фізична модель, персональні комп'ютери, QT 4.8, С++.
Специфікація проекту
Загальні вимоги до програми
Вимоги до інтерфейсу користувача:
1. Робоча мова - українська, додаткова - англійська.
2. Вибір режиму швидкості шляхом регулювання.
3. Вибір режиму роботи таймера.
Вимоги до функціональності додатка:
1. Початок програми із заздалегідь заданим функцоналом, постійним для кожного запуску.
2. Створення функції руху, обмуволення її для різних типів тіл.
3. Наявність конкретно визначених об`єктів, пов`язаних конкретно визначеними функціями.
Призначення та область застосування
Мета проекту - розроблення функціональної моделі Сонячної Системи для ОС Windows.
Призначення полягає у інтерактивному моделюванні фізичних процесів для кращого їх сприйняття, розважанні користувача тощо.
Область застосування - комп`ютери під ОС Windows, версії XP та пізніших.
Функціональні вимоги
1. Програмне забезпечення мусить забезпечувати роботу користувача у всіх доступних режимах, описаних вище.
Опис структури програми (модулі програми)
Робота розробленого програмного забезпечення реалізується наступними модулями:
• Main - основний клас проекту;
• MainWindow - клас, в якому реалізовано створення інтерфейсу програми;
• Body - клас, у якому реалізовано опис небесних тіл;
1. Алгоритми роботи програми
Рис. 1 - Узагальнена схема роботи програми
Рис.2 - Деталізована схема роботи програми
2. Опис методів програми
Таблиця 1 - Основні методи класу MainWindow
№ |
Метод |
Короткий опис |
|
1 |
paintEvent() |
Створює графічний інтерфейс з усіма похідними |
|
2 |
timerStop() |
Зупиняє/продовжує роботу таймера. |
|
3 |
physics() |
Змінює координати тіл залежно від швидкості |
|
4 |
forcePlus() |
Збільшує значення кількості ітерацій за секунду(прискорення сцени) |
|
5 |
forceMinus() |
Зменшує значення кількості ітерацій за секунду(сповільнення сцени) |
Таблиця 2 - Основні методи класу TBody
№ |
Метод |
Короткий опис |
|
1 |
calculateSpeed() |
Підраховує швидкість небесного тіла під час кожної ітерації. |
3. Програмні засоби
Програма була розроблена на мові С++, що забезпечує її швидкодійність на низьку ресурсозатратність.
Як низькорівнева мова, С++ забезпечує прямий доступ до жорсткого диску і знімає багато обмежень, що робить її використання більш гнучким та ефективним.
Cередовищe Qt 4.8, засобами якого булла реалізована програма, є багатофункціональним, а тому - зручним.
Опис інтерфейсу користувача
До складових частин користувацького інтерфейсу, окрім графічного вікна, входять спеціальні функції, реалізовані методом сигналів та слотів.
На момент запуску програми перед користувачем три клавіші: «+», «-» та «Stop». програмний інтерфейс сонячний
Перші дві відповідають за регулювання швидкості, остання - таймера.
Рис. 3 - Головне вікно програми
Наряду з функціональнами елементами у інтерфейсі присутні і інформативні.
Це строки у лівому верхньому на нижньому кутках. У першій міститься число кадрів на секунду, що дозволяє оцінити швидкодію програми, а другій - стан швидкості для регуляції.
Висновки
Працюючи над даним проектом я поглибив власні знання у області техніки та логіки написання коду, отримав досвід роботи у середовищі Qt. Досягнення позитивного результату стало можливим завдяки освоєнню основ алгоритмізації і роботи з ПЗ загалом.
Інтегруючи різноаспектні знання, я вирішив поставлену переді мною задачу - побудувати модель Сонячної системи.
Завдяки роботі над програмою я освоїв нові методи, ідеї та принципи роботи з алгоритмами.
Список використаних джерел
1. Страуструп Б. Язык программирования С++[Текст] / В. А. Липатьев. - М. : ИНФРА-М, 2007. - 369 с.
2. https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application/ru
3. http://doc.qt.io/qt-4.8/timers.html
4. https://forum.qt.io/topic/23441/solved-adding-image-to-a-layout
Додаток
// Body.h
#ifndef BODY_H
#define BODY_H
#include<QPointF>
#include<QVector>
class Body
{
public:
Body(float size, float mass, short type, QPointF position, QPointF speed, bool physics, Body *parent = NULL);
float size;
float mass;
short type;
QPointF position;
QPointF speed;
bool physics;
Body *parent;
QVector<QPointF> trace;
void calculateSpeed(QList<Body *> bodies, float gConstant, float deltaTime);
};
#endif // BODY_H
// Body.cpp
#include "body.h"
#include <QDebug>
Body::Body(float size, float mass, short type, QPointF position, QPointF speed, bool physics, Body *parent) {
this->size = size;
this->mass = mass;
this->type = type;
this->position = position;
this->speed = speed;
this->physics = physics;
this->parent = parent;
}
void Body::calculateSpeed(QList<Body *> bodies, float gConstant, float deltaTime) {
QPointF forceVector;
if (this->parent == NULL) {
for (int j = 0; j < bodies.count(); j++) {
Body *secondBody = bodies[j];
if (secondBody != this && secondBody->parent == NULL) {
float dist = sqrt(pow(this->position.x() - secondBody->position.x(), 2) + pow(this->position.y() - secondBody->position.y(), 2));
float force = gConstant * secondBody->mass * this->mass / pow(dist * 1000000000, 2);
force /= this->mass;
float angle = atan2(this->position.y() - secondBody->position.y(), this->position.x() - secondBody->position.x());
forceVector -= QPointF(cos(angle) * force, sin(angle) * force);
}
}
} else {
if (parent->physics) {
this->position += parent->speed;
}
float dist = sqrt(pow(this->position.x() - parent->position.x(), 2) + pow(this->position.y() - parent->position.y(), 2));
float force = gConstant * parent->mass * this->mass / pow(dist * 1000000000, 2);
force /= this->mass;
float angle = atan2(this->position.y() - parent->position.y(), this->position.x() - parent->position.x());
forceVector -= QPointF(cos(angle) * force, sin(angle) * force);
}
this->speed += forceVector / deltaTime;
}
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "body.h"
#include <QPushButton>
#include <QWidget>
#include "newwindow.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void paintEvent(QPaintEvent *) override;
private:
Ui::MainWindow *ui;
QList<Body *> bodies;
private slots:
void physics();
void timerStop();
void forcePlus();
void forceMinus();
};
#endif // MAINWINDOW_H
// MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QTimer>
#include <QDebug>
#include <QTime>
// Константні масси
const float sunMass = 1.989 * pow(10, 30);
const float earthMass = 2.122 * pow(10, 30);
const float moonMass = 7.34 * pow(10, 22);
const float marsMass = 1.877 * pow(10, 30);
const float phobosMass = 1.072 * pow(10, 16);
const float deimosMass = 1.48 * pow(10, 15);
const float venusMass = 4.867 * pow(10, 24);
const float mercuryMass = 3.285 * pow(10, 23);
// Гравітація
const float gConstant = 6.67408 * pow(10, -11);
float forceMod = 1;
bool a = false;
int times = 0;
int brand = 1/forceMod;
// Циклічні змінні
QTimer *timer = new QTimer();
unsigned short frameDelay = 15;
// ФПС
QTime t;
float deltaTime = frameDelay;
// Зображення
QList<QImage> pictures;
void MainWindow::paintEvent(QPaintEvent *) {
QPainter p;
p.begin(this);
p.fillRect(QRect(0, 0, ui->centralWidget->width(), ui->centralWidget->height()), Qt::black);
for (int i = 0; i < bodies.count(); i++) {
for (int j = 0; j < bodies[i]->trace.count() - 1; j++) {
p.setPen(QColor(j,j,j));
p.drawLine(bodies[i]->trace[j], bodies[i]->trace[j + 1]);
}
}
for (int i = 0; i < bodies.count(); i++) {
Body *currentBody = bodies[i];
QImage temp = pictures[currentBody->type].scaled(QSize(pictures[currentBody->type].width()*currentBody->size, pictures[currentBody->type].height()*currentBody->size));
p.drawImage(QPoint(currentBody->position.x() - temp.width() / 2,
currentBody->position.y() - temp.height() / 2), temp);
}
p.setPen(Qt::gray);
p.drawText(QPoint(0, 10), QString(QString::number(int(1000 / deltaTime))+" fps"));
p.drawText(QPoint(0, ui->centralWidget->height() - 1), QString(QString::number(forceMod)+"x"));
p.end();
}
void MainWindow::physics() {
if (forceMod<1) {
if (times%brand==0) {
times = 0;
for (int i = 0; i < bodies.count(); i++) {
if (bodies[i]->physics) {
bodies[i]->calculateSpeed(bodies, gConstant, deltaTime);
}
}
for (int i = 0; i < bodies.count(); i++) {
bodies[i]->trace.append(bodies[i]->position);
if (bodies[i]->trace.count() > 255) {
bodies[i]->trace.removeFirst();
}
if (bodies[i]->physics) {
bodies[i]->position += bodies[i]->speed;
}
}
}
times++;
deltaTime = t.elapsed();
t.restart();
}
else {
for (int i = 0; i < forceMod; i++) {
for (int i = 0; i < bodies.count(); i++) {
if (bodies[i]->physics) {
bodies[i]->calculateSpeed(bodies, gConstant, deltaTime);
}
}
for (int i = 0; i < bodies.count(); i++) {
bodies[i]->trace.append(bodies[i]->position);
if (bodies[i]->trace.count() > 255) {
bodies[i]->trace.removeFirst();
}
if (bodies[i]->physics) {
bodies[i]->position += bodies[i]->speed;
}
}
deltaTime = t.elapsed();
}
t.restart();
}
update();
}
void MainWindow::timerStop () {
if(a)
{
a = false;
timer->start();
ui->pushButton->setText("Stop");
}
else
{
a = true;
timer->stop();
ui->pushButton->setText("Start");
}
}
void MainWindow::forcePlus () {
if (forceMod>=0.9) {
forceMod++;
}
else
{
forceMod *= 10;
brand = 1/forceMod;
}
times = 0;
}
void MainWindow::forceMinus () {
times = 0;
if (forceMod>1) {
forceMod--;
}
else
{
forceMod /= 10;
brand = 1/forceMod;
}
}
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
connect(ui->pushButton, SIGNAL (released()), this, SLOT (timerStop()));
connect(ui->pushButton_2, SIGNAL (released()), this, SLOT (forceMinus()));
connect(ui->pushButton_3, SIGNAL (released()), this, SLOT (forcePlus()));
pictures.append(QImage(":/type0.png"));
pictures.append(QImage(":/type1.png"));
pictures.append(QImage(":/type2.png"));
pictures.append(QImage(":/type3.png"));
pictures.append(QImage(":/type4.png"));
pictures.append(QImage(":/type5.png"));
pictures.append(QImage(":/type6.png"));
pictures.append(QImage(":/type7.png"));
Body *newBody = new Body(3, sunMass, 0, QPointF(450, 300), QPointF(0, 0), false);
bodies.append(newBody);
newBody = new Body(1, earthMass, 1, QPointF(300, 300), QPointF(0, -0.25), true);
bodies.append(newBody);
newBody = new Body(1, moonMass, 2, QPointF(270, 300), QPointF(0, -0.55), true, bodies[1]);
bodies.append(newBody);
newBody = new Body(0.5, mercuryMass, 3, QPointF(393, 300), QPointF(0, -0.39), true, bodies[0]);
bodies.append(newBody);
newBody = new Body(0.8, venusMass, 4, QPointF(342, 300), QPointF(0, -0.28), true, bodies[0]);
bodies.append(newBody);
newBody = new Body(0.9, marsMass, 5, QPointF(223, 300), QPointF(0, -0.2), true, bodies[0]);
bodies.append(newBody);
newBody = new Body(0.2, deimosMass, 6, QPointF(210, 300), QPointF(0, -0.85), true, bodies[5]);
bodies.append(newBody);
newBody = new Body(0.4, phobosMass, 7, QPointF(205, 300), QPointF(0, -0.7), true, bodies[5]);
bodies.append(newBody);
// Підключення головного таймера до функції
connect(timer, QTimer::timeout, this, physics);
timer->start(frameDelay);
t.start();
}
MainWindow::~MainWindow() {
delete ui;
}
// Main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Размещено на Allbest.ru
...Подобные документы
Особливості Сонячної системи та космічних тіл в її межах. Роль площини земної орбіти — екліптики. Опис програми, яка демонструє приблизний рух планет. Блок-схеми алгоритмів та структури програми. Опис процедур та обробників. Інструкція користувача.
курсовая работа [756,6 K], добавлен 17.03.2014Опис основних етапів розробки архітектури програмної системи: структурування системи, моделювання управління, декомпозиція підсистем. Ознайомлення із кроками створення інтерфейсу користувачів як однієї із фаз проектування програмного забезпечення.
реферат [20,7 K], добавлен 24.11.2010Підстава для створення системи Компас-3D. Характеристика розробленого програмного забезпечення. Призначення і характеристики систем автоматизації конструкторської документації. Дослідження методів створення динамічних бібліотек в середовищі Delphi.
дипломная работа [3,3 M], добавлен 22.10.2012Етапи розробки проекту. Вимоги до апаратного і програмного забезпечення, до користувача. Специфікація та структура даних, які мають бути розміщеними в системі. Вигляд інтерфейсу системи програмного забезпечення. Розробка бази даних косметичного салону.
дипломная работа [1,8 M], добавлен 21.02.2015Ознайомлення із загальною структурою системи автоматичного розпізнавання мовлення. Визначення особливостей нейронних мереж. Дослідження та характеристика процесу побудови системи розпізнавання мовлення. Вивчення специфіки прихованої моделі Маркова.
дипломная работа [1,1 M], добавлен 25.07.2022Вибір основної моделі задачі інформаційної підтримки автопаркінгів. Специфікація системи інформаційного обслуговування автопаркінгу. Здійснення замовлень в системі. Перевірка замовлених місць на парковці. Проектування інтерфейсу системи та бази даних.
дипломная работа [2,2 M], добавлен 21.06.2014Оптимізація розташування посилань на інформаційні ресурсах у мережевих пошукових системах за допомогою спеціальних вірно обраних ключових слів. Розробка програмного забезпечення SEO-системи для тестування і читання RSS каналів відвідувачами сайту.
дипломная работа [2,3 M], добавлен 14.06.2013Виявлення основних сутностей предметної області. Побудова схеми реляційної бази даних. Вбудовані процедури і тригери. Опис архітектури програмної системи і концептуальної моделі бази даних, програмної реалізації та інтерфейсу користувача додатку.
курсовая работа [4,3 M], добавлен 05.12.2012Основні поняття щодо захисту програмного забезпечення. Класифікація засобів дослідження програмного коду: відладчики, дизасемблери, діскомпілятори, трасировщики та слідкуючі системи. Способи вбудовування захисних механізмів в програмне забезпечення.
курсовая работа [41,7 K], добавлен 14.11.2010Класифікація системи за всіма видами класифікаторів. Графічне представлення узагальненої моделі системи. Дослідження операцій в системі. Класифікація основних умов функціонування системи за факторами, що впливають на здійснення визначеної операції.
курсовая работа [418,8 K], добавлен 01.06.2013Забезпечення захисту інформації. Аналіз системи інформаційної безпеки ТОВ "Ясенсвіт", розробка моделі системи. Запобігання витоку, розкраданню, спотворенню, підробці інформації. Дослідження та оцінка ефективності системи інформаційної безпеки організації.
курсовая работа [1,6 M], добавлен 27.04.2014Тривимірна модель мобільного робота. Алгоритмізація моделі та її програмної реалізації з використанням бібліотек MFC та OpenGL. Розробка програмного забезпечення. Середовище розробки проекту Microsoft Visual Studio 2010. Керування рухами маніпулятора.
курсовая работа [462,9 K], добавлен 03.04.2014Функціональна та забезпечувальна частини комп'ютерної інформаційної системи підприємства. Ознайомлення з програмою автоматизації бухгалтерського обліку "1С: Підприємство 7.7" за допомогою ділової гри. Налагодження настройок, робота в режимі користувача.
курсовая работа [46,3 K], добавлен 13.05.2011Вибір методів та засобів створення інформаційної системи для обліку і перегляду продукції на складі. Розробка моделі даних для реляційної бази даних, прикладного програмного забезпечення. Тестування програмного додатку, виявлення можливих проблем.
курсовая работа [1,1 M], добавлен 22.09.2015Формалізована схема системи масового обслуговування. Обгрунтування вибору UML-діаграм для ілюстрації функціонування системи масового обслуговування. Функційна модель, призначена для відображення основних зв’язків між елементами та компонентами системи.
курсовая работа [343,6 K], добавлен 15.10.2014Класифікація інформаційних систем. Дослідження особливостей мови UML як засобу моделювання інформаційних систем. Розробка концептуальної моделі інформаційної системи поліклініки з використанням середи редактора програмування IBM Rational Rose 2003.
дипломная работа [930,4 K], добавлен 26.10.2012Аналіз сучасних методів тестування та практичних особливостей проведення тестового контролю. Основи побудови інформаційно-математичної моделі. Алгоритм запису інформації в таблицю бази даних. Характеристика та шляхи розробки інтерфейсу редактора тестів.
курсовая работа [1,7 M], добавлен 08.10.2010Побудова моделі процесів системи. Відображення користувачів і їхніх функцій, підметів автоматизації в прив'язці до структури системи. Відображення структури інформаційних та фізичних об'єктів системи та їх взаємозв’язків. Побудова моделі станів системи.
курсовая работа [125,2 K], добавлен 03.10.2008Характеристика основних методів сучасного викладання фізики. Моделювання як процес дослідження об’єктів пізнання за допомогою їх моделей. Розгляд особливостей використання табличного процесора EXCEL для обробки результатів лабораторних робіт з фізики.
лабораторная работа [1,6 M], добавлен 22.12.2012Огляд існуючих програмних продуктів. Проходження процедури реєстрації. Побудова та опис логічної моделі. Розробка основних форм інтерфейсу користувача. Тестування методом чорної скриньки. Інсталяція серверної частини системи та клієнтських програм.
курсовая работа [1,8 M], добавлен 03.06.2021