close

Вход

Забыли?

вход по аккаунту

?

ПЗ (5)

код для вставкиСкачать
 Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования "Самарский государственный технический университет"
Факультет автоматики и информационных технологий.
Кафедра "Вычислительная техника"
КУРСОВАЯ РАБОТА
по дисциплине
"Компьютерная графика"
Вариант 31
на тему "Разработка программы объектно-ориентированного графического редактора".
Выполнил: студент IV-АИТ-3
Принял: преподаватель Пугачев А.И.
Оценка: _________________
1. Техническое задание
Разработать программу объектно-ориентированного графического редактора, обеспечивающего выполнение следующих основных функций:
- выбор, размещение на экране и визуализация примитивов из заданного набора;
- синтез более сложных фигур с помощью теоретико-множественных операций (ТМО) как над примитивами, так и над ранее синтезированными фигурами;
- выделение любого объекта, выведенного на экран, и выполнение над ним любой последовательности геометрических преобразований из заданного набора в интерактивном режиме;
- выделение любого объекта на экране и его удаление.
Уровень сложности синтезируемых фигур по числу используемых для этого ТМО не должен ограничиваться. Не должно быть также ограничений на количество примитивов любого вида или сложных фигур, выводимых на экран. При выполнении ТМО объекты - операнды данной операции следует удалять из списка самостоятельных объектов, а изображение стирать с экрана.
Любые геометрические преобразования нужно выполнять в однородных координатах в матричной форме и применять ко всем видам объектов.
Геометрические преобразования над каким-либо объектом не должны приводить к стиранию изображения или другим искажениям остальных объектов.
Программа должна располагать общепринятыми элементами интерфейса: системным и контекстным меню, инструментальными панелями, другими элементами диалога, подсказками по всем основным функциям программы. Предусмотреть диалоговые средства для выбора цвета рисования.
Программа должна быть рассчитана на работу в операционной системе Windows 2000 и выше. Индивидуальное задание для курсовой работы. Таблица 1. Вариант 31
Примитивы Геометрические преобразования ТМО * Кривая Эрмита
* Крест
* Уголок 1* Поворот вокруг заданного центра на произвольный угол
* Масштабирование относительно заданного центра
* Масштабирование По оси Y относительно центра объекта* Пересечение
* Симметрическая разность 2. Описание процесса разработки
2.1 Выбор языка программирования и среды разработки
В настоящее время существует богатое многообразие различных языков программирования. Одни из самых существенных факторов, которые повлияли на мое решение о выборе:
* Работоспособность разработанных программ под ОС Windows 2000 и выше
* Удобство разработки
* Наличие развернутой технической документации
Исходя из перечисленных выше факторов, мой выбор пал на использование языка программирования Delphi в интегрированной среде разработки Delphi XE. 2.2 Разработка структур данных для представления примитивов и сложных объектов, конструируемых с помощью ТМО
На основе анализа требований технического задания, мною была спроектирована иерархия программных классов, которая изображена на рисунке 1: Рисунок 1. Диаграмма классов, используемых для представления фигур
Таблица 2. Соответствия объектов задания и названий классов
Объект Название класса Линия TLine Кривая Эрмита TER Крест TСross Уголок 1 TAngle1 Синтезированный объект TTMO Некоторые свойства и методы присущи разным примитивам, такие как наличие вершин, цвета закрашивания, названия и др.; а также для возможности универсального обращения к объектам при рисовании и редактировании, мною был разработан абстрактный программный класс - TGObject, в котором содержатся общие для всех объектов члены.
2.2.1 Класс TGObject
Класс TGObject содержит общие для всех графических объектов свойства, методы и поля. Некоторые члены обозначены модификатором virtual для того, чтобы наследники этого класса могли переопределять их. Так например, метод Draw в абстрактном классе TGObject не определен совсем. Его реализация должна быть разная у всех наследников.
Методы:
НазваниеОписаниеDrawВызов отрисовки фигуры DrawPointsВызов отрисовки квадратов вокруг вершин фигуры isUnderПозволяет узнать, находится ли точка с заданными координатами внутри фигуры Свойства:
НазваниеОписаниеposКоордината центра фигуры ColorЦвет, используемый для рисования фигуры NameНазвание фигуры _PointsКоллекция вершин фигуры 2.2.2 Класс Line
Класс Line используется для представления отрезка прямой. Этот класс наследуется от TGObject и переопределяет метод Draw. В методе Draw выполняется рисование отрезка прямой по алгоритму Брезенхэма.
2.2.3 Класс TER
Класс TER наследуется от TGObject, и используется для представления кривой Эрмита. Помимо унаследованных от TGObject членов.
2.2.4 Класс TPolygon
Класс TPolygon используется для представления многоугольников. Индивидуальные методы класса TPolygon:
НазваниеОписаниеDrawContourВызов рисования контура CalcBordersПолучить массив сегментов для строки Y Индивидуальные свойства класса TPolygon:
НазваниеОписаниеVertexesСписок вершин многоугольника 2.2.5 Класс TСross
Класс Tangle1 используется для представления фигуры "Крест". Этот класс наследуется от класса TСross.
Алгоритм визуализирования фигуры "Крест" ничем не отличается от алгоритма рисования неориентированного закрашенного многоугольника, поэтому метод Draw не переопределен.
2.2.6 Класс Tangle1
Класс Tangle1 используется для представления фигуры "Уголок 1". Этот класс наследуется от класса TPolygon.
Алгоритм визуализирования фигуры "уголок1" ничем не отличается от алгоритма рисования неориентированного закрашенного многоугольника, поэтому метод Draw не переопределен.
2.2.7 Класс TTMO
Класс TTmo используется для представления синтезированного объекта. Синтезированный объект получается путем выполнения над двумя объектами (операндами) одной из следующих операций:
* Объединение
* Вычитание
Индивидуальные свойства класса TTmo:
НазваниеОписаниеoperationОперация operand1Операнд А operand2Операнд B В качестве операндов класс TTmo принимает экземпляры классов TGObject, или наследников от TGObject, что позволяет синтезировать любые многоугольники. Учитывая тот факт, что класс TTmo сам наследуется от TGObject, мы получаем возможность синтезировать не только простейшие многоугольники, но и уже синтезированные объекты в любой комбинации.
Для обеспечения корректности представления объекта, в классе переопределены следующие свойства и методы:
НазваниеОписаниеCalcBordersПолучить границы сегментов ТМО в строке YisUnderУзнать принадлежит ли точка ТМО DrawВызов рисования этого синтезированного объекта 2.3 Разработка способов задания примитивов и процедур их визуализации
2.3.1 Задание примитива "отрезок прямой"
Отрезок прямой задается двумя точками и визуализируется при помощи алгоритма Брезенхэма.
2.3.2 Задание примитива "кривая Эрмита"
Кубический сплайн задается на плоскости в следующем виде:
P(t) = [axt3 + bxt2 + cxt + dx, ayt3 + byt2 + cyt + dy]
Для того, чтобы изобразить кривую, необходимо рассчитать коэффициенты ax, ay, bx, by, cx, cy, dx, dy. В этой работе, кривая задается в форме Эрмита - координатами начальной (T1) и конечной (T2) точек кривой, и касательными (T'1 и T'2 соответственно) к ним векторами. Для расчета коэффициентов, a, b, c, d были использованы формулы:
a = 2 * T1 - 2 * T2 + T'1 + T'2 b = -3 * T1 + 3 * T2 - 2 * T'1 - T'2 c = T'1
d = T1
При известных коэффициентах a, b, c, d, для отображения кривой, производится подстановка параметра t из диапазона от 0 до 1 в формулу задания кубического сплайна. 2.3.3 Задание примитива "Крест"
Уголок задается управляющей вершиной, шириной и высотой исходя из которых, рассчитываются координаты вершин.
procedure TCross.update;
var
tmpPoint:TPoint;
begin
tmpPoint.X:=Self.MainPoint.X;
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3*2);
vertexes[0]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3);
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3*2);
vertexes[1]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3);
tmpPoint.Y:=Self.MainPoint.Y+Self.height;
vertexes[2]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3*2);
tmpPoint.Y:=Self.MainPoint.Y+Self.height;
vertexes[3]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3*2);
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3*2);
vertexes[4]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width);
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3*2);
vertexes[5]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width);
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3);
vertexes[6]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3*2);
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3);
vertexes[7]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3*2);
tmpPoint.Y:=Self.MainPoint.Y;
vertexes[8]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3);
tmpPoint.Y:=Self.MainPoint.Y;
vertexes[9]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X+Round(Self.width/3);
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3);
vertexes[10]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X;
tmpPoint.Y:=Self.MainPoint.Y+Round(Self.height/3);
vertexes[11]:=tmpPoint;
end;
Визуализация происходит по такому же способу, как и визуализация полигона
2.3.4 Задание примитива "Уголок 1"
Уголок задается управляющей вершиной, шириной и высотой исходя из которых, рассчитываются координаты вершин.
procedure TAngle1.update;
var
tmpPoint:TPoint;
begin
vertexes[0]:=Self.MainPoint;
tmpPoint.X:=vertexes[0].X+Self.width;
tmpPoint.Y:=Self.MainPoint.Y;
vertexes[1]:=tmpPoint;
tmpPoint.X:=round(vertexes[0].X+Self.width/1.33) ;
tmpPoint.Y:=(vertexes[0].Y+Self.height div 4) ;
vertexes[2]:=tmpPoint;
tmpPoint.X:=(vertexes[0].X+Self.width div 4) ;
tmpPoint.Y:=(vertexes[0].Y+Self.height div 4) ;
vertexes[3]:=tmpPoint;
tmpPoint.X:=(vertexes[0].X+Self.width div 4) ;
tmpPoint.Y:=round(vertexes[0].Y+Self.height/1.33) ;
vertexes[4]:=tmpPoint;
tmpPoint.X:=Self.MainPoint.X;
tmpPoint.Y:=vertexes[0].Y+Self.height;
vertexes[5]:=tmpPoint;
end;
Визуализация происходит по такому же способу, как и визуализация полигона
2.4 Программная реализация ТМО
procedure TTMO.Draw(img:TBitmap);
var
y:integer;
tmp:TBorders;
i:integer;
begin
for y := 0 to img.Height do
begin
tmp:=self.CalcBorders(y,0);
for i := 0 to tmp.Count div 2-1 do
drawHorLine(tmp.elements[i*2].pos,
tmp.elements[i*2+1].pos,y,img,color);
end;
end;
function TTMO.CalcBorders(Y:integer;Weight:smallint =1):TBorders;
var
i,j:integer;
tmp:TBorders;
temp:TSInf;
M:TBorders;
xRl:array[0..50]of integer;
xRr:array[0..50]of integer;
k,l:integer;
Q,Qnew:smallint;
begin
M :=(operand1).CalcBorders(Y,1);
tmp :=(operand2).CalcBorders(Y,2);
for i := 0 to tmp.Count-1 do
begin
M.elements[M.Count]:=tmp.elements[i];
inc(M.Count);
end;
for j := 0 to M.Count-2 do
for i := 0 to M.Count-2 do
if M.elements[i].pos>M.elements[i+1].pos then
begin
temp := M.elements[i];
M.elements[i] := M.elements[i+1];
M.elements[i+1]:= temp;
end;
Q:=0;
k:=0;l:=0;
for i := 0 to M.Count-1 do
begin Qnew := Q + M.elements[i].dl;
if (operation=TMOIntersection) and ((Q<>3) and (Qnew=3)) then
begin
xrl[k]:=M.elements[i].pos;inc(k);
end
else
if (operation=TMOIntersection) and ((Qnew<>3) and (Q=3)) then
begin
xrr[l]:=M.elements[i].pos;inc(l);
end
else
if (operation=TMOXor) and ((not (Q in [1,2])) and (Qnew in [1,2])) then
begin
xrl[k]:=M.elements[i].pos;inc(k);
end
else
if (operation=TMOXor) and ((Q in [1,2]) and (not (Qnew in [1,2]))) then
begin
xrr[l]:=M.elements[i].pos;inc(l);
end;
Q:=Qnew;
end;
result.Count:=0;
for i := 0 to (k-1) do
begin
result.elements[i*2].pos:=xrl[i];
result.elements[i*2+1].pos:=xrr[i];
result.elements[i*2].dl:=Weight;
result.elements[i*2+1].dl:=-Weight;
inc(result.Count);
inc(result.Count);
end;
end;
2.5 Программная реализация непрерывных геометрических преобразований
Для реализации выполнения геометрических преобразований (перемещение, вращение, масштабирование) фигур, в класс TGObject были добавлены методы, реализующие возможность преобразования, как в дифференциальной форме, так и в интегральной форме.
procedure TGObject.rotate(angle: double; point: TPoint); //поворот
var
transform1,transform, tmpTransform:TMatrPreobr;
begin
transform1:=EdMatr;
transform1[3,1]:=-point.X;
transform1[3,2]:=-point.y;
transform:=EdMatr;
transform[1,1]:=cos(angle);
transform[1,2]:=-sin(angle);
transform[2,1]:=sin(angle);
transform[2,2]:=cos(angle);
transform[3,3]:=1;
tmpTransform:=MatrUmnog(transform1, transform);
transform1:=EdMatr;
transform1[3,1]:=point.X;
transform1[3,2]:=point.y;
transform:=MatrUmnog(tmpTransform, transform1);
M:=transform;
end;
procedure TGObject.scalePoint(coefX, coefY: double; point: TPoint); //масштабирование относительно произвольного центра
var
transform1,transform, tmpTransform:TMatrPreobr;
begin
transform1:=EdMatr;
transform1[3,1]:=-point.X;
transform1[3,2]:=-point.Y;
transform:=EdMatr;
transform[1,1]:=coefX;
transform[2,2]:=coefY;
transform[3,3]:=1;
tmpTransform:=MatrUmnog(transform1, transform);
transform1:=EdMatr;
transform1[3,1]:=point.X;
transform1[3,2]:=point.Y;
transform:=MatrUmnog(tmpTransform, transform1);
M:=transform;
end;
procedure TGObject.normalizePoints; //преобразует матрицу преобразований к единичной (дифференциальное геометрическое преобразование)
var
i:integer;
tmpPoint:TPoint;
tmpPoint2:TPoint;
begin
for i := low(_Points) to high(_Points) do
begin
tmpPoint:=_Points[i];
tmpPoint2.X:=Round((M[1,1]*tmpPoint.X) + (M[2,1]*tmpPoint.y) + (M[3,1]));
tmpPoint2.Y:=Round((M[1,2]*tmpPoint.x) + (M[2,2]*tmpPoint.y) + (M[3,2]));
_Points[i]:=tmpPoint2;
end;
tmpPoint:=Position;
tmpPoint2.X:=Round((M[1,1]*tmpPoint.X) + (M[2,1]*tmpPoint.y) + (M[3,1]));
tmpPoint2.Y:=Round((M[1,2]*tmpPoint.x) + (M[2,2]*tmpPoint.y) + (M[3,2]));
Position:=tmpPoint2;
M:=EdMatr;
end;
3 Руководство пользователя
3.1 Запуск приложения, основные функции
Для запуска приложения, необходимо найти в директории программы файл "kurs.exe" и запустить его. Когда приложение будет запущено, на экране появится окно программы. Рисунок 3.1. Окно программы
В соответствии с техническим заданием программа включает систему подсказок - всплывающие подсказки на элементах управления.
Программа обладает несколькими режимами работы: * Рисование отрезка прямой
* Рисование кривой Эрмита
* Рисование фигуры "Крест"
* Рисование фигуры "Уголок 1"
* Геометрические преобразования * Синтезирование фигур
Кроме перечисленных режимов, в программе предусмотрены возможности: * Удаление фигур
* Выбор цвета фигуры
3.2 Удаление фигур
Для удаления фигуры, необходимо щёлкнув на фигуре правой кнопкой мыши вызвать контекстное меню и выбрать пункт "удалить".
3.3 Выполнение геометрических преобразований фигур
Режим выполнения геометрических преобразований включается при нажатии одной из приведённых кнопок:
3.3.1 Параллельный перенос
Для выполнения параллельного переноса, необходимо нажать кнопку и зажать левую кнопку мыши над фигурой операндом
3.3.2 Поворот относительно произвольного центра
Для выполнения поворота, необходимо нажать кнопку и зажать левую кнопку мыши над фигурой операндом, после чего вращение будет задаваться углом между указанным центром и курсором мыши
3.3.3 Масштабирование относительно заданного центра
Для масштабирования относительно заданного центра, необходимо нажать кнопку.
3.3.4 Масштабирование по оси Y относительно центра объекта
Для масштабирования по оси Y относительно центра объекта необходимо нажать кнопку.
3.4 Изменение цвета фигуры
Для изменения цвета фигуры , необходимо щёлкнув на фигуре правой кнопкой мыши вызвать контекстное меню и выбрать пункт "Изменить цвет".
3.5 Рисование отрезка прямой
Для перехода в режим рисования отрезка прямой, нажмите кнопку 1. Координаты начала отрезка задаются зажатием левой клавиши мыши в области рисования
2. Координаты конца отрезка задаются в момент отпускания левой клавиши мыши в области рисования
3.6 Рисование кривой Эрмита
Для перехода в режим рисования кривой Эрмита, нажмите кнопку Кривая Эрмита задается четырьмя сменами состояния(здесь и далее смена состояния - любое из двух событий, нажатие клавиши, отпускание клавиши) левой кнопки мыши в области рисования:
1. Координата начала кривой
2. Координата конца кривой
3. Координата конца касательного вектора к началу кривой
4. Координата конца касательного вектора к концу кривой
3.7 Рисование фигуры Крест
Для перехода в режим рисования звезды, нажмите кнопку Звезда задается четырьмя сменами состояния левой кнопки мыши в области рисования: 1. Координата левой нижней точки
2. Координата задающая ширину и высоту фигуры
3.8 Рисование фигуры "Уголок 1"
Для перехода в режим рисования фигуры "Уголок 1", нажмите кнопку или воспользуйтесь главным меню программы.
Фигура "Уголок 3" задается двумя кликами по области рисования:
1. Координата прямого угла
2. Координата задающая ширину и высоту фигуры
3.9 Выполнение теоретико-множественных операций над фигурами (синтезирование объектов)
В программе реализована возможность синтезирования закрашиваемых объектов, т. е. синтезировать отрезки прямой и кривой в программе недопустимо.
Для перехода в режим выполнения теоретико-множественных операций над фигурами, нажмите кнопку соответствующую необходимой ТМО .
Синтезирование двух фигур осуществляется двумя сменами состояния левой кнопки мыши по области рисования. Первая смена состояния задает первый операнд операции, вторая смена состояния - второй операнд. Если во время смены состояния в области мыши не находилось фигур, то ТМО не создаётся.
4 Библиографический список
1 Компьютерная графика: Методические указания к лабораторным работам и курсовому проектированию / Самар. гос. техн. ун-т.; сост. А.И. Пугачев, Самара, 2010.
2 Лекционный курс "Основы компьютерной графики" А.И. Пугачев, 2011 г.
Содержание
1. Техническое задание2
Индивидуальное задание для курсовой работы.3
2. Описание процесса разработки4
2.1 Выбор языка программирования и среды разработки4
2.2 Разработка структур данных для представления примитивов и сложных объектов, конструируемых с помощью ТМО4
2.2.1 Класс TGObject5
2.2.2 Класс Line5
2.2.3 Класс TER6
2.2.4 Класс TPolygon6
2.2.5 Класс TAngle36
2.2.6 Класс TStar36
2.2.7 Класс TTMO6
2.3 Разработка способов задания примитивов и процедур их визуализации7
2.4 Программная реализация ТМО9
2.5 Программная реализация непрерывных геометрических преобразований11
3 Руководство пользователя13
3.1 Запуск приложения, основные функции13
Рисунок 3.1. Окно программы13
3.2 Удаление фигур14
3.3 Выполнение геометрических преобразований фигур14
3.4 Изменение фигуры14
3.5 Рисование отрезка прямой15
3.6 Рисование кривой Эрмита15
3.7 Рисование параллелограмма15
3.8 Рисование фигуры "Уголок 3"15
3.9 Выполнение теоретико-множественных операций над фигурами (синтезирование объектов)16
4 Библиографический список17
2
Самара 2011
Документ
Категория
Рефераты
Просмотров
21
Размер файла
399 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа