Автор работы: Пользователь скрыл имя, 17 Марта 2013 в 21:30, курсовая работа
Создание иерархии классов для реализации свойств и методов объектов точка, окружность, прямая, прямоугольник, закрашенная область из предметной области «Графические объекты». В основной программе продемонстрирована работа методов: перемещение, наложение, масштабирование.
Задание …………………………………………………………..……3
Введение……………………………………………………………….4
Разработка структуры классов………………………………..5
Реализация классов в программе ………………………….….8
Работа программы…………………………………………..….15
Приложение(Основная программа)…………………………...18
Системные требования................................................................23
Заключение……………………………………………………………..24
Список литературы…………………………………………………....25
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
РЯЗАНСКИЙ ГОСУДАРСТВЕННЫЙ РАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ И ПРИКЛАДНОЙ МАТЕМАТИКИ
Пояснительная записка
к курсовому проекту
по дисциплине
«Высокоуровневые
методы информатики и
на тему:
«ГРАФИЧЕСКИЕ ОБЪЕКТЫ»
Выполнила студентка группы: 944
Костикова О.М.
Проверил доцент кафедры ВПМ
Лаврентьев С.И.
Рязань 2011
Задание …………………………………………………………..……3
Введение…………………………………………………………
Разработка структуры классов………………………………..5
Реализация классов в программе ………………………….….8
Работа
программы…………………………………………..….
Приложение(Основная программа)…………………………...18
Системные требования....................
Заключение……………………………………………………
Список литературы………………………………………………….
Задание
Создать иерархию классов для реализации свойств и методов объектов точка, окружность, прямая, прямоугольник, закрашенная область из предметной области «Графические объекты». В основной программе продемонстрировать работу методов: перемещение, наложение, масштабирование. Создать справочную систему.
Введение
Без компьютерной графики невозможно представить себе не только компьютерный, но и обычный, вполне материальный мир. На сегодняшний день компьютеры и компьютерная графика неотъемлемая часть жизни современного общества. Для примера назовём медицину (компьютерная томография), научные исследования (визуализация строения вещества, векторных полей и других данных), моделирование тканей и одежды, опытно-конструкторские разработки, рекламные щиты, цветные журналы, спецэффекты в фильмах - всё это в той или иной мере имеет отношение к компьютерной графике. Поэтому созданы программы для создания и редактирования изображений, то есть графические редакторы. Целью моего курсового проекта является создание одного из представителей простейших графических редакторов. Интерфейс программы схож с стандартным Paint . Имеется подробная справка о каждой функции программы. Редактор был реализован на языке С++, являющегося одним из самых популярных языков программирования, по средствам приложения Borland C++ Builder 2006.
Разработка структуры классов
В данном проекте необходимо разработать иерархию классов объектов и методов редактора.
Для линий:
Для фигур без заливки цветом:
Для фигур с заливкой:
Исходя из требований можно выделить общие функции, характерные для всех фигур. Это:
Исходя из этого нам нужно создать один базовый класс и поместить в него виртуальные функции , которыми будут пользоваться наследники.
На основе вышеперечисленных требований нам была разработана следующая система классов:
Базовый класс class GObject состоит методов, присущих каждой фигуре. В нем реализованы следующие методы: прорисовка в заданном месте канвы, действия после прорисовки, координаты. Далее представлена структура классов (смешение цветов прямоугольника аналогично смешению цветов эллипса):
Структура классов
MoveTo-определяет текущую позицию пера.
LineTo-рисует прямую до заданной точки.
Pen -отвечает за выведение обводок и линий, а Brush за заливку.
Draw-рисует битовый образ, пиктограмму, метафайл в заданном месте канвы.
Style -определяет вид линии.
pmNotXor -сложение с фоном по инверсному исключающему ИЛИ(используется при сложении цветов).
class GObject
{ public:
virtual void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X, int Y) = 0;
virtual void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y) = 0;
virtual void Down(TPaintBox *PaintBox, int X,int Y) = 0;
};
GLine-рисует прямую линию.
class GLine : public GObject
{ public:
GLine(int X,int Y): x0(X), y0(Y), x1(X), y1(Y) {};
void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
PaintBox->Canvas->Pen->Mode = pmNotXor;
PaintBox->Canvas->MoveTo(x0,
PaintBox->Canvas->LineTo(x1,
PaintBox->Canvas->MoveTo(x0,
PaintBox->Canvas->LineTo(X,Y);
x1 = X;
y1 = Y;
}
void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
// Mode = pmCopy - линии проводятся цветом, заданным в свойстве Color.
PaintBox->Canvas->Pen->Mode = pmCopy;
PaintBox->Canvas->MoveTo(x0,
PaintBox->Canvas->LineTo(X,Y);
BitMap->Canvas->Brush->Style = bsClear;//пустая заливка
BitMap->Canvas->MoveTo(x0,y0);
BitMap->Canvas->LineTo(X,Y);
}
void Down(TPaintBox *PaintBox, int X,int Y){}
private:
int x0, x1, y0, y1;
};
GRect-прямоугольник.
Rectangle-рисует прямоугольник заданного размера
class GRect : public GObject
{ public:
GRect(int X,int Y): x0(X), y0(Y), x1(X), y1(Y) {};
void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
PaintBox->Canvas->Pen->Mode = pmNotXor;
PaintBox->Canvas->Brush->Style = bsClear; //пустая заливка
PaintBox->Canvas->Rectangle(
PaintBox->Canvas->Rectangle(
x1 = X;
y1 = Y;
}
void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
PaintBox->Canvas->Pen->Mode = pmCopy;
BitMap->Canvas->Brush->Style = bsClear; //пустая заливка
PaintBox->Canvas->Rectangle(
BitMap->Canvas->Rectangle(
}
void Down(TPaintBox *PaintBox, int X,int Y){}
private:
int x0, x1, y0, y1;
};
GEllipse-эллипс.
Ellipse-рисует эллипс заданного размера
class GEllipse : public GObject
{ public:
GEllipse(int X,int Y): x0(X), y0(Y), x1(X), y1(Y) {};
void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
PaintBox->Canvas->Pen->Mode = pmNotXor;
PaintBox->Canvas->Brush->Style = bsClear; //пустая заливка
PaintBox->Canvas->Ellipse(
PaintBox->Canvas->Ellipse(
x1 = X;
y1 = Y;
}
void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
//Стиль вывода замкнутой фигуры, зависящий от цвета пера
//и канвы ( заменяет своими возможностями) функцию SetBkMode()
//Здесь прозрачный фон
PaintBox->Canvas->Pen->Mode = pmCopy;
BitMap->Canvas->Brush->Style = bsClear; //пустая заливка
PaintBox->Canvas->Ellipse(
BitMap->Canvas->Ellipse(TRect(
}
void Down(TPaintBox *PaintBox, int X,int Y){}
private:
int x0, x1, y0, y1;
};
GPen-кисть.
(Аналогичным образом работает «Ластик» ,только в палитре всегда выбирает белый цвет.)
class GPen : public GObject
{ public:
GPen(int X,int Y): x0(X), y0(Y){};
// Для кнопочки ctrl + Z создать вектор координат.
void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
PaintBox->Canvas->MoveTo(x0,
BitMap->Canvas->MoveTo(x0,y0);
PaintBox->Canvas->Pen->Mode = pmCopy;
PaintBox->Canvas->LineTo(X,Y);
BitMap->Canvas->LineTo(X,Y);
x0 = X;
y0 = Y;
}
void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y){}
void Down(TPaintBox *PaintBox, int X,int Y){}
private:
int x0, y0;
};
GFull-заливка.
class GFull : public GObject
{ public:
GFull(int X,int Y){}//т.к. используется остальными компонентами
void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y){}
void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{//fsSurface-заливает область с цветом, заданным параметром Color, ограниченную другим цветом.
PaintBox->Canvas->FloodFill(X,
Y, PaintBox->Canvas->Pixels[X][Y]
BitMap->Canvas->FloodFill(X, Y, BitMap->Canvas->Pixels[X][Y], fsSurface);
}
void Down(TPaintBox *PaintBox, int X,int Y){}
};
GNalog_El –наложение эллипса.
(аналогичным образом
class GNalog_El : public GObject
{ public:
GNalog_El(int X,int Y): x0(X), y0(Y), x1(X), y1(Y){}; //т.к. используется остальными компонентами
void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{ PaintBox->Canvas->Pen->Mode = pmNotXor;// сложение с фоном по инверсному исключающему ИЛИ
PaintBox->Canvas->Brush->Style = bsClear; //пустая заливка
PaintBox->Canvas->Ellipse(
PaintBox->Canvas->Ellipse(
x1 = X;
y1 = Y;}
void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{PaintBox->Canvas->Pen->Mode = pmCopy;
BitMap->Canvas->Brush->Style = bsClear; //пустая заливка
PaintBox->Canvas->Ellipse(
BitMap->Canvas->Ellipse(TRect(
void Down(TPaintBox *PaintBox, int X,int Y){}
private:
int x0, y0 ,x1,y1;
};
GSelect -выделение области.
Позволяет выделить нужную область рисунка и переместить (скопировать) её на новое место. Это полезно при рисовании однотипных объектов.
class GSelect : public GObject
{
public:
GSelect(Graphics::TBitmap *BitMap)
{
RBegin = false;
REnd = false;
RDrag = false;
Bit = new Graphics::TBitmap;
Bit->Width = BitMap->Width;
Bit->Height = BitMap->Height;
BitBlt
(
Bit->Canvas->Handle,
0, 0,
BitMap->Width, BitMap->Height,
BitMap->Canvas->Handle,
0, 0,
SRCCOPY//Исходное изображение копируется в контекст отображения
);
}
void Down(TPaintBox *PaintBox, int X,int Y)
{
PaintBox->Canvas->Brush->Style = bsSolid;
PaintBox->Canvas->Brush->Color = clBtnFace;
X0 = X;
Y0 = Y;
// режим работы с рамкой
if (REnd)
// стирание прежней рамки
{
if ((X < R.Right) && (X > R.Left) && (Y > R.Top) && (Y < R.Bottom))
// режим начала перетаскивания фрагмента
{
// установка флагов
RDrag = true;
REnd = false;
// запоминание начального
R0 = R;
// запоминание изображения
}
else // если не попадает внутрь выделенной области, то рисуем новую.
{
PaintBox->Canvas->
RBegin = true;
REnd = false;
R.Top = X;
R.Bottom = X;
R.Left = Y;
R.Right = Y;
PaintBox->Canvas->
}
}
else
// режим
начала рисования рамки
{
RBegin = true;
REnd = false;
R.Top = X;
R.Bottom = X;
R.Left = Y;
R.Right = Y;
PaintBox->Canvas->
}
}
void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
if (RBegin)
{
// Режим рисования рамки
PaintBox->Canvas->
if (X0 < X) { R.Left = X0; R.Right = X; }
else { R.Left = X; R.Right = X0; }
if (Y0 < Y) { R.Top = Y0; R.Bottom = Y; }
else { R.Top = Y; R.Bottom = Y0; }
PaintBox->Canvas->
}
else
{
TF->flag_rect = true;
// Режим перетаскивания фрагмента
// восстановление изображения
BitMap->Canvas->CopyRect(R,
// формирование нового положения фрагмента
R.Left = R.Left + X - X0;
R.Right = R.Right + X - X0;
R.Top = R.Top + Y - Y0;
R.Bottom = R.Bottom + Y - Y0;
// запоминание положения курсора мыши
X0 = X;
Y0 = Y;
// рисование фрагмента в новом положении
BitMap->Canvas->CopyRect(R,
BitBlt
(
PaintBox->Canvas->Handle,
0, 0,
PaintBox->Width, PaintBox->Height,
BitMap->Canvas->Handle,
0, 0,
SRCCOPY//Исходное изображение копируется в контекст отображения
);
// рисование рамки
PaintBox->Canvas->
}
}
void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)
{
if (RDrag)
{
PaintBox->Canvas->
BitBlt
(
Bit->Canvas->Handle,