Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Движение с использованием динамической памяти




Манипулирование фрагментами изображений.

Лекция 3.

Begin

Движение маленькой окружности(зеленая с желтой окантовкой) по большой окружности красного цвета.

Рассмотрим еще одну процедуру FloodFill(x,y:integer; Border: word)

Эта процедура служит для заполнения с помощью SetFillStyle стилем внутренней или внешней области фигуры.

х,y – корд. точки внутри или вне фигуры;

Border –цвет - используется для заполнения области, ограниченной этим цветом, текущим образцом закраски;

Если точка с координатами х,y находится внутри замкнутой области, то заполняется внутренняя область, если точка находится вне области, то закрашивается внешняя область.

Окружность будем обходить за n шагов. Чем больше n, тем медленней движение.

Шаг - dt=2pi/n

tn=0

tk = 2pi

x=r cos(t);

y = r sin(t)

Program main;

uses graph,crt;

const

r=100;

n=50;

r1=10;

{ движение okr.}

var

d,m,i,ckx,cky,x,y:integer;

t,dt:real;

d:=detect;

initgraph(d,m,'c:\tp\bgi');

ckx:=getmaxx div 2;

cky:=getmaxy div 2;

setcolor(red); цвет большой окр.

circle(ckx,cky,r);

t:=0;

dt:=2*pi/n;

for i:=1 to n do

begin

x:=ckx+round((r+r1+3)*cos(t));

y:=cky-round((r+r1+3)*sin(t));

setcolor(yellow);

circle(x,y,r1); мал.окр.

setfillstyle(1,green); сплошная заливка зел. Цв.

floodfill(x,y,yellow); окантовка желтая

delay(5000);

setcolor(black);

setfillstyle(1,black); закраска цветом фона

floodfill(x,y,black);

circle(x,y,r1);

t:=t+dt;

end;

readkey;

closegraph;

end.

Можно стирать изображение процедурой ClearDevice.

Для отображения движения более сложных изображений манипулируют фрагментами изображения. Имеется ряд процедур, позволяющих сохранять и восстанавливать отдельные фрагменты изображения на экране. Можно выделить прямоугольную область экрана(размер изображения) и записать ее в буфер, а затем выводить этот образ в разных местах экрана.

Для этого необходимо:

1. узнать размер изображения(size). Это делается при помощи функции ImageSize(x1,y1,x2,y2:integer);

Функция возвращает размер изображения в байтах.

x1,y1,x2,y2 – координатыпрямоугольной области экрана где находится изображение. Образ изображения удобно хранить в динамической памяти, поэтому необходимо выделить память для хранения образа.

2. Выделить память Getmem(p,<size>)

3. Поместить изображение в буфер
GetImage(x1,y1,x2,y2:integer; var BitMap). BitMap – нетипизированный параметр, это переменная-буфер(чаще всего динамическая), размер которой достаточен для сохранения изображения. Сюда будет помещена копия видеопамяти с фрагментом изображения;

4. Возвратить образ фрагмента из памяти на экран можно процедурой
PutImage(x1,y1:integer; var BitMap; Mode:word)

x1,y1 – координаты левого верхнего угла прямоугольной области экрана, куда будет выведено узображение;

BitMap – переменная в которой находится сохраненное изображение;

Параметр Mode определяет режим вывода.

Режимы вывода:

NormalPut=0 замещение существующего изображения

XorPut=1 исключающее или

OrPut=2 или

AndPut=3 и

NotPut=4 инвертирование

Каждая константа соответствует двоичной операции. Параметр Mode фактически определяет какой двоичный оператор используется при выводе на экран(вид преобразования пикселей), т. е. определяет способ наложения изображения из буфера на уже существующее на экране изображение.

 

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

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

Пример.

Движение закрашенной окружности по горизонтали.

Program main;

{движение закрашенной окружности по горизонтали

слева направо по ценру экрана}

uses graph,crt;

const

r=20;

h=20;

var

d,m,x,y,ckx,cky,size,xk:integer;

p:pointer;

begin

d:=detect;

initgraph(d,m,'');

setbkcolor(blue);

ckx:=r;

cky:=getmaxy div 2;

setcolor(yellow);

circle(ckx,cky,r);{рисует окружность}

setfillstyle(1,red);

floodfill(ckx,cky,yellow);

readkey;

x:=0;

y:=cky-r;

xk:=getmaxx-2*r;

size:=imagesize(x,y,x+2*r,y+2*r);

getmem(p,size);

getimage(x,y,x+2*r,y+2*r,p^);{сохраняет изобр. в буфере}

repeat

delay(10000);

putimage(x,y,p^,1);{стирает}

x:=x+h;

putimage(x,y,p^,1);{рисует заново}

until x>xk;

closegraph;

freemem(p,size);

end.

Движение с использованием клавиш управления.

#77 –вправо, #72 – вверх, #75 – влево, #80 – вниз, #27 – ESC.

В центре экрана нарисуем окружность. Клавишами с кодами #77 и #75 переместим окружность вправо и влево по горизонтали. Клавишей с кодом #72 переместим окружность вверх с текущей позиции, при этом окружность будет уменьшаться в размере. Клавишей с кодом #80 переместим окружность вниз с текущей позиции, при этом окружность будет увеличиваться в размере. По нажатию клавиши ESC(#27) программа прекращает свою работу.

Program main;

{ движение с использованием клавиш управления.

Слева направо, вверх - уменьшение, вниз - увеличение}

uses graph,crt;




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 386; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.