Фізична модель Сонячної системи
Ознайомлення з модулями, за допомогою яких реалізується робота розробленого програмного забезпечення. Дослідження та характеристика основних методів класу 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Основні поняття щодо захисту програмного забезпечення. Класифікація засобів дослідження програмного коду: відладчики, дизасемблери, діскомпілятори, трасировщики та слідкуючі системи. Способи вбудовування захисних механізмів в програмне забезпечення.
курсовая работа [41,7 K], добавлен 14.11.2010Виявлення основних сутностей предметної області. Побудова схеми реляційної бази даних. Вбудовані процедури і тригери. Опис архітектури програмної системи і концептуальної моделі бази даних, програмної реалізації та інтерфейсу користувача додатку.
курсовая работа [4,3 M], добавлен 05.12.2012Класифікація системи за всіма видами класифікаторів. Графічне представлення узагальненої моделі системи. Дослідження операцій в системі. Класифікація основних умов функціонування системи за факторами, що впливають на здійснення визначеної операції.
курсовая работа [418,8 K], добавлен 01.06.2013