WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     || 2 | 3 | 4 |
Министерство общего и профессионального образования Российской Федерации Уфимский государственный авиационный технический университет Кафедра технической кибернетики МЕТОДИЧЕСКИЕ УКАЗАНИЯ к лабораторным работам по курсу "Интерактивная машинная графика" для подготовки инженеров по специальности 220200 "Автоматизированные системы обработки информации и управления" Часть 2 "Линейчатые графические образы" Уфа 1997 2 Составитель: О.В. Трушин УДК 681.3.06 Методические указания к лабораторным работам по курсу "Интерактивная машинная графика" для подготовки инженеров по специальности 220200 "Автоматизированные системы обработки информации и управления" Часть 2. "Линейчатые графические образы" / Уфимск. гос. авиац. техн. унив-т; Сост. О. В. Трушин. - Уфа, 1997. - 35 с.

Приведены задания для лабораторных работ по второй части курса "Интерактивная машинная графика", где рассматриваются приемы и методы синтеза линейчатых графических образов с использованием как простых, так и достаточно сложных алгоритмов. Рассматриваемые алгоритмы реализованы на языке Turbo-Pascal_7 в форме, позволяющей при необходимости легко адаптировать их для других систем программирования.

Ил. 6. Библиогр.: 10 наимен.

Рецензенты: В. Н. Мукасеева М. Е. Сидоров 3 Содержание Стр.

Введение........................................................................................ 4 Лабораторная работа № 1.

Алгоритмы синтеза фигур из отрезков прямых............................ 6 Лабораторная работа № 2.

Приемы синтеза линейчатых графических узоров....................... 12 Лабораторная работа № 3.

Применение рекурсии при синтезе графических образов............. 19 Лабораторная работа № 4.

Растровые алгоритмы................................................................... 26 Список литературы....................................................................... 34 4 Введение Большинство компьютерных графических образов при ограниченности вычислительных ресурсов чаще всего создается как набор отрезков прямых линий, отображающий обычно каркас моделируемого объекта.

Подобные модели объектов легко и быстро можно отображать и при необходимости трансформировать как для статических, так и для динамических сцен, в особенности трехмерных. Объекты при этом кодируются как совокупность набора координат вершин и последовательности обхода контура по этим вершинам.

При работе с линиями можно определять их режимы вывода и стили.

Для отрезков прямых линий режим построения задается оператором SetWriteMode( N ) N=0 ( режим CopyPut ) - замещение линией изображения на экране, этот режим используется по умолчанию, N=1 ( режим XorPut ). - изображение комбинируется. По логической операции Xor ("исключающее ИЛИ") исходное значение цвета пиксела на экране побитово складывается с цветом пиксела выводимой линии. Результирующий бит равен единице при различных значениях соответствующих бит, иначе - равен нулю.

Например, при выводе красной линии на желтом фоне в режиме XorPut получим 0100 ( красный ) Xor 1110 ( желтый ) 1010 ( светло-зеленый) Функция Xor, примененная к одной переменной дважды, восстанавливает ее исходное значение ( J xor I ) xor I = J. При повторном проведении линии на том же месте в режиме XorPut изображение этой линии уничтожается, а цвет пикселов экрана становится исходным 1010 ( светло-зеленый) Xor 0100 ( красный ) 1110 ( желтый ) Этот прием удобно использовать при создании движущихся линейчатых изображений без порчи фонового изображения.

Толщину и форму ( стиль ) линий отрезков прямых, прямоугольников, окружностей, эллипсов можно задать оператором SetLineStyle( F, P, T ), где F - форма, Р - стиль, T - толщина линии.

Форма линии задается как:

F=0 - сплошная, F=1 - пунктирная, F=2 - штрих-пунктирная, F=3 - штриховая, F=4 - форма линии определится параметром Р, причем при F<4 значение Р игнорируется.

Стиль линии Р - это число, двоичное представление которого отображает заполнение повторяющегося фрагмента линии длиной 16 пикселов.

Если разряд числа равен 1, то пиксел высвечивается, 0 - не высвечивается. Удобно использовать шестнадцатеричную форму записи числа. Например:

P = $35F1 = 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 ( двоичное ) отобразит стиль:

Можно использовать десятичную форму записи:

0<= P <= 65535= 216-1.

Толщина линии может принимать два значения:

T=1 - тонкая ( 1 пиксел ), T=3 - толстая ( 3 пиксела ).

Применяя к исходным стилям линий пользователя логические операции, можно получать новые стили. Например:

P1 and P2 - линии из совпадающих элементов, P1 or P2 - добавление элементов стилей, P1 xor P2 - обнуление совпадающих элементов, not P2 - инверсный для P2 стиль.

Лабораторная работа № АЛГОРИТМЫ СИНТЕЗА ФИГУР ИЗ ОТРЕЗКОВ ПРЯМЫХ 1 Цель работы Практическое освоение простых приемов создания линейчатых графических образов и синтез с использованием этих приемов сложных графических объектов.

2 Построение многоугольников.

Наиболее универсальным в графике BGI при построении линейчатых образов является использование процедур Line, LineTo и LineRel. Причем процедуры LineTo( x, y) и LineRel( dX, dY) в отличие от процедуры Line( x1,y1, x2,y2) при своем исполнении перемещают текущий указатель.

Это удобно при последовательном выводе контуров из отрезков прямых.

Иногда целесообразно применение процедур DrawPoly и FillPoly, обрабатывающих типизированные наборы координат вершин объекта.



Пример программы, включающей процедуры построения правильных многоугольников и звездообразных фигур uses Graph, Crt;

var Gd,Gm, i: Integer;

{------------------------------------------------------------- Процедура рисования звезды с центром Xc,Yc, радиусами описанной ( r1 ) и вписанной ( r2 ) окружностей, числом лучей N и цветом color.

При r1=r2 получим правильный многоугольник.

----------------------------------------------------------------------------------------} PROCEDURE Star1( Xc,Yc, r1,r2, N, color: integer);

var ugol: real;

r,i: integer; { угол и радиус для текущей вершины } x,y: array[1..1000] of integer; { массивы координат вершин фигуры } begin if n>500 then Exit; { ограничение по числу вершин звезды } setColor(color); { цвет фигуры } for i:=1 to 2*N do begin { перебор вершин звезды } ugol:= i*pi/N; { угол для текущей вершины } if i mod 2 =0 then R:=r else R:=r2; { чередование радиуса для текущей вершины } x[i]:= Xc + round( R*cos(ugol)); { массивы координат } y[i]:= Yc + round( R*sin(ugol)) end; { для вершин фигуры } MoveTo( x[2*N], y[2*N]); { переход к последней вершине } { последовательный обход вершин } for i:=1 to 2*N do LineTo( x[i], y[i]) end;

{------------------------------------------------------------------- Процедура рисования звезды с центром Xc,Yc, радиусом R описанной окружности, числом вершин N и цветом color с самопересечениями сторон.

--------------------------------------------------------------------} PROCEDURE Star2( Xc,Yc, R, N, color: integer);

var i,j: integer;

ugol: real; { угол для текущей вершины } x,y: array[1..500] of integer; { массивы координат вершин фигуры } begin if n>500 then exit; { ограничение по числу вершин звезды } setColor(color); { цвет фигуры } for i:=1 to N do begin { перебор вершин звезды } ugol:= i*2*pi/N; { угол для текущей вершины } x[i]:= Xc + round( R*cos(ugol)); { массивы координат } y[i]:= Yc + round( R*sin(ugol)) end; { вершин фигуры } MoveTo( x[N], y[N]); { переход к последней вершине } for i:=1 to N do begin { обход вершин с перескоками } if N mod 2 =0 then j:=(3*i-1)mod N +1 { если N четно, то шаг через две вершины } else j:=(2*i-1)mod N +1; { если нечетно, то шаг через одну вершину } if( n<5)or( n=6) then j:=i; { вырожденные случаи } LineTo( x[j], y[j]) end; { рисование при обходе вершин } end;

begin Gd:=0; InitGraph(Gd, Gm, 'c:\tp7\bgi');

{ демонстрация работы программ построения звезд } for i:=1 to 7 do Star1(i*80, i*60, 50,20, i+3, i+8);

ReadKey; Cleardevice;

for i:=1 to 7 do Star2(i*80, i*60, 50, i+4, i+8);

ReadKey; CloseGraph end.

3 Практическое задание 3.1 Составить процедуры рисования многоугольников и звезд с дополнительными отрезками.

3.2 Составить процедуры рисования многоугольников и звезд с растяжкой по горизонтали или вертикали.

3.3 Составить программу заполнения прямоугольных областей орнаментом с использованием процедур рисования правильных многоугольников и звезд.

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

uses Graph,Crt;

var Gd,Gm, Gx,Gy, i,j, k,n, xc,yc, r, rx,ry, nx,ny,nn: integer;

{---------------------------------------------------- Процедура рисования звезды с центром Xc,Yc, радиусом R описанной окружности, числом вершин N и цветом color с самопересечениями сторон. Отрезками соединяются наиболее удаленные пары вершин, но не диаметрально противоположные.

----------------------------------------------------------------------------------------} PROCEDURE Star3( Xc,Yc, R, N, color: integer);

var i,j,k, step: integer;

ugol: real; { угол для текущей вершины } x,y: array[1..500] of integer; { массивы координат } { вершин фигуры } begin if n>500 then exit;

setColor(color); { цвет фигуры } for i:= 1 to N do begin { перебор вершин звезды } ugol:= i*2*pi/N; { угол для текущей вершины } x[i]:= Xc + round( R*cos(ugol));

y[i]:= Yc + round( R*sin(ugol));

Circle( x[i],y[i], 2) end;

MoveTo( x[N], y[N]); { переход к последней вершине } step:=(N-1) div 2; { число пропускаемых вершин } k:=1; { счетчик числа обходов } for i:=1 to N do begin { обход вершин с перескоками } j:=(step*i-2+k)mod N +1; { номер очередной вершины } LineTo( x[j], y[j]); { рисование при обходе вершин } { если контур обхода замыкается раньше перебора всех точек } if ( j=N)and( i

begin Gd:=0; InitGraph(Gd, Gm, 'c:\tp7\bgi');

{ демонстрация работы программы построения звезд } Gx:=GetMaxX; Gy:=GetMaxY;

nn:=20; { общее количество рисунков } nx:=5; { количество рисунков по горизонтали } ny:=(nn-1) div nx +1; { и по вертикали } rx:=Gx div nx;

ry:=Gy div ny; { размеры области для одного рисунка } if rx>ry then r:=ry div 2 - else r:=rx div 2 -5; { размер рисунка } for k:=1 to nn do begin i:=(k-1) mod nx +1; { позиция рисунка по горизонтали } j:=(k-1) div nx +1; { позиция рисунка по вертикали } xc:= rx div 2 +(i-1)*rx; { координаты центров рисунков } yc:= ry div 2 +(j-1)*ry;





N:=k+2; { число вершин фигуры } Star3(xc,yc, r, N, 8) end;

ReadKey; CloseGraph end.

5 Практическое задание 5.1 Составить процедуру рисования N-угольной звезды, где N - четное число. Звезда должна состоять из двух пересекающихся правильных N/2-угольников ( например, при N=8 - пересечение двух квадратов ).

5.2 Составить процедуру рисования N-угольной звезды, где N кратно трем. Звезда должна состоять из трех пересекающихся правильных N/3-угольников ( при N=9 - пересечение трех треугольников ).

6 Стили и режимы вывода линейчатых фигур Приведем пример операторов для рисования движущейся линейчатой фигуры (прямоугольника), демонстрирующий в режиме XorPut взаимодействие цветов пикселов выводимых линий и фона.

SetWriteMode(1); { режим вывода XorPut } a:= 200; b:= 100; { стороны прямоугольника } x:= GetMaxX div 2;

y:= GetMaxY div 2; { координаты левого верхнего угла } SetFillStyle(1,3);

Bar(x-50,y-50,x+100,y+100); { фон для картинки } Randomize;

Repeat x:=x-9+random(19);

y:=y-9+random(19); { случайные смещения координат } Rectangle(x, y, x+a, y+b); { рисование фигуры } delay(300);

Rectangle(x, y, x+a, y+b); { стирание фигуры } Until KeyPressed;

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

7 Практическое задание 7.1 Составить программу, моделирующую прямолинейное перемещение звезды в пределах экрана. При достижении края экрана звезда должна менять направление и скорость перемещения (отражаться от преграды) и менять свой цвет.

7.2 Перемещать три звезды разного цвета в пределах экрана.

7.3 Организовать перемещение звезды с вращением. Для этого в процедуре рисования звезды ввести дополнительно в качестве параметра начальный угол, от которого будет проводиться расчет координат вершин звезды.

7.4 Модернизировать пункты задания 7.1 - 7.3, предварительно (с целью демонстрации особенностей режима XorPut) выведя на экран ряд вертикальных толстых линий разного цвета с одним из двоичных представлений (см. введение ):

0101010101010101, 1100011000110001, 1111110011111100, 0111011101110111, 1110001110001110, 1111000000001111.

7.5 Вывести на экран набор линий со стилями, заданными параметром РN = 16N2 +K, где N= 1.. 24, K=0.. 4. Линии располагать горизонтально.

7.6 Вывести на экран набор линий со стилями, заданными параметром РN = 2N, +K, где N= 1.. 15, K=0.. 4. Линии располагать под углом 45 градусов.

7.7 Создать эффект "бегущих огней" перерисовкой в режиме XorPut инверсными стилями набора из трех касающихся толстых пунктирных линий. Модернизировать этот метод, периодически перерисовывая линии с параметром, изменяемым регистровыми сдвигами (использовать процедуры shl или shr ).

Лабораторная работа № ПРИЕМЫ СИНТЕЗА ЛИНЕЙЧАТЫХ ГРАФИЧЕСКИХ УЗОРОВ 1 Цель работы Практическое освоение классических алгоритмов, методов и приемов создания линейчатых графических узоров.

2 Многократное рисование фигуры с поворотом относительно центра узора Наиболее простой, но при этом достаточно эффективно работающий метод синтеза узоров состоит в том, что центр многократно рисуемой фигуры (xf, yf) перемещают после очередного рисования относительно центра узора (xc,yc) по какому-либо закону ( рисунок 1).

За "центр фигуры" может быть принята любая точка, жестко связанная с фигурой.

0 yc xf X xc c Fx xf = xc + Fx("параметры"), Fy yf = yc + Fy("параметры").

yf f Y Рисунок Опишем в общем виде принцип составления программы рисования при вычислении Fx и Fy через радиус-вектор из центра узора.

for i:=1 to n do begin { перебор фигур, составляющих узор } ugol:=F_u(i); { угол поворота очередной фигуры } r:=F_r(i); { расстояние от центра узора до центра фигуры } rf:=F_f(i); { размер фигуры } color:=F_c(i); { цвет фигуры } x:=xc+round(r*cos(ugol));{ координаты центра очередной фигуры } y:=yc+round(r*sin(ugol));

{ вывод фигуры вызовом процедуры рисования } F_picture( x,y, rf, color) end;

Подбором функций F_u( i), F_r( i), F_f( i), F_c( i), числа и вида фигур можно добиться самых разнообразных декоративных эффектов. В общем случае фигура может перемещаться с вращением и деформировать ся. Примеры функций для построения узоров из окружностей и из квадратов ( рисунок 2):

xc:=100; yc:=100; { центр узора } n:=12; { число фигур, составляющих узор } for i:=1 to n do begin ugol:=2*pi*i/n;

r:=10*(i mod 2 +2);

rf:=20*(i mod 2 +1);

color:=(i-1) mod 3 +10;

x:=xc+round( r*cos(ugol));

y:=yc+round( r*sin(ugol));

setcolor(color); circle(x,y,rf) end;

yc:=300; for i:=1 to n do begin ugol:=2*pi*i/n;

r:=40; rf:=30;

x:=xc+round(r*cos(ugol));

y:=yc+round(r*sin(ugol));

rectangle(x-rf, y-rf, x+rf, y+rf) end;

Рисунок 3 Практическое задание 3.1 Нарисовать узор из 24 эллипсов с центром узора в середине экрана.

Радиусы очередного эллипса (Rx, Ry) и расстояние до центра узора циклически изменять.

3.2 Нарисовать узор из 20 прямоугольников. Длины сторон прямоугольников и расстояние от центра узора до левого верхнего угла прямоугольника изменять по закону, который обеспечит приемлемый декоративный эффект.

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

4 Создание узоров построением зеркальных отображений.

Pages:     || 2 | 3 | 4 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.