Графические объекты

Автор работы: Пользователь скрыл имя, 17 Марта 2013 в 21:30, курсовая работа

Описание работы

Создание иерархии классов для реализации свойств и методов объектов точка, окружность, прямая, прямоугольник, закрашенная область из предметной области «Графические объекты». В основной программе продемонстрирована работа методов: перемещение, наложение, масштабирование.

Содержание работы

Задание …………………………………………………………..……3
Введение……………………………………………………………….4
Разработка структуры классов………………………………..5
Реализация классов в программе ………………………….….8
Работа программы…………………………………………..….15
Приложение(Основная программа)…………………………...18
Системные требования................................................................23
Заключение……………………………………………………………..24
Список литературы…………………………………………………....25

Файлы: 1 файл

ПЗ_РЕДАКТОР.docx

— 378.47 Кб (Скачать файл)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ  РОССИЙСКОЙ ФЕДЕРАЦИИ

 

РЯЗАНСКИЙ ГОСУДАРСТВЕННЫЙ РАДИОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

 

КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ И  ПРИКЛАДНОЙ МАТЕМАТИКИ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пояснительная записка

к курсовому  проекту

по дисциплине

«Высокоуровневые  методы информатики и программирования»

на тему:

«ГРАФИЧЕСКИЕ ОБЪЕКТЫ»

 

 

 

Выполнила студентка  группы: 944

Костикова О.М.

Проверил  доцент кафедры ВПМ

Лаврентьев  С.И.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рязань 2011

СОДЕРЖАНИЕ

Задание …………………………………………………………..……3

Введение……………………………………………………………….4

Разработка структуры классов………………………………..5

  Реализация классов в программе ………………………….….8

Работа  программы…………………………………………..….15 
Приложение(Основная программа)…………………………...18  
Системные требования................................................................23

Заключение……………………………………………………………..24

Список  литературы…………………………………………………....25

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Задание

Создать иерархию классов для реализации свойств  и методов объектов точка, окружность, прямая, прямоугольник, закрашенная область из предметной области «Графические объекты». В основной программе продемонстрировать работу методов: перемещение, наложение, масштабирование. Создать справочную систему.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Введение

Без компьютерной графики невозможно представить себе не только компьютерный, но и обычный, вполне материальный мир. На сегодняшний день компьютеры и компьютерная графика неотъемлемая часть жизни современного общества. Для примера назовём медицину (компьютерная томография), научные исследования (визуализация строения вещества, векторных полей и других данных), моделирование тканей и одежды, опытно-конструкторские разработки, рекламные щиты, цветные журналы, спецэффекты в фильмах - всё это в той или иной мере имеет отношение к компьютерной графике. Поэтому созданы программы для создания и редактирования изображений, то есть графические редакторы. Целью моего курсового проекта является создание  одного из представителей простейших графических редакторов. Интерфейс программы схож с стандартным 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,y0);

      PaintBox->Canvas->LineTo(x1,y1);

 

      PaintBox->Canvas->MoveTo(x0,y0);

      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,y0);

      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(TRect(x0,y0,x1,y1)); //содержит значения прямоугольника(координаты)

      PaintBox->Canvas->Rectangle(TRect(x0,y0,X,Y));

      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(TRect(x0,y0,X,Y));

      BitMap->Canvas->Rectangle(TRect(x0,y0,X,Y));

   }

   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(TRect(x0,y0,x1,y1));//содержит значения эллипса(координаты)

      PaintBox->Canvas->Ellipse(TRect(x0,y0,X,Y));

      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(TRect(x0,y0,X,Y));

      BitMap->Canvas->Ellipse(TRect(x0,y0,X,Y));

   }

   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,y0);

      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], fsSurface);

      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(TRect(x0,y0,x1,y1));

      PaintBox->Canvas->Ellipse(TRect(x0,y0,X,Y));

      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(TRect(x0,y0,X,Y));

      BitMap->Canvas->Ellipse(TRect(x0,y0,X,Y));}

   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->DrawFocusRect(R);

            RBegin = true;

            REnd = false;

            R.Top = X;

            R.Bottom = X;

            R.Left = Y;

            R.Right = Y;

            PaintBox->Canvas->DrawFocusRect(R);

         }

      }

      else

      // режим  начала рисования рамки фрагмента

      {

         RBegin = true;

         REnd = false;

         R.Top = X;

         R.Bottom = X;

         R.Left = Y;

         R.Right = Y;

         PaintBox->Canvas->DrawFocusRect(R);

      }

   }

 

   void Draw(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)

   {

      if (RBegin)

      {

         // Режим рисования рамки фрагмента

         PaintBox->Canvas->DrawFocusRect(R);

         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->DrawFocusRect(R);

      }

      else

      {

         TF->flag_rect = true;

         // Режим перетаскивания фрагмента

         // восстановление изображения под  перетаскиваемым фрагментом

         BitMap->Canvas->CopyRect(R,Bit->Canvas,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,Bit->Canvas,R0);

         BitBlt

         (

            PaintBox->Canvas->Handle,

            0, 0,

            PaintBox->Width, PaintBox->Height,

            BitMap->Canvas->Handle,

            0, 0,

            SRCCOPY//Исходное изображение копируется в контекст отображения

         );

         // рисование рамки

         PaintBox->Canvas->DrawFocusRect(R);

      }

   }

 

   void End(TPaintBox *PaintBox, Graphics::TBitmap *BitMap, int X,int Y)

   {

      if (RDrag)

      {

         PaintBox->Canvas->DrawFocusRect(R);

         BitBlt

         (

            Bit->Canvas->Handle,

Информация о работе Графические объекты