Дослідження геометричної фігури SFML C++

Оволодіння засобами створення класу на прикладі побудови геометричної фігури. Розробка класу "Фігура" з можливостями переміщення та масштабування. Побудова геометричної фігури за допомогою базового відрізка, який вираховується з висоти вікна програми.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык украинский
Дата добавления 13.02.2020
Размер файла 17,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Лабораторна робота

Тема: Геометрична фігура

Мета: Оволодіти засобами створення класу на прикладі побудови геометричної фігури

Завдання: Розробити клас «Фігура» з можливостями переміщення, обертання та масштабування. Використати графічну бібліотеку.

Короткі теоретичні відомості:

Графічна бібліотека - це набір функцій, які утворюють інтерфейс між прикладною програмою (або мовою програмування, за допомогою якого розробляється програма) і графічною системою. Цей інтерфейс називають програмним інтерфейсом додатку комп'ютерної графіки що займається розробкою прикладної програми, існує тільки API, і програміст позбавлений, таким чином, від необхідності вникати в подробиці роботи апаратури та програмної реалізації функцій графічної бібліотеки.

Опис створення класу:

Клас «Figure» описує геометричні тіла, які у згрупованому вигляді складають геометричну фігуру. Геометрична фігура будується за допомогою базового відрізка, який при запуску програми вираховується з висоти вікна програми (базовий відрізок = висота вікна програми / 6). Базовий відрізок є складовою частиною усіх геометричних тіл, які складають собою геометричну фігуру. Тому, при зміні довжини базового відрізка усі геометричні тіла фігури змінюються пропорційно.

Фігура може обертатися навколо своєї вісі(у напрямку за ,або проти годинникової стрілки), масштабуватися, переміщуватися у просторі, відображати себе за допомогою графічної бібліотеки.

Class Figure

Figure.h

#ifndef FIGURE_H

#define FIGURE_H

using namespace sf;

class Figure {

public:

Figure(RenderWindow &window, int WINDOW_HEIGHT, int WINDOW_WIDTH);

void drawFigure();

// установить паузу или направления движения фигуры (по/против часовой стрелкой) геометричний фігура програма масштабування

void setMovementDirectionStatusStop();

void setMovementDirectionStatusrRunRight();

void setMovementDirectionStatusrRunLeft();

// масштабирование фигуры

void setBiggerBaseLineLength();

void setLessBaseLineLength();

// перемещение фигуры в пространстве

void moveFigureUp();

void moveFigureDown();

void moveFigureRight();

void moveFigureLeft();

private:

RenderWindow &window;

int a; // начальная длина базового отрезка

int CENTER_X; // центр фигуры по Х

int CENTER_Y; // центр фигуры по Y

float thickness = 3; // толщина линий

int angle = 0;

int movementDirectionStatus = 1; // 1-по часовой, 0-пауза, -1-против часовой

int figureRadius = 2*a + a; // радиус всей фигуры

void calculatePosition();

bool isCollision(); // true если фигура соприкасается с краем окна

///////SHAPES

CircleShape circle;

RectangleShape crossLine_1;

RectangleShape crossLine_2;

RectangleShape line_1;

CircleShape shape_1;

CircleShape ellipse_1;

RectangleShape line_2;

CircleShape shape_2;

CircleShape ellipse_2;

RectangleShape line_3;

CircleShape shape_3;

CircleShape ellipse_3;

RectangleShape line_4;

CircleShape shape_4;

CircleShape ellipse_4;

////////////

};

#endif // FIGURE_H

Class Figure

Figure.cpp

#include <SFML/Graphics.hpp>

#include <iostream>

#include <cmath>

#include <unistd.h>

#include "Figure.h"

Figure::Figure(RenderWindow &window, int WINDOW_HEIGHT,

int WINDOW_WIDTH) :

window(window), CENTER_X(WINDOW_HEIGHT/2),

CENTER_Y(WINDOW_WIDTH/2), a(WINDOW_HEIGHT/6){}

void Figure::calculatePosition() {

if(movementDirectionStatus == -1) { angle--;}

else if (movementDirectionStatus == 0) {}

else if (movementDirectionStatus == 1) {angle++;}

// координаты точек с которых начинается отрисовка ромбов

int shape_1_x = 0;

int shape_1_y = 0;

int shape_2_x = 0;

int shape_2_y = 0;

int shape_3_x = 0;

int shape_3_y = 0;

int shape_4_x = 0;

int shape_4_y = 0;

// центральный круг

circle.setRadius(a);

circle.setOrigin(a,a);

circle.setPosition(CENTER_X,CENTER_Y);

circle.setFillColor(sf::Color::Transparent);

circle.setOutlineThickness(thickness);

circle.setRotation(angle);

crossLine_1.setSize(sf::Vector2f(a*3.33 , thickness));

crossLine_1.setOrigin((a*3.33)/2, 2);

crossLine_1.setPosition(CENTER_X, CENTER_Y);

crossLine_1.setRotation(angle+45);

crossLine_2.setSize(sf::Vector2f(a*3.33 , thickness));

crossLine_2.setOrigin((a*3.33)/2, 2);

crossLine_2.setPosition(CENTER_X, CENTER_Y);

crossLine_2.setRotation(angle+45+90);

line_1.setSize(Vector2f(2*a , thickness));

line_1.setOrigin(0,0);

line_1.setPosition(CENTER_X, CENTER_Y);

line_1.setRotation(angle);

shape_1.setRadius(a/2.5);

shape_1.setPointCount(4);

shape_1.setOrigin(0,(a/2.5));

shape_1.setFillColor(sf::Color::Transparent);

shape_1.setOutlineThickness(thickness);

shape_1_x = CENTER_X + ((2*a) * cos(angle * M_PI / 180));

shape_1_y = CENTER_Y + ((2*a) * sin(angle * M_PI / 180));

shape_1.setPosition(shape_1_x, shape_1_y );

shape_1.setRotation(angle);

ellipse_1.setRadius(a/2.5);

ellipse_1.setPointCount(100);

ellipse_1.setOrigin(-3,a/2.5);

ellipse_1.setPosition(CENTER_X,CENTER_Y);

ellipse_1.setFillColor(sf::Color::Transparent);

ellipse_1.setOutlineThickness(thickness);

ellipse_1.setRotation(angle+45);

ellipse_1.setScale(2, 0.6);

line_2.setSize(Vector2f(2*a,thickness));

line_2.setOrigin(0,1);

line_2.setPosition(CENTER_X, CENTER_Y);

line_2.setRotation(angle+90);

shape_2.setRadius(a/2.5);

shape_2.setPointCount(4);

shape_2.setOrigin(0,(a/2.5));

shape_2.setFillColor(sf::Color::Transparent);

shape_2.setOutlineThickness(thickness);

shape_2_x = CENTER_X + ((2*a) * cos((angle+90) * M_PI / 180)) shape_2_y = CENTER_Y + ((2*a) * sin((angle+90) * M_PI / 180));

shape_2.setPosition(shape_2_x, shape_2_y );

shape_2.setRotation(angle+90);

ellipse_2.setRadius(a/2.5);

ellipse_2.setPointCount(100);

ellipse_2.setOrigin(-3,a/2.5);

ellipse_2.setPosition(CENTER_X,CENTER_Y);

ellipse_2.setFillColor(sf::Color::Transparent);

ellipse_2.setOutlineThickness(thickness);

ellipse_2.setRotation(angle+45+90);

ellipse_2.setScale(2, 0.6);

line_3.setSize(sf::Vector2f(2*a,thickness));

line_3.setOrigin(0,1);

line_3.setPosition(CENTER_X, CENTER_Y);

line_3.setRotation(angle+90+90);

shape_3.setRadius(a/2.5);

shape_3.setPointCount(4);

shape_3.setFillColor(sf::Color::Transparent);

shape_3.setOrigin(0,(a/2.5));

shape_3.setOutlineThickness(thickness); shape_3_x = CENTER_X + ((2*a) * cos((angle+90+90) * M_PI / 180));

shape_3_y = CENTER_Y + ((2*a) * sin((angle+90+90) * M_PI / 180));

shape_3.setPosition(shape_3_x, shape_3_y );

shape_3.setRotation(angle+90+90);

ellipse_3.setRadius(a/2.5);

ellipse_3.setPointCount(100);

ellipse_3.setOrigin(-3,a/2.5);

ellipse_3.setPosition(CENTER_X,CENTER_Y);

ellipse_3.setFillColor(sf::Color::Transparent);

ellipse_3.setOutlineThickness(thickness);

ellipse_3.setRotation(angle+45+90+90);

ellipse_3.setScale(2, 0.6);

line_4.setSize(Vector2f(2*a,thickness));

line_4.setOrigin(0,0);

line_4.setPosition(CENTER_X, CENTER_Y);

line_4.setRotation(angle+90+90+90);

shape_4.setRadius(a/2.5);

shape_4.setPointCount(4);

shape_4.setOrigin(0,(a/2.5));

shape_4.setFillColor(sf::Color::Transparent);

shape_4.setOutlineThickness(thickness); shape_4_x = CENTER_X + ((2*a) * cos((angle+90+90+90) * M_PI / 180));

shape_4_y = CENTER_Y + ((2*a) * sin((angle+90+90+90) * M_PI / 180));

shape_4.setPosition(shape_4_x, shape_4_y );

shape_4.setRotation(angle+90+90+90);

ellipse_4.setRadius(a/2.5);

ellipse_4.setPointCount(100);

ellipse_4.setOrigin(-3,a/2.5);

ellipse_4.setPosition(CENTER_X,CENTER_Y);

ellipse_4.setFillColor(sf::Color::Transparent);

ellipse_4.setOutlineThickness(thickness);

ellipse_4.setRotation(angle+45+90+90+90);

ellipse_4.setScale(2, 0.6);

}

void Figure::drawFigure() {

calculatePosition();

window.clear();

window.draw(circle);

window.draw(crossLine_1);

window.draw(crossLine_2);

window.draw(line_1);

window.draw(shape_1);

window.draw(ellipse_1);

window.draw(line_2);

window.draw(shape_2);

window.draw(ellipse_2);

window.draw(line_3);

window.draw(shape_3);

window.draw(ellipse_3);

window.draw(line_4);

window.draw(shape_4);

window.draw(ellipse_4);

window.display();

usleep(10000);

}

void Figure::setMovementDirectionStatusStop() {

movementDirectionStatus = 0;

}

void Figure::setMovementDirectionStatusrRunRight() {

movementDirectionStatus = 1;

}

void Figure::setMovementDirectionStatusrRunLeft() {

movementDirectionStatus = -1;

}

bool Figure::isCollision() {

int windowHeight = window.getSize().y;

int windowWidth = window.getSize().x;

if( (CENTER_X+figureRadius < windowWidth) &&

(CENTER_X-figureRadius > 0) &&

(CENTER_Y+figureRadius < windowHeight)&&

(CENTER_Y-figureRadius > 0) )

return false;

else return true;

}

void Figure::setBiggerBaseLineLength() {

if (!isCollision()) {

a += 1;

figureRadius=2*a + a;

}

}

void Figure::setLessBaseLineLength() {

if (a > 1) {

a -= 1;

figureRadius=2*a + a;

}

}

void Figure::moveFigureUp() {

if (CENTER_Y - figureRadius > 0)

CENTER_Y -= 5;

}

void Figure::moveFigureDown(){

if(CENTER_Y+figureRadius<window.getSize().y)

CENTER_Y += 5;

}

void Figure::moveFigureRight(){

if(CENTER_X+figureRadius<window.getSize().x)

CENTER_X += 5 ;

}

void Figure::moveFigureLeft(){

if (CENTER_X-figureRadius > 0)

CENTER_X -= 5;

}

main.cpp

#include <SFML/Graphics.hpp>

#include "Figure.h"

int main() {

int WINDOW_WIDTH = 600;

int WINDOW_HEIGHT = 600;

sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "GEOMETRIJA");

Figure figure(window, WINDOW_HEIGHT, WINDOW_WIDTH);

while (window.isOpen()) {

sf::Event event;

while (window.pollEvent(event)) {

if (event.type == sf::Event::Closed)

window.close();

}

// пауза и направления движения фигуры (по/против часовой стрелкой)

if (Keyboard::isKeyPressed(Keyboard::Space)) { figure.setMovementDirectionStatusStop();}

if (Keyboard::isKeyPressed(Keyboard::Right)) { figure.setMovementDirectionStatusrRunRight();}

if (Keyboard::isKeyPressed(Keyboard::Left)) { figure.setMovementDirectionStatusrRunLeft();}

// масштабирование фигуры

if (Keyboard::isKeyPressed(Keyboard::Up)) { figure.setBiggerBaseLineLength();}

if (Keyboard::isKeyPressed(Keyboard::Down)) { figure.setLessBaseLineLength();}

// перемещение фигуры в пространстве

if (Keyboard::isKeyPressed(Keyboard::W)) { figure.moveFigureUp();}

if (Keyboard::isKeyPressed(Keyboard::S)) { figure.moveFigureDown();}

if (Keyboard::isKeyPressed(Keyboard::D)) { figure.moveFigureRight();}

if (Keyboard::isKeyPressed(Keyboard::A)) { figure.moveFigureLeft();}

// update the view to the new size of the window

if (event.type == sf::Event::Resized) {

sf::FloatRect visibleArea(0, 0, event.size.width, event.size.height);

window.setView(sf::View(visibleArea));

}

figure.drawFigure();

}

return 0;

}

Размещено на Allbest.ru

...

Подобные документы

  • Знаходження площі фігури методом трапеції. Обчислення площ криволінійних трапецій. Геометричний сенс чисельника. Розробка програми для демонстрації нижчезазначеної математичної функції. Використання базових бібліотек класів, написаних на мові С++.

    курсовая работа [1,0 M], добавлен 24.12.2013

  • Загальний опис гри "Тетріс", огляд основних об’єктів та клавіш управління грою. Розробка інтерфейсу користувача та основних модулів. Алгоритм ігрового поля, блок-схема алгоритму перевірки можливості зміни розташування фігури та переміщення фігури вниз.

    курсовая работа [1,9 M], добавлен 18.02.2013

  • Перетворення координат: афінне перетворення на площині, тривідерне афінне перетворення. Властивості афінного перетворення, його характерні особливості. Операції масштабування, переносу, повороту в бібліотеці Opengl на прикладі програми побудови фігури.

    контрольная работа [724,3 K], добавлен 12.09.2009

  • Сутність прикладної програми – класу, який містить процедуру main, в якому створюється вікно з кнопками управління. Аплет – пакет класу Java, який виконується різними прикладними програмами. Ініціалізація змінних та встановлення розміру вікна аплету.

    лабораторная работа [11,8 K], добавлен 09.06.2012

  • Поняття об’єктно-орієнтовного програмування, поява відносин класів. Структури як складені типи даних, побудовані з використанням інших типів. Область дії класу і доступ до його елементів. Конструктор та деструктор класу. Розробка базового класу STRING.

    курсовая работа [280,9 K], добавлен 19.08.2010

  • Методи поліпшення растрових зображень. Параметри виду, буфер глибини, джерело світла в бібліотеці Opengl. Створення тривимірної фігури та забезпечення її повороту за допомогою Opengl, виконання операції масштабування з використанням клавіші "+" та "-".

    контрольная работа [139,4 K], добавлен 12.09.2009

  • Видання книги засобами програми Page Maker. Використання текстових фреймів. Розміщення тексту в межах смуги або колонки. Масштабування та переміщення. Імпорт файлів. Створення публікації на базі шаблону. Вставка, сортування та автонумерація сторінок.

    курсовая работа [2,5 M], добавлен 01.03.2014

  • Поняття абстрактного класу в об’єктно-орієнтованому програмуванні. Описання класу pruzhyna, створення консольної програми для обчислення коефіцієнта передачі пружини стискання з циліндричної проволоки круглого перетину за заданою формулою і параметрами.

    курсовая работа [100,7 K], добавлен 25.11.2011

  • Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.

    курсовая работа [502,5 K], добавлен 01.04.2016

  • Можливості Macromedia Flash. Анімація як візуальний графічний ефект. Створення інтерактивних фільмів і ключових кадрів; використання панелі Actions. Кадрування трансформ, груп і тексту; руху по траєкторії та зміни форми. Використання хінтів фігури.

    реферат [1,6 M], добавлен 11.09.2012

  • Формалізація моделі виробничої діяльності підприємства. Рішення за допомогою Excel. Алгоритм розрахунку моделі. Побудова моделі рішення за допомогою "С++". Знаходження оптимальної програми функціонування підприємства. Розробка коду програми.

    контрольная работа [720,1 K], добавлен 12.06.2015

  • Об’єктно-орієнтоване програмування мовою С++. Основні принципи об’єктно-орієнтованого програмування. Розробка класів з використанням технології візуального програмування. Розробка класу classProgressBar. Базовий клас font. Методи тестування програми.

    курсовая работа [211,3 K], добавлен 19.08.2010

  • Розробка методу-члену класу для створення нового одновимірного масиву з кількості всіх негативних елементів кожного рядка заданого двовимірного динамічного масиву. Особливість виводу змісту масиву на екран. Аналіз перевірки правильності роботи програми.

    лабораторная работа [131,2 K], добавлен 18.11.2021

  • Мови програмування, на яких написана програма побудови замкнутих багатокутників. Функціональні обмеження на застосування. Методи та елементи, що використовуються. Структура програми з описом функцій складових частин. Зв'язок програми з іншими програмами.

    курсовая работа [76,6 K], добавлен 01.04.2016

  • Створення програми для роботи зі зв'язаними списками засобами Delphi. Причини використання динамічної пам'яті комп’ютера. Розробка технічного завдання. Аналіз вимог та визначення специфікації. Етап реалізації та розробка документації користувача.

    курсовая работа [487,5 K], добавлен 08.08.2011

  • Аналіз питань, пов'язаних з особливостями побудови сучасних програм-помічників працівникам салонів перукарських послуг. Розробка програмного застосування, за допомогою якого виконується допомога у підборі зачіски та кольору волосся, створення бази даних.

    дипломная работа [4,5 M], добавлен 11.02.2012

  • Створення програми для виконання найпростіших функцій календаря за допомогою Borland DELPHI 2007. Аналіз процесу обробки інформації і побудова функціональних діаграм. Розробка інтерфейсу користувача, форм вводу-виводу інформації, основних алгоритмів.

    курсовая работа [1,3 M], добавлен 01.06.2013

  • Історія виникнення та розвиток методів шифрування. Особливості розробки програми, що виконує шифрування за допомогою доповнювального модуля, який надає доступ до самої програми. Вибір ефективного методу шифрування даних. Розробка відповідного інтерфейсу.

    курсовая работа [1,9 M], добавлен 21.07.2011

  • Поняття та види векторів. Прості математичні операції над ними. Векторний добуток, його геометричні та алгебраїчні властивості. Визначення та реалізація програмного класу багатовимірних векторів. Перевантажені оператори та дружні оператор-функції.

    курсовая работа [110,1 K], добавлен 15.01.2012

  • Створення додатку який дозволяє будувати діаграми динаміки обсягів промислового виробництва засобами інтегрованого середовища Borland Builder C++ 6.0 на мові програмування високого рівня С++. Опис структури інтерфейсу та складових частин програми.

    курсовая работа [2,0 M], добавлен 15.01.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.