Разработать программные средства (ПС) создания и визуализации геометрических фигур: окружности, восьмиугольника, а также сложной фигуры – окружности, описанной около восьмиугольника.
Введение 5 1 Разработка классов фигур: «окружность, восьмиугольник, вписанный многоугольник» 6 1.1 Анализ предметной области 6 1.2 Анализ функциональных требований 7 1.3 Проектирование 12 1.4 Реализация 16 1.5 Тестирование 20 Заключение 23 Список использованных источников 24 Приложение А 25 Приложение Б 34
Фрагмент для ознакомления
Пособие / Д. Ю. Иванов, Ф. А. Новиков – СПб.: Изд-во Политехн. ун-та, 2011. – 229 с.Сиддхартха Р. Освой самостоятельно C++ по одному часу в день, 8-е изд.: Пер. с англ. – СпБ.:ООО «Альфа-книга», 2017. – 752 с.Павловская Т. А. C/C++. Программирование на языке высокого уровня. – СПб: Питер, 2003. – 461 с.Приложение АКОД ПРОГРАММЫ(обязательное)Figure.h#pragmaonce#include#include#include#include#includeclassFigure{protected:int x, y;bool hidden;public:classFigureException{public:std::string error;FigureException(std::stringstr) : error(str) {}};classInvalidValue{public:std::string error;int value;InvalidValue(std::stringstr, intval) :error(str), value(val) {}};Figure(int_x, int_y) : x(_x), y(_y), hidden(true){if (x < 0)throwInvalidValue("Invalid value of x: ", x);if (y < 0)throwInvalidValue("Invalid value of y: ", y);}voidvirtual draw() = 0;voidvirtual hide() = 0;void move(int, int);};classFigures{private:std::list v;public:void push(Figure* f){v.push_front(f);};void show(){// проверяем, пуст ли stackif (v.empty()) {printf("The stack is empty\n");}else {do{v.front()->draw();v.pop_front();} while (!v.empty());}}void clear(){if (v.empty())v.clear();}intget_size(){returnv.size();}};Figure.cpp#include"Figure.h"voidFigure::move(int_x, int_y){if (!hidden){hide(g);x = _x;y = _y;draw(g);}else { x = _x; y = _y; }}BaseFigure.h#pragmaonce#include"Figure.h"classBaseFigure :publicFigure{protected:HWNDhwnd; //HDChdc;RECTrt; //структурасполями left, top, right, bottomCOLORREFoColor;COLORREFiColor;public:BaseFigure(int, int, COLORREF, COLORREF);~BaseFigure() { ReleaseDC(hwnd, hdc); }};BaseFigure.cpp#include"BaseFigure.h"BaseFigure::BaseFigure(int_x, int_y, COLORREFoCol, COLORREFiCol):Figure::Figure(_x, _y), oColor(oCol), iColor(iCol){hwnd = GetConsoleWindow();GetClientRect(hwnd, &rt);hdc = GetDC(hwnd);}Circle.h#pragmaonce#include"BaseFigure.h"classCircle :publicBaseFigure{private:int r;public:Circle(constCircle&);Circle(int, int, int, COLORREF, COLORREF);inlineintgetR() { return r; }void draw() override;void hide() override;void move(int,int);};Circle.cpp#include"Circle.h"Circle::Circle(constCircle& _circle) :BaseFigure::BaseFigure(_circle.x, _circle.y, _circle.oColor, _circle.iColor), r(_circle.r) {}Circle::Circle(int_x, int_y, int_r, COLORREFoCol, COLORREFiCol) :BaseFigure::BaseFigure(_x, _y, oCol, iCol), r(_r){if (r <= 0)throwInvalidValue("Invlaid value of circle radius: ", r);if (x - r < 0 || y - r < 0 || x + r > rt.right || y + r > rt.bottom)throwFigureException("Figure is out of border!");}voidCircle::draw(){HPENhPen = CreatePen(PS_SOLID, 1, oColor);HBRUSHhBrush = CreateSolidBrush(iColor);SelectObject(hdc, hPen); SelectObject(hdc, hBrush);Ellipse(hdc, x - r, y - r, x + r, y + r);DeletePen(hPen);DeleteBrush(hBrush);hidden = false;}voidCircle::hide(){HPENhPen = CreatePen(PS_SOLID, 1, RGB(0xF2, 0xF2, 0xF2));HBRUSHhBrush = CreateSolidBrush(RGB(0xF2, 0xF2, 0xF2));HGDIOBJ old = SelectObject(hdc, hBrush);SelectObject(hdc, hPen); SelectObject(hdc, hBrush);Ellipse(hdc, x - r, y - r, x + r, y + r);SelectObject(hdc, old);DeletePen(hPen);DeleteBrush(hBrush);hidden = true;}voidCircle::move(int_x, int_y){if (_x - r < 0 || _y - r < 0 || _x + r > rt.right || _y + r > rt.bottom)throwFigureException("Figure is out of border!");BaseFigure::move(_x, _y);}Octagon.h#pragmaonce#include"BaseFigure.h"class Octagon :publicBaseFigure{private:int r;public:Octagon(const Octagon&);Octagon(int, int, int, COLORREF, COLORREF);inlineintgetR() { return r; }void draw() override;void hide() override;void move(int, int);};Octagon.cpp#define _USE_MATH_DEFINES #include#include"Octagon.h"Octagon::Octagon(const Octagon& _octagon) :BaseFigure::BaseFigure(_octagon.x, _octagon.y, _octagon.oColor, _octagon.iColor), r(_octagon.r){}Octagon::Octagon(int _x, int _y, int _r, COLORREF oCol, COLORREF iCol) :BaseFigure::BaseFigure(_x, _y, oCol, iCol), r(_r){if (r <= 0)throwInvalidValue("Invlaid value of octagon radius: ", r);if (x - r < 0 || y - r < 0 || x + r > rt.right || y + r > rt.bottom)throwFigureException("Figure is out of border!");}voidOctagon::draw(){HPENhPen = CreatePen(PS_SOLID, 1, oColor);HBRUSHhBrush = CreateSolidBrush(iColor);SelectObject(hdc, hPen); SelectObject(hdc, hBrush);float da= 360 / 8;float a= 0;POINTp[8]; for (inti = 0; i < 8;i++){p[i].x = x + round(r * cos(a * M_PI / 180));p[i].y = y - round(r * sin(a * M_PI / 180));a += da;}Polygon(hdc, p, 8);DeletePen(hPen);DeleteBrush(hBrush);hidden = false;}void Octagon::hide(){HPEN hPen = CreatePen(PS_SOLID, 1, RGB(0xF2, 0xF2, 0xF2));HBRUSH hBrush = CreateSolidBrush(RGB(0xF2, 0xF2, 0xF2));SelectObject(hdc, hPen); SelectObject(hdc, hBrush);float da = 360 / 8;float a = 0;POINT p[8];for (inti = 0; i < 8; i++){p[i].x = x + round(r * cos(a * M_PI / 180));p[i].y = y - round(r * sin(a * M_PI / 180));a += da;}Polygon(hdc, p, 8);DeletePen(hPen);DeleteBrush(hBrush);hidden = true;}void Octagon::move(int _x, int _y){if (_x - r < 0 || _y - r < 0 || _x + r > rt.right || _y + r > rt.bottom)throwFigureException("Figure is out of border!");BaseFigure::move(_x, _y);}ComplexFigure.h#pragmaonce#include"Figure.h"#include"BaseFigure.h"#include"Circle.h"#include"Octagon.h"classComplexFigure :publicFigure{private:Circlecircle;Octagonoctagon;public:ComplexFigure(int, int, Circle& circle, Octagon& octagon);void draw() override;void hide() override;void move(int, int);~ComplexFigure() { circle.~Circle(); octagon.~Octagon(); }};ComplexFigure.cpp#include"ComplexFigure.h"ComplexFigure::ComplexFigure(int_x, int_y, Circle&_circle, Octagon&_octagon):Figure::Figure(_x, _y), circle(_circle), octagon(_octagon){if (octagon.getR() != circle.getR())throwFigureException("Radiuses of circle and octagon are not equal!");circle.move(x, y);octagon.move(x, y);}voidComplexFigure::draw(){circle.draw();octagon.draw();}voidComplexFigure::hide(){circle.hide();octagon.hide();}voidComplexFigure::move(int_x, int_y){circle.move(_x, _y);octagon.move(_x, _y);}App22VP2_4.cpp// App22VP2_4.cpp :Этотфайлсодержитфункцию"main". Здесь начинается и заканчивается выполнение программы.//#include#include#include#include#include#include"Figure.h"#include"BaseFigure.h"#include"Circle.h"#include"Octagon.h"#include"ComplexFigure.h"#ifdef_MSC_VER#pragmawarning(disable:4244)#endifHDChDC;HWNDhWnd;RECTRect;HPENhPen, hOldPen;HBRUSHhBrush, hOldBrush;VOIDWINAPISetConsoleColors(WORDattribs) {HANDLEhOutput = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_SCREEN_BUFFER_INFOEXcbi;cbi.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);GetConsoleScreenBufferInfoEx(hOutput, &cbi);cbi.wAttributes = attribs;SetConsoleScreenBufferInfoEx(hOutput, &cbi);}voidclearscreen(intr, intg, intb){hPen = CreatePen(PS_SOLID, 4, RGB(r, g, b));hOldPen = (HPEN)SelectObject(hDC, hPen);hBrush = CreateSolidBrush(RGB(r, g, b));hOldBrush = (HBRUSH)SelectObject(hDC, hOldBrush);Rectangle(hDC, Rect.left, Rect.top, Rect.right, Rect.bottom);SelectObject(hDC, hOldPen);DeleteObject(hPen);SelectObject(hDC, hOldBrush);DeleteObject(hBrush);}int main(){setlocale(LC_ALL, "Rus");SetConsoleCP(1251);SetConsoleOutputCP(1251);Figuresfg;try{SetConsoleTitle((LPCWSTR)L"App22VP2_4");//SetConsoleColors(BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);system("color F0");printf("Нажатие любой клавиши, кроме Esc, перерисует графику при изменении режима, выход - Esc \n");do {clearscreen(255, 255, 255);Circlecircle(100, 250, 100, RGB(0, 0, 0), RGB(0, 0, 255));Octagonoctagon(350, 250, 100, RGB(0, 0, 0), RGB(0, 255, 0));Figure* comp = newComplexFigure(600, 250, circle, octagon);ComplexFigure comp1 = ComplexFigure::ComplexFigure(600, 250, circle, octagon);fg.push(&circle);fg.push(&octagon);fg.push(&comp1);int k=fg.get_size();fg.show();Sleep(2000);circle.hide(); octagon.hide(); comp1.hide();octagon.move(850, 250);comp1.move(600,200);fg.clear();fg.push(&octagon);fg.push(&comp1);Sleep(2000);fg.show();} while (_getch() != 27); // при нажатии любой клавиши// (кроме Esc) перерисовываем изображение,// изображение изменится, если изменились размеры окна,// нажатие Esc – выход}catch (Figure::InvalidValue& iv){std::cout<
1. Иванов Д. Ю Унифицированный язык моделирования UML: Учеб. Пособие / Д. Ю. Иванов, Ф. А. Новиков – СПб.: Изд-во Политехн. ун-та, 2011. – 229 с. 2. Сиддхартха Р. Освой самостоятельно C++ по одному часу в день, 8-е изд.: Пер. с англ. – СпБ.:ООО «Альфа-книга», 2017. – 752 с. 3. Павловская Т. А. C/C++. Программирование на языке высокого уровня. – СПб: Питер, 2003. – 461 с.