Разработка алгоритма и программы комплексной графики с динамическим объектом

Автор работы: Пользователь скрыл имя, 23 Сентября 2013 в 21:13, курсовая работа

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

Существует специальная область информатики, изучающая методы и средства создания и обработки изображений с помощью программно-аппаратных вычислительных комплексов, – компьютерная графика. Она охватывает все виды и формы представления изображений, доступных для восприятия человеком либо на экране монитора, либо в виде копии на внешнем носителе.

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

Введение………………………………………………………………….4
1.Текстовый режим
1.1 Управление экраном в текстовом режиме………………………..5
1.2 Управление динамиком……………………………………………..8
2. Графический режим
2.1 Управление экраном в графическом режиме……………………..9
2.2 Создание движущихся изображений………………………………20
3.Пояснения к программе……………………………………………….27
4. Практическое задание курсовой работы……………………………29
Заключение………………………………………………………………..33
Библиографический список ……………………………………………..34

Файлы: 1 файл

kursovaya.doc

— 1.88 Мб (Скачать файл)

DrawPoly(5,MP); {рисуем ломаную линию}

 

14. Процедура FillPoly (numPoints:word; Var PolyPoints) - рисует закрашенный многоугольник с указанными вершинами.

15. Процедура Circle (х, у, radius:word) - рисует окружность заданного радиуса radius с центром в точке (х, у).

16. Процедура Arc (х, у, stangle, endangle, radius: word) - рисует дугу окружности указанного радиуса radius от угла stangle до угла endangle. Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.

Существует специальная  процедура, которая позволяет определить координаты концов дуги.

17. Процедура GetArcCoord (Var ArcCoord:ArcCoordType) – возвращает координаты концов дуги через параметр-переменную специального типа ArcCoordType, который описан следующим образом:

Туре ArcCoordType = record

х, у, {центр дуги}

xstart, ystart, {начало дуги}

xend, yend:word {конец дуги}

end;

Например, нарисуем дугу и соединим ее концы:

Var ArcCoords: ArcCoordType;

Arc(100, 100, 0, 270, 30); {рисуем дугу}

GetArcCoords(ArcCoords); {определяет координаты концов дуги}

with ArcCoords do

Line(Xstart, Ystart, Xend, Yend); {рисуем соединяющую линию}

18. Процедура Pieslice (х, у, stangle, endangle, radius:word) - рисует заштрихованный сектор или окружность (если конечный угол равен начальному).

Углы отсчитываются  от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.

19. Процедура Ellipse (х, у, stangle, endangle, radiusX, radiusY: word) - рисует эллипс или его дугу.

20. Процедура Sector (х, у, stangle, endangle, radiusX, radiusY: word) - рисует заштрихованный эллипс или его сектор.

21. Процедура FillEllipse (х, у, radiusX, radiusY: word) - рисует заштрихованный эллипс.

 

Процедуры и  функции управления текстом. Текст в графическом режиме может быть выведен процедурами Write и WriteLn, но при этом управление выполняется аналогично текстовому режиму. Специально для работы с текстом в графическом режиме модуль Graph предлагает следующие процедуры и функции.

1. Процедура SetTextStyle (font, direction, charsize: word) – устанавливает текущий шрифт font, направление вывода строки direction и размер шрифта charsize.

Для установки шрифта используют специальные константы:

DefaultFont=0; {обычный}

TriplexFont=1; {полужирный}

SmallFont=2; {мелкий}

SanserifFont=3; {прямой}

GothicFont=4; {готический}

Направление вывода может быть либо горизонтальным, либо вертикальным:

HorizDir=0; {горизонтальное направление}

VertDir=1; {вертикальное направление}

Размер шрифта указывается  значением, на которое необходимо умножить исходный размер шрифта (8x8 точек). Таким  образом, шрифт можно увеличивать в целое число раз.

2. Процедура SetTextJustify(horiz, vert: word) - устанавливает способ выравнивания для горизонтального horiz и вертикального vert направлений вывода.

Способ выравнивания определяется относительно некоторой  точки с помощью специальных констант:

LeftText=0; {точка слева от текста}

CenterText=1; {точка по центру текста при горизонтальном направлении вывода}

RightText=2; {точка справа от текста}

BottomText=0; {точка под текстом}

CenterText=1; {точка по центру текста при вертикальном направлении вывода}

TopText=2; {точка над текстом}

3. Функция TextHeight(st:string):word - возвращает высоту строки st в точках.

4. Функция TextWidth(st:string):word - возвращает ширину строки st в точках.

5. Процедура OutText (st:string) - выводит строку, выравнивая ее заданным способом относительно текущей точки.

6. Процедура OutTextXY(x, y:word; st:string) - выводит строку st, выравнивая ее в соответствии с установленными режимами вертикального и горизонтального выравнивания относительно точки (х, у).

 

Процедуры управления окнами, страницами. Помимо управления цветом, рисования примитивов и вывода текстов модуль Graph содержит специальные процедуры управления окнами и страницами.

1. Процедура ClearDevice - очищает экран.

2. Процедура SetViewPort (х1, у1, х2, y2: word; clip:boolean) – устанавливает окно. Параметры xl, у1, х2, у2 определяют размеры окна, а параметр clip - будут ли видимы фрагменты рисунка, вышедшие за границы окна.

3. Процедура GetViewSettings(Var win:ViewPortType) - возвращает параметры последнего окна через параметр-переменную win типа ViewPortType:

Туре ViewPortType = record

x1,y1,x2,y2:word; {координаты}

clip:boolean; {отсечение}

end; ...

4. Процедура ClearViewPort - очищает окно, связывая все точки этого окна с 0 регистром палитры.

5. Процедура SetActivePage (pageNumber:word) - переключает активную страницу - делает активной страницу с указанным номером pageNumber. На активной странице строится нужное изображение, в то время как высвечиваться продолжает прежняя страница. Когда изображение готово, осуществляют переключение видимости страниц и появляется новое изображение.

6. Процедура SetVisualPage(pageNumber:word) - переключает видимость страниц.

Например:

SetVisualPage(0); {установили видимой 0 страницу}

SetActivePage(1); {установили активной 1 страницу}

Rectangle(10, 60, 30, 80); {вывели прямоугольник}

Readln; {убедились, что он не видим}

SetVisiialPage(1); {установили видимой 1 страницу - прямоугольник стал видимым}

 

Процедуры и  функции создания движущихся изображений. Модуль Graph предоставляет некоторые ресурсы для создания движущихся изображений.

1. Процедура GetImage(x1, y1, x2, y2:word; var p:pointer) - сохраняет в памяти прямоугольный фрагмент изображения. Параметры х1, у1, х2, у2 определяют прямоугольник. Параметр р должен содержать адрес буфера в памяти, куда копируется изображение. Размер этого буфера определяется с помощью специальной функции ImageSize.

2. Функция ImageSize(x1, y1, x2, y2:word):word - возвращает размер буфера, необходимого для сохранения прямоугольного фрагмента изображения.

3. Процедура PutImage(x, y:word; var p:pointer; bitblt:word) – выводит сохраненное изображение на экран в прямоугольную область с координатами верхнего левого угла (х, у). Параметр р должен содержать адрес буфера.

Способ наложения bitblt определяется специальными константами:

NormalPut=0;  {наложение со стиранием}

XorPut=1;   {побитное «исключающее или»}

OrPut=2;   {побитное «или»}

AndPut=3;   {побитное «и»}

NotPut=4;   {побитное «не»}

Так, если цвет точки был  розовым (12 = 11002) и на нее накладывается точка того же цвета (12 = 11002), то при разных способах наложения и стандартной палитре мы получим

NormalPut - 1100 - точка розового  цвета;

XorPut - 0000 - точка черного цвета (цвета фона);

OrPut - 1100 - точка розового  цвета;

AndPut - 1100 - точка розового цвета;

NotPut - 0011 - точка голубого  цвета.

Буфер под образ обычно размещается в динамической памяти.

Например:

Size:=ImageSize(0,0,99,99);

GetMem(p,Size); {выделяем память под буфер для сохранения  изображения}

х:=0;

у:=0;

Pieslice(50,50,0,360,7); {рисуем закрашенный круг}

GetImage(0,0,99,99,p^); {сохраняем изображение в памяти}

repeat

PutImage(x,y,p^,0); {выводим изображение на экран, стирание

выполняется чистым краем образа}

delay (100); {задержка}

х:=х+3;

у:=у+1;

until x>getmaxx-50; {выход по достижении конца экрана}

FreeMem(p, Size); {освобождаем динамический буфер}

 

 

2.2 Создание движущихся изображений

 

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

Сам «перемещаемый» объект может быть двумерным (плоским) и  трехмерным (пространственным), причем движение может осуществляться по двум типам траектории: лежащей в плоскости экрана или выходящей за нее.

Из аналитической геометрии  известны формулы, по которым можно, зная закон движения, определить изменения  положения каждой точки изображения  движущегося объекта на экране.

Движение плоских объектов. Любое сложное движение плоских объектов на экране складывается из базовых: перемещения, масштабирования и поворота. Формулы пересчета координат изображений для базовых видов движения следующие.

Рис. 8.9. Элементарные изменения изображения: а - перемещение; б- масштабирование; в - поворот

 

Перемещение (рис. 8.9, а)

x1 = x + dx,

y1 = y + dy,

где x, у - исходные координаты точки; x1, y1 - координаты точки после перемещения; dx, dy - смещения по оси х и у соответственно.

Масштабирование относительно точки С (хc, уc) (рис. 8.9, б):

x1 =(х-xсх + xс,

y1 =(у-yсу + yс,

где Mx, My - масштабы по х и у соответственно; хc, уc - координаты точки, относительно которой ведется масштабирование.

Поворот относительно точки С с координатами (хc, уC,) (рис. 8.9, в):

x1 = (х-xс)cosα + (у-yс)sinα + хc,

y1 = (у-yс)cosα - (х-xс)sinα + yс,

где α - угол поворота.

Пример 2. Разработать программу, которая демонстрирует на экране движение прямоугольника: прямоугольник улетает от нас к некоторой точке горизонта, одновременно вращаясь вокруг своей оси.

Обобщенный алгоритм последовательного показа кадров данной задачи выглядит следующим образом.

Начало:

Установить точку отсчета  координат (условное время).

Рассчитать координаты квадрата.

Цикл-пока не истекло время или не нажата любая клавиша

Установить цвет рисования.

Изобразить квадрат.

Приостановить выполнение программы на время просмотра  кадра.

Установить в качестве цвета рисования цвет фона.

Изобразить квадрат  цветом фона - стереть.

Изменить точку отсчета (условное время).

Пересчитать координаты квадрата.

все-цикл

Конец.

В а р и а н  т 1. Координаты вершин квадрата будем  хранить в специальных массивах х, у, а квадрат рисовать линиями, проводя их из одной вершины в другую. Изображение квадрата будет осуществлять специальная процедура Square.

Пересчет координат  вершин реализуем через разложение «движения» прямоугольника на элементарные составляющие (рис. 8.10): эффект удаления от зрителя получим, используя масштабирование относительно точки горизонта, эффект вращения - за счет поворота вокруг геометрического центра.

Рис. 8.10. Разложение движения

Вначале определим координаты вершин и центра квадрата после масштабирования, а затем координаты вершин после поворота вокруг центра

квадрата. Ниже приведена  соответствующая программа:

Program ex;

Uses Crt,Graph;

Const

r=100;

Type

mas=array[1.. 4] of integer;

Var

x, y, x1, y1:mas;

gd,gm,xn,yn,xc,yc,i,j,k1: integer;

t,k:real;

{изображение  квадрата по координатам его вершин}

Procedure Square(х,у:mas);

Begin

Line(x[1],y[1],x[2],y[2]);

Line(x[2],y[2],x[3],y[3]);

Line(x[3],y[3],x[4],y[4]);

Line(x[4],y[4],x[1],y[1]);

End;

{определение координат повернутой точки}

Procedure Pow(xc,yc,x,y:integer;t:real;var xl,yl:integer);

Begin

x1:=xc+round((x-xc)*cos(t))+round(y-yc)*sin(t));

y1:=yc+round((y-yc)*cos(t))-round((x-xc)*sin(t));

End;

{определение  координат точки после масштабирования}

Procedure Massch(xc,yc,x,y:integer; k:real; var x1,y1:integer);

Begin

x1:=round(x*k+(1-k)*xc);

y1:=round(y*k+(1-k)*yc);

End;

{основная программа}

Begin

gd:=detect;

InitGraph(gd,gm, 'd:\bp\bgi');

SetColor(2);

xn:=GetMaxX div 4;

yn:=GetMaxY div 3*2;

xc:=GetMaxX-xn;

yc:=GetMaxY-yn;

{расчет начальных координат вершин квадрата}

x[1]:=xn-r; y[1]:=уn-r;

x[2]:=xn+r; у[2]:=yn-r;

x[3]:=xn+r; y[3]:=yn+r;

x[4]:=xn-r; у[4]:=yn+r;

k:=0.99;

t:=0;

{покадровый вывод на экран}

while (t<1) and not KeyPressed do

begin

SetColor(2); {установим цвет рисования}

Square(x,y); {нарисуем квадрат}

t:=t+0.001; {увеличим угол поворота}

{масштабирование}

for j:=1 to 4 do {определим координаты вершин}

Massch(xc,yc,x[j],y[j],k,x1[j],y1[j]);

Massch(xc,yc,xn,yn,k,xn,yn); {определим координаты центра}

{поворот}

for j:=1 to 4 do {определим координаты вершин}

Pow(xn,yn,x1[j],y1[j],-t,x1[j],y1[j]);

Информация о работе Разработка алгоритма и программы комплексной графики с динамическим объектом