Отделение абстракции от реализации для отображения графических примитивов Необходимо реализовать семейство классов GDBridge, предоставляющее интерфейс к основным графическим примитивам. Создать абстрактный класс GDBridge содержащий только следующие чистые виртуальные методы: Public bool Init (Параметры согласовать со мной (1)) – функция инициализирующая графические параметры, возвращает true в случае провала инициализации графических параметров, false иначе; Public void clear () – процедура заполняющая весь экран цветом фона; Public void draw () – процедура отображающая на экране все введенные в буфер графические примитивы (если графическая библиотека не поддерживает буферизацию, например как GDI, то используется буфер объекта, иначе, например как для OpenGL, используется буфер реализованный в графической библиотеке); Public void setBackColor (цвет) - процедура устанавливающая цвет фона; Public void setColor (цвет) – процедура устанавливающая цвет для выводимых графических примитивов; Public void setPointRadius (Параметры согласовать со мной (2)) – процедура устанавливающая радиус точки; Public void setLineWeight (Параметры согласовать со мной (3)) – процедура устанавливающая толщину линии; Public void drawPoint (double x, double y) – процедура рисующая точку; Public void drawLine (double x1, double y1, double x2, double y2) – процедура рисующая линию; Public void drawEmptyPolygon (количество вершин, массив цветов вершин, массив координат вершин) – процедура рисующая не закрашенный многоугольник; Public void drawFillPolygon (количество вершин, массив цветов вершин, массив координат вершин) – процедура рисующая закрашенный многоугольник. GDBridge +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void GDI_GDBridge OpenGL_GDBridge Other_GDBridge -... -... -... +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void Абстрактный класс GDBridge является базовым для GDI_GDBridge и OpenGL_GDBridge. Классы потомки полностью реализуют абстрактный интерфейс родительского класса в соответствии со своими графическими библиотеками. При этом если графическая библиотека поддерживает буферизацию, например как OpenGL, то графический примитив помещается в буфер, реализованный в графической библиотеке. Если же графическая библиотека не поддерживает буферизацию, например как GDI, то примитивы помещаются в буфер, реализованный на основе динамической очереди команд. Графические примитивы выводится на экран только после вызова метода draw. Буферизация команд отображения графических примитивов Буфером графических примитивов будет служить динамическая очередь, состоящая команд на отображения графических примитивов. Все команды представляются в виде объектов семейства классов GDCommand. Память под объекты выделяется динамически, после удаления из очереди команд объект должен автоматически удаляться из памяти. Необходимо реализовать абстрактный класс GDCommand содержащий чистый виртуальный метод: Public void execute (GDBridge GD) – процедура, исполняющая команду. Объявление абстрактного класса GDCommand следует сразу же после объявления абстрактного класса GDBridge. Это позволит использовать объекты классов из семейства GDBridge внутри всех классов из семейства GDCommand, и использовать объекты классов из семейства GDCommand внутри наследников абстрактного класса GDBridge. Абстрактный класс GDCommand будет являться базовым для setBackColor_GDCommand, setColor_GDCommand, setPointRadius_GDCommand, setLineWeight_GDCommand, drawPoint_GDCommand, drawLine_GDCommand, drawEmptyPolygon_GDCommand, drawFillPolygon_GDCommand. Каждый из классов наследников обладает следующим методом: Public bool setParam (параметры) – процедура создающая в объекте класса копию параметров в соответствии с типом объекта, возвращает true в случае если предпринята попытка передать команде некорректные данные, false иначе. GDCommand +setParam() : bool +execute() : void setBackColor_GDCommand drawPoint_GDCommand drawLine_GDCommand setPointRadius_GDCommand +setParam() : bool +execute() : void +setParam() : bool +execute() : void +setParam() : bool +execute() : void +setParam() : bool +execute() : void setColor_GDCommand +setParam() : bool +execute() : void drawEmptyPolygon_GDCommand drawFillPolygon_GDCommand setLineWeight_GDCommand +setParam() : bool +execute() : void +setParam() : bool +execute() : void +setParam() : bool +execute() : void Например class setBackColor_GDCommand: public GDCommand { private: short int Color [3]; public: bool setParam (short int *color); void execute (GDBridge GD); }; bool setBackColor_GDCommand :: setParam (short int *color) { Color[0] = color[0]; Color[1] = color[1]; Color[2] = color[2]; return false; } void setBackColor_GDCommand :: execute (GDBridge GD) { GD.setBackColor(Color); return; } Предоставляемый интерфейс Реализовать класс GDInterface, предоставляющий интерфейс к графическим примитивам и обладающий следующими методами: Public bool Init (short int libraryType, Параметры согласовать со мной (1)) – функция инициализирующая графические параметры в соответствии с выбранной библиотекой, возвращает true в случае провала инициализации графических параметров, false иначе; Public void clear () – процедура заполняющая весь экран цветом фона; Public void draw () – процедура отображающая на экране все введенные в буфер графические примитивы; Public void setBackColor (цвет) - процедура устанавливающая цвет фона; Public void setColor (цвет) – процедура устанавливающая цвет для выводимых графических примитивов; Public void setPointRadius (Параметры согласовать со мной (2)) – процедура устанавливающая радиус точки; Public void setLineWeight (Параметры согласовать со мной (3)) – процедура устанавливающая толщину линии; Public void drawPoint (double x, double y) – процедура рисующая точку; Public void drawLine (double x1, double y1, double x2, double y2) – процедура рисующая линию; Public void drawBezierCurve (Количество вершин, массив координат вершин) – процедура рисующая кривую Безье; Public void drawEmptyPolygon (количество вершин, массив цветов вершин, массив координат вершин) – процедура рисующая не закрашенный многоугольник; Public void drawFillPolygon (количество вершин, массив цветов вершин, массив координат вершин) – процедура рисующая закрашенный многоугольник; Public void drawEmptyTriangle (массив цветов вершин, массив координат вершин) – процедура рисующая не закрашенный треугольник; Public void drawFillTriangle (массив цветов вершин, массив координат вершин) – процедура рисующая закрашенный треугольник. GDInterface +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void +drawBezierCurve () : void +drawEmptyTriangle () : void +drawFillTriangle () : void 1 1 GDBridge +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void GDI_GDBridge OpenGL_GDBridge Other_GDBridge -... -... -... +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void +init() : bool +clear () : void +draw () : void +setBackColor () : void +setColor () : void +setPointRadius () : void +setLineWeight () : void +drawPoint () : void +drawLine () : void +drawEmptyPolygon () : void * 1 GDCommand +setParam() : bool +execute() : void setBackColor_GDCommand drawPoint_GDCommand drawLine_GDCommand setPointRadius_GDCommand +setParam() : bool +execute() : void +setParam() : bool +execute() : void +setParam() : bool +execute() : void +setParam() : bool +execute() : void setColor_GDCommand +setParam() : bool +execute() : void drawEmptyPolygon_GDCommand drawFillPolygon_GDCommand setLineWeight_GDCommand +setParam() : bool +execute() : void +setParam() : bool +execute() : void +setParam() : bool +execute() : void Функционал работы с цветом Цвет кодируется массивом из трех целых чисел, где: 1. целое число от 0 до 255, отвечающее за интенсивность красного оттенка; 2. целое число от 0 до 255, отвечающее за интенсивность зеленого оттенка; 3. целое число от 0 до 255, отвечающее за интенсивность синего оттенка. Необходимо предоставить простой функционал получения основных цветов. Для этого создаем следующую функцию: short int *getColorByCode (short int code) – функция возвращающая цвет по коду. Вводим замены в тексте с именами GD_цвет со значением вызова функции getColorByCode, в качестве параметра передается соответствующей кон символа. Например #define #define #define #define #define GD_BLACK getColorByCode(1) GD_RED getColorByCode(1) GD_GREEN getColorByCode(2) GD_BLUE getColorByCode(3) GD_WHITE getColorByCode(255) short int *getColorByCode (short int code) { short int color[3]; switch (code) { case 0: color[0] = 0; color[1] = 0; color[2] = 0; break; case 1: color[0] = 255; color[1] = 0; color[2] = 0; break; case 2: color[0] = 0; color[1] = 255; color[2] = 0; break; case 3: color[0] = 0; color[1] = 0; color[2] = 255; break; default: color[0] = 255; color[1] = 255; color[2] = 255; break; } return color; } Реализовать класс цветовой шкалы colorScale, обладающий следующими методами: Public bool init (double upperValue, short int *upperColor, double lowerValue, short int *lowerColor) – функция инициализирующая цветовую шкалу, возвращает true, если нижнее значение больше верхнего или совпадают верхний и нижние цвета, false иначе; Public bool setUpperBound (double upperValue, short int *upperColor) - функция устанавливающая верхнюю границу цветовой шкалы, возвращает true, если нижнее значение больше верхнего или совпадают верхний и нижние цвета, false иначе; Public bool setLowerBound (double lowerValue, short int * lowerColor) - функция устанавливающая нижнюю границу цветовой шкалы, возвращает true, если нижнее значение больше верхнего или совпадают верхний и нижние цвета, false иначе; Public double getUpperValue () – возвращает верхнее значение цветовой шкалы; Public double getLowerValue () – возвращает нижнее значение цветовой шкалы; Public short int *getUpperColor () – возвращает верхний цвет цветовой шкалы; Public short int *getLowerColor () – возвращает нижний цвет цветовой шкалы; Public short int *getColorByValue (double value) – функция возвращающая цвет по значению; Public double getValueByColor (short int *color) – функция возвращающая цвет по значению. Мутации и гибридизации Создать ОТДЕЛЬНУЮ библиотеку, где для каждого класса, предоставляющего интерфейс пользователю (GDInterface и colorScale), был бы объявлен наследник. Переопределить для наследников операции ввода и вывода в бинарные файлы. Гибридов назвать Hybrid_GDInterface и Hybrid_colorScale. Примечания Параметры согласовать со мной (1) – список параметров должен задаваться так, чтобы по ним можно было инициировать, как OpenGL, так и GDI, желательно, чтобы и другие графические библиотеки тоже; Параметры согласовать со мной (2) – выяснить, чем для нас является радиус и, как мы его будем задавать; Параметры согласовать со мной (3) – выяснить, чем для нас является толщина линии и, как мы его будем задавать.