Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Методические указание / Синтез графических образов простыми средствами.DOC
Скачиваний:
17
Добавлен:
15.06.2014
Размер:
205.82 Кб
Скачать

3 Практическое задание

3.1 Создать модель перемещающейся фигурки чередованием трех

образов с озвучиванием перемещения. Варианты фигурок:

- катящееся колесо со спицами;

- шагающий ослик;

- летящая со взмахами крыльев птица;

- гребец в лодке;

- прыгающий мяч, деформирующийся при ударе;

- летящий вертолет (вид сверху).

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

4 Работа с набором взаимодействующих образов

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

Рассмотрим пример программы, моделирующей поведение однородной сыпучей среды в поле силы тяжести.

uses Graph,Crt;

const M=50; { число объектов }

d=12; { размер объектов }

var x,y: array[1..M] of integer; { центры объектов }

stop,udar: array[1..M] of boolean;

P: Pointer;

Gd,Gm, i,r, Size : Integer;

PROCEDURE DOWN(i: integer);

{ Пошаговое перемещение объекта вниз }

var dx,dy: integer;

begin

dx:=0; dy:=r; { планируемое смещение координат объекта }

udar[i]:=true; { признак удара объекта о преграду }

{ случай перемещения без препятствий }

if GetPixel( x[i], y[i]+d-1)=0 then udar[i]:=false

else { внизу преграда, но слева свободно }

if ( GetPixel( x[i]-d, y[i] )=0 )

and( GetPixel( x[i]-d, y[i]+r)=0 ) then dx:=-d

else { внизу преграда, но справа свободно }

if ( GetPixel( x[i]+d, y[i] )=0 )

and( GetPixel( x[i]+d, y[i]+r)=0 ) then dx:=d

else dy:= 0; { смещение невозможно }

if dy > 0 then begin

PutImage( x[i]-r,y[i]-r, P^, 1); { стирание образа }

inc( x[i],dx);

inc( y[i],dy); { смещение позиции вывода }

PutImage( x[i]-r,y[i]-r, P^, 1) { вывод образа }

end;

{ если объект не двигался на предыдущем шаге }

if stop[i]=true then udar[i]:=false;

{ генерация звука при ударе и задержка видимости образа }

if udar[i] then sound(300); delay(2); NoSound;

{ если объект не сместился, то ставим признак его остановки }

if dy=0 then stop[i]:=true else stop[i]:=false end;

begin

Gd:=0; InitGraph(Gd,Gm,'');

Size:=ImageSize(0,0, d,d); { размер памяти для образов }

r:=d div 2; FillEllipse( r,r, r-1,r); { образ объекта }

GetMem(P, Size); { P - для хранения образа }

GetImage(0,0, d,d, P^);

{ Генерация начальных координат и свойств образов }

for i:=1 to M do begin

x[i]:=10*d + d*(i mod 6);

y[i]:= 4*d+2*d*(i div 6);

udar[i]:=false;

stop[i]:=false;

PutImage(x[i]-r,y[i]-r, P^,0)

end;

{ Рисование преград }

For i:=1 to d do

line (10*d, d*26+i, 18*d, d*30+i);

Bar(0, d*35, 400, d*36); ReadKey;

{ Процесс смещения объектов ( рисунок 1) }

Repeat

for i:=1 to M do DOWN(i);

Until KeyPressed;

readKey; CloseGraph end.

Рисунок 1 - Моделирование поведения сыпучей среды.

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