Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[35]

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

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

Страницы переключаются для просмотра на экране процедурой:

SetVisualPage(N);

где N - номер страницы. По умолчанию видна и активна страница с N=0. Страница активизируется для рисования процедурой:

SetActivePage(N);

Напомним, что вывод рисунков можно проводить и на невидимую страницу.

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

Приведем пример фрагмента программы - мультипликации с использованием чередования кодовых страниц (режим двух видеостраниц).

k:= 2;{ количество кодовых страниц }

for i:= 1 to 100 do begin j:= i mod k;{ j - номер кодовой страницы }

SetActivePage(j);{ активизируем страницу без ее показа }

ClearDevice;{ стираем старый рисунок }

SetfillStyle(1, i div 15 +1); { изменение цвета заполнения через 15 стр. } Bar(1, 1, i+10, i+5);{ строим новый рисунок }

SetVisualPage(j); delay(40){ показываем страницу }

Until KeyPressed;

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

Практическое задание N 1. 64

1.С использованием двух видеостраниц составить программу вывода на экран картины: приближение гор разного цвета ( увеличивать размер гор ).

2.С использованием двух видеостраниц составить программу вывода на экран картины: приближение облаков разного цвета.

3.Создать "бегущую строку" в графическом режиме с выводом части буфера (надписи) на невидимую страницу и сменой видеостраниц.


1. 15. 5. 3. Мультипликация с управлением движения образа

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

dx:= 1; dy:= 1; x:= 100; y:= 100;

Xmax:= GetMaxX;

PutImage(x, y, P, xold:= x; yold:= y c:= readkey; if c = #0 then c:=

{ пошаговые перемещения по осям X и Y } { начальные координаты смещаемого образа } Ymax:= GetMaxY;

case c of #72

PutImage(xold, yold,

Until c = #27;

{ выводим образ (запомненный ранее в P1A) } { запоминаем координаты } { считываем код клавиши в переменную типа char } readkey;

{ анализируем код нажатой клавиши }

{ смещение вверх } { смещение влево } { смещение вниз } { смещение вправо } { стираем образ } { при нажатии клавиши Esc перемещение прекратится }

if y > 1 then y:= y - dy; if x > 2 then x:= x - dx; if y < Ymax-100 then y:= y if x < Xmax-20 then x:= x P, 1)

Практическое задание N 1. 65

1.Перемещать по экрану стрелку- указатель под управлением курсорных клавиш с озвучиванием движения разной частотой звука в зависимости от направления перемещения.

2.Выполнить п. 1 так, чтобы стрелка всегда указывала направление своего перемещения.

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

1. 15. 5. 4. Модификация контурного изображения

В производстве мультфильмов широко используется следующий метод анимации (плавной модификации контурного изображения):

1.Задается массив координат узловых точек исходного (начального) контурного изображения (X1[1. . N], Y1[1. . N]). Соединяя определенным образом эти точки отрезками прямых, получаем изображение.

2.Задается массив координат узловых точек целевого (конечного) контурного изображения (X2[1. . N], Y2[1. . N]). Количество точек одинаково для обоих массивов.

3.Плавной модификацией исходного образа получаем целевое изображение. Для этого последовательно находятся наборы координат X[1. . N], Y[1. . N] промежуточных образов. Каждую i- точку промежуточного образа выбирают на отрезке прямой между соответст-


вующими точками исходного и целевого контуров, т. е. между точкой (X1[i], Y1[i]) и точкой (X2[i], Y2[i]). Таким образом отрезок делится на "m" частей, где m - количество промежуточных образов, включая целевой. Промежуточные образы перерисовывают, постепенно удаляясь от исходного образа.

X1[i] -► X[i] -► X2[i]

Y1[i] -► Y[i] -► Y2[i]

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

x[i]:= x1[i] + (x2[i] - x1[i])*k/m; y[i]:= y1[i] + (y2[i] - y1[i])*k/m;

где k - номер промежуточного образа, m - количество делений отрезка.

Перерисовку образов удобно делать двойным рисованием в режиме SetWriteMode(1), либо используя процедуры работы с видеопамятью в режиме XorPut. Задержка видимости образа (delay) определяет скорость преобразования. В приведенной ниже демонстрационной программе задается исходный контур из 12 точек X1[i], Y1[i] - координаты узлов на квадрате, а целевой контур из 12 точек X2[i], Y2[i] - координаты вершин звезды.

uses Graph, Crt;

var Gd, Gm, i, j, k, n, xc, yc, r, m: integer;

x, y, x1, y1, x2, y2: array[1..12] of integer; alfa: real; begin

Gd:=Detect; InitGraph(Gd, Gm, ); SetWriteMode(1);

{ координаты узлов на квадрате - исходной фигуры: } for i:=7 to 10 do begin x1[i]:= 10; y1[i]:= 10+(i-7)*40 end; for i:=1 to 4 do begin x1[i]:=130; y1[i]:=130-(i-1)*40 end; x1[11]:= 50; x1[12]:= 90; y1[11]:=130; y1[12]:=130; x1[ 6]:= 50; x1[ 5]:= 90; y1[ 5]:= 10; y1[ 6]:= 10;

{ координаты узлов на звезде - целевой фигуры: } xc:= 500; yc:= 300;{ центр звезды }

for i:= 1 to 12 do begin alfa:= (1-i)*(2*pi)/12;

if (i mod 2)=0 then r:=30 else r:=100; x2[i]:= xc + round(r*cos(alfa)); y2[i]:= yc + round(r*sin(alfa))

m:= 60;{ координаты узлов на промежуточных образах: }

for k:= 0 to m do begin

for i:=1 to 12 do begin x[i]:=x1[i]+round((x2[i]-x1[i])*k/m);

y[i]:=y1[i]+round((y2[i]-y1[i])*k/m)



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53]