Реализация имитации движения графических объектов

 

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

нарисовать — пауза — стереть рисунок (нарисовать его в том же месте цветом фона)— изменить координаты изображения.

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

 

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

Для хранения фрагмента удобнее всего использовать динамическую область памяти. Получить размер памяти в байтах, необходимой для сохранения образа фрагмента, позволяет функция ImageSize(X1,Yl,X2,Y2:integer): word. Здесь (X1,YI) и (X2,Y2) — координаты верхнего левого и нижнего правого углов прямоугольника. Если полученный размер памяти больше 64Кб, то значение ImageSize = 0, a GraphResult=-1. Чтобы этого избежать, следует сохранять изображение по частям.

Полученный с помощью функции ImageSize размер памяти применяют в качестве входной информации для процедуры GetMem(p,Size), которая выделяет указанный объем памяти в динамической области. Здесь р — указатель на область памяти, Size — ее размер.

Процедура GetImage(Xl,Yl,X2,Y2:integer; var BitMap: word); сохраняет образ фрагмента в памяти, где XI,Y1,X2,Y2 — координаты фрагмента, BitMap — переменная, которая указывает, где сохраняется образ изображения. 

Процедура Putlmage(X,Y: integer; var BitMap, Mo-de:word); восстанавливает сохраненный в буфере Bit-Map прямоугольник, левый верхний угол которого задаётся координатами (X,Y). Параметр Mode задает режим вывода изображения.

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

 

                                                            Заключение

 

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

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

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

Писать программы не легко, но и не очень трудно.

Представьте себе почти готовую программу, где, скажем, порядка 10 тысяч команд, которая почему-то не желает работать. Компьютер пишет «ошибка», «ошибка», и чтобы понять, в чем она заключается, нужно поставить себя на место компьютера и в голове мысленно прокрутить всю программу за него.

Мне есть ещё над чем работать. Но думаю, моя  работа вам понравилась, ведь создавая его, мы с руководителем пытались заинтересовать и новичка, и профессионала.

Я считаю, что программисты – элита «компьютерщиков», они решают самые трудные задачи. Настоящие программисты, умеющие написать программу от начала и до конца, очень редки и ценятся на вес золота. Чтобы стать таким профессионалом, нужно обладать особым складом ума.

Обычно человек мыслит приблизительными категориями, а язык программирования, даже самый простой, никакой приблизительности не терпит. Компьютеру нужно «говорить» абсолютно четко, по пунктам. Если хотя бы одно место прописано недостаточно четко, компьютер остановится и выдаст ошибку.

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

Выбирайте эту сферу, если Вы:

– Любите информатику

– Обладаете техническим складом ума

– Внимательны, собранны

– Готовы решать сложные технические задачи

Успехов вам в изучении Паскаля.

Удовольствие, доставляемое успехом, всегда соразмерно труду, которого он стоил.

 

 

Литература

 

1.Павловский А.И. и др. Информатика: Учебное пособие для 10-ого кл. с углубленным изучением информатики с русским языком обучения/ А.И. Павловский, А.Е. Пупцев, П.Л. Гращенко.- Мн.: Нар. асвета, 2000.-223 с.: ил.

 

2.Павловский А.И. и др. Информатика: Учебное пособие для 11-ого кл. с углубленным изучением информатики с русским языком обучения/ А.И. Павловский, А.Е. Пупцев, Е.В. Нашкевич, Н.Н. Нарейко.- Мн.: Нар. асвета, 2000.-302 с.: ил.

 

3.Меженный О.А. М43 Turbo Pascal. Самоучитель.-М.: Издательский дом "Вильямс", 2004.-336с.: ил.

 

4.Абрамов С.А., Зима Е.В. Начало информатики.-М.: Наука. Гл. ред. физ.-мат. лит., 1989.-256с.

 

5.Абрамов С.А., Зима Е.В. Начало программирования на языке паскаль.-М.: Наука. Гл. ред. физ.-мат. лит., 1987.-112с.

 

6. И. Семакин, Л. Залогова, С. Русаков, Л. Шестакова. Информатика. Базовый курс. 9 класс.

 

7. http://saassl.at.tut.by/Grafika_Pascal/index16.htm

 

8. http://www.osnpas.com/

 

9. http://www.interface.ru/home.asp?artId=2962

 

10. http://www.welikeit.ru/pascal-graficavturbo.html

 

 

Приложение

Примеры графики в Турбо Паскаль

  Пример.

Uses Graph;

Var Driver, Mode: integer;

Procedure GrInit;

Begin

Driver:= Detect; {автораспознавание драйвера}

InitGraph (Driver, Mode,'');

If GraphResult<>0 then

Begin

Writeln ('Ошибка инициализации!');

Writeln ('Работа программы прервана');

Halt (1) {остановить выполнение программы с кодом завершения — 1}

End

End;

Begin

GrInit; {графические действия}

Readln;

CloseGraph

End.

 

 

    

Пример "Будильник".

Program Budil;

uses graph;

var grDriver:integer; grMode:integer;

Begin

grDriver:=Detect;

InitGraph(grDriver,grMode,''); {Смена цвета фона}

SetBkColor(14); {Смена цвета линии}

SetColor(5); {Рисование окружности}

Circle(250,180,60);

Circle(270,180,60);

Circle(210,235,7);

Circle(310,235,7);

Circle(260,180,7);

Circle(260,115,10);

SetColor(9); {Рисование линии}

Line(260,180,260,140);

Line(260,180,270,150);

Circle(260,230,5);

Circle(260,125,5);

Circle(230,180,5);

Circle(290,180,5);

readln;

End.

 

Пример Elka.

program elka;

uses graph;

var

grDriver:integer;

grMode:integer;

begin

grDriver:=Detect;

InitGraph(grDriver,grMode,'');

setbkcolor (14);

SetColor(0);

lineTo(100,250);

SetColor(6);

lineTo(100,275);

lineTo(150,275);

lineTo(150,250);

SetColor(2);

line(125,25,75,100);

line(75,100,175,100);

line(175,100,125,25);

line(125,100,50,175);

line(50,175,200,175);

line(200,175,125,100);

line(125,175,25,250);

line(25,250,225,250);

line(225,250,125,175);

readln;

end. 

 

Пример Dom.

program dom;

uses graph;

var

grDriver:integer;

grMode:integer;

begin

grDriver:=Detect;

InitGraph(grDriver,grMode,'');

{Смена цвета фона}

setbkcolor (14);

{Смена цвета линии}

SetColor(5);

{Рисование прямоугольников}

rectangle(25,75,100,150);

rectangle(100,75,225,150);

rectangle(50,100,75,150);

rectangle(150,100,175,125);

{Рисование линий}

line(25,75,75,25);

line(75,25,100,75);

line(200,25,225,75);

line(75,25,200,25);

readln;

end. 

 

Пример Машина_2.

PROGRAM MASHINA;

Uses graph;

Var

grdriver:integer;

grmode:integer;

begin;

grdriver:=detect;

Initgraph(grdriver,grmode,'c');

rectangle(120,90,160,120);

setcolor(7);

rectangle(160,120,240,160);

setcolor(8);

line(120,120,70,120);

line(70,120,80,160);

line(80,160,160,160);

setcolor(2);

circle(110,160,25);

setcolor(5);

circle(200,160,25);

setcolor(5);

line(50,80,20,120);

line(20,120,80,120);

line(80,120,50,80);

line(50,120,20,160);

line(20,160,80,160);

line(80,160,50,120);

readln

End.         

 

Пример Снеговики.

program snegoviki;

uses graph;

var

i,j,x,y:integer;

grdriver:integer;

grmode:integer;

begin

grdriver:=detect;

initgraph(grdriver,grmode,'c');

x:=50;y:=30;

for i:=1 to 10 do

begin

for j:=1 to 10 do

begin

setcolor(blue);

circle(x,y,10);

circle(x,y+30,20);

circle(x,y+80,30);

circle(x-30,y+30,10);

circle(x+30,y+30,10);

setcolor(5);

line(x,y-5,x+15,y);

line(x,y+5,x+15,y);

setcolor(white);

line(x-5,y+5,x+5,y+5);

putpixel(x-5,y-5,white);

putpixel(x+5,y-5,white);

putpixel(x,y+20,white);

putpixel(x,y+30,white);

putpixel(x,y+40,white);

putpixel(x,y+60,white);

putpixel(x,y+70,white);

putpixel(x,y+80,white);

putpixel(x,y+90,white);

putpixel(x,y+100,white);

setcolor(3);

line(x-5,y-10,x+5,y-10);

line(x+5,y-10,x,y-20);

line(x,y-20,x-5,y-10);

x:=x+90;

end;

y:=y+160;x:=50;

end;

readln

end.

 

Пример машина. Организовать имитацию движения автомобиля по экрану компьютера.

 

 

 

Uses crt,Graph;

Var u,gm,gd: integer;

BEGIN

gd:= detect;

initgraph(gd,gm,'');

if graphresult<>0 then halt (1);

setviewport(1,1,600,450,true);

setbkcolor(lightgray);

setcolor(brown);

line(1,401,700,401); {нарисуем дорогу}

u:= 1;

while u<=600 do begin setcolor(darkgray);

rectangle(40 + u,315,90+u,350); {кабина машины}

setfillstyle(1,darkgray);

bar(5 + u,350,120+u,390); {кузов машины}

setfillstyle(1, yellow); setcolor(yellow);

line(121 + u,360,160 + u,400); {свет от}

line(160 + u,400,200 + u,400);

line(200 + u,400,121 + u,360); {фар }

floodfill(180 + u,399,yellow);

pieslice(40 + u,385,0,360,15); { }

pieslice(90 + u,385,0,360,15); delay(5000);

setfillstyle(1,lightgray);

bar(5+u,300,210 + u,400); {очистка места расположения машины}

u:=u+3 end; readln; closegraph END.

 

 

Пример башня

Построить на экране компьютера башню, имитируя процесс ее построения снизу вверх.

 

Uses crt, Graph;

Var P:pointer;{указатель на область}

Size:Word; {размер области}

X1,Y1:Word; {координаты начальной точки}

gd,gm: integer;

Begin gd:=detect;

InitGraph(gd,gm,'');

IF GraphResult<>0 THEN Halt(1);

SetViewPort(0,0,640,80,TRUE);

ClearViewPort;

SetBkColor(black);

SetColor(yellow);

SetLineStyle(0,1,Thickwidth);

Rectangle(120,400,200,440); {рисуем первый кирпич}

Size:=ImageSize(120,400,200,440); {определяем размер области}

GetMem(p,Size); {выделяем память для области}

GetImage(120,400,200,440,P^); {сохраняем область в памяти}

Y1:=440;

WHILE Y1>=40 DO begin X1:= 120;

begin PutImage(X1,Y1,p^,CopyPut); {строим башню}

Delay(59000);

X1:=X1+80

end;

Y1:=Y1-40 end; x1:=x1-160;WHILE X1<=280 DO {строим верх башни}

begin

PutImage(X1,Y1,p^,CopyPut);

{CopyPut = 0 - режим копирования изображений}

X1:=X1 +160

end;

setfillstyle(8,red);

Bar(200,40,280,500); {строим стены башни}

Bar(40,40,120,500);

{Добавляем надпись}

SetColor(11);SETTEXTSTYLE(6,7,6);

outtextxy(350,100,'BASHNYA!');

Readln;

CloseGraph

End.

 

ГРИБ

Program GRIB

Uses crt, Graph;

Var P:pointer;

Size:Word;

X1,Y1:Word; gd,gm: integer;

Begin gd:=detect;

InitGraph(gd,gm,'');

SetColor(15);

rectangle(100,125,150,250);

SetColor(6);

line(25,125,125,50);

line(125,50,225,125);

line(225,125,25,125);

SetColor(2);

line(100,250,50,200);

line(50,250,50,200);

line(50,250,100,250);

line(150,250,200,200);

line(200,200,200,250);

line(200,250,150,250);

SetColor(11);SETTEXTSTYLE(7,0,6);

outtextxy(300,300,'GRIB');

Readln;

CloseGraph End.

 

НАДПИСЬ

Program Privet

Uses crt, Graph;

Var P:pointer;

Size:Word;

X1,Y1:Word;

gd,gm: integer;

Begin gd:=detect;

InitGraph(gd,gm,'');

SetColor(11);SETTEXTSTYLE(4,0,7);

outtextxy(20,200,'My name is Denis!');

Readln;

CloseGraph End.

 

КРАН

Program KRAN

uses Graph;

Const uMin=50; uMax=600; vMin=50; vMax=450;

{Окно графика функции}

Var grDriver: integer;

grMode: integer;

xStep:real; {Шаг по х}

n,k:integer; {Число точек графика}

x,y,px,py:real;

xMin, yMin,yMax, xMax:real;{Область функции}

 

Procedure Grlnit;

Begin

grDriver:=Detect;

InitGraph(grDriver,grMode,'');

IF GraphResult<>0 then

                   begin

                   Writeln('Ошибка инициализации!');

                   writeln('Работа программы прервана');

                   Halt(1)

                   end

End;

Function xScr(x: real):integer;

{Преобразование координаты х в u}

begin

xScr:=Round((x-xMin)*px+uMin);

end;

Function yScr(y:real):integer;

{Преобразование координаты y в v}

begin

begin

yScr:=Round((y-yMax)*py+vMin);

end;

Function f(x:real):real;

{Вид функции}

begin

f:=X*X-5*X+6;

end;

Begin

{Ввод исходных значений области функции}

write('xMin='); readln(xMin);

write('xMax='); readln(xMax);

write('yMin='); readln(yMin);

write('yMax='); readln(yMax);

px:=(uMax-uMin)/(xMax-xMin);

py:=-(vMax-vMin)/(yMax-yMin);

Grlnit;

{Построение рамки прямоугольника}

SetLineStyle(0,0,3);

Rectangle(uMin,vMin,uMax,vMax);

{Построение осей координат}

SetLineStyle(0,0,1);

If (xMin<0) and (xMax>0) then

Line (xScr(0),vMin,xScr(0),vMax);

If(yMin<0) and(yMax>0) then

Line(uMin,yScr(0),uMax,yScr(0));

{Определение количества точек графика}

n:=uMax-uMin;

{Вычисление шага}

xStep:=(xMax-xMin)/n;

x:=xMin;

{Вывод графика в виде n точек желтого цвета, преобразовывая при этом х в u, у в v}

for k:=1 to n do

begin

y:=f(x);

if(y> yMin) and (y<yMax) then PutPixel(xScr(x),yScr(y),Yellow);

x:=x+xStep

end;

readln;

Closegraph

End.

 

ГРУЗОВИК

program gryzovik;

uses graph;

var

grDriver:integer;

grMode:integer;

begin

grDriver:=Detect;

InitGraph(grDriver,grMode,'');

SetColor(5);

bar(100,100,300,200);

bar(300,200,400,50);

bar(400,200,511,130);

rectangle(310,60,390,140);

line(450,130,420,30);

line(420,30,500,30);

line(500,30,470,130);

SetColor(7);

circle(140,230,30);

circle(210,230,30);

circle(400,230,30);

circle(470,230,30);

readln;

end.

 

ЧЕЛОВЕЧЕК

program chel;

uses graph;

var

grDriver:integer;

grMode:integer;

begin

grDriver:=Detect;

InitGraph(grDriver,grMode,'');

SetColor(5); SetBkColor(1);

SetColor(7);circle(160,120,10);

 circle(160,120,5);

 circle(175,120,8);

circle(173,110,8);

 circle(173,100,8);

circle(175,95,8);

 circle(180,90,8);

 circle(185,85,8);

 circle(190,83,8);

 circle(195,83,8);

circle(200,83,8);

circle(205,83,8);

 circle(210,83,8);

circle(215,83,8);

 circle(200,85,8);

circle(225,90,7);

 circle(230,95,8);

 circle(230,100,8);

 circle(233,105,8);

 circle(233,110,8);

circle(233,115,8);

circle(232,120,8);

 circle(245,120,10);

circle(245,120,5);

 circle(190,110,5);

 circle(210,110,5);

 circle(200,120,5);

 circle(200,135,6);

circle(200,118,30);

circle(200,118,60);

readln;

end.

 

БРОУНОВСКОЕ ДВИЖЕНИЕ

 

uses crt, graph;

const N = 200;

var gd, gm: integer;

x, y: array [1..N] of integer;

dx, dy: integer;

i: integer;

x1, y1, x2, y2: integer;

begin

gd:= detect;

initgraph (gd, gm, '');

randomize;

setbkcolor (8);

x1:= 250; y1:= 180;

x2:= 340; y2:= 300;

 

setfillstyle (1, 14);

bar (100, 300, 500, 310);

bar (160, 300, 165, 400);

bar (440, 300, 445, 400);

 

setfillstyle (1, 11);

bar (x1, y1, x2, y2);

line (x1-1, y1-30, x1-1, y2+1);

line (x2+1, y1-30, x2+1, y2+1);

line (x1-1, y2+1, x2+1, y2+1);

line (x1-1, y1-1, x2+1, y1-1);

ellipse (x1+(x2-x1)div 2, y1-30, 0, 360, (x2-x1) div 2, 4);

 

for i:= 1 to N do begin

x[i]:= x1 + random (x2-x1);

y[i]:= y1 + random (y2-y1);

putpixel (x[i], y[i], 0);

end;

repeat

for i:= 1 to N do putpixel (x[i], y[i], 11);

for i:= 1 to N do begin

dx:= 2 - random (5);

dy:= 2 - random (5);

if (x[i] + dx > x1) and (x[i] + dx < x2) then x[i]:= x[i] + dx;

if (y[i] + dy > y1) and (y[i] + dy < y2) then y[i]:= y[i] + dy;

end;

for i:= 1 to N do putpixel (x[i], y[i], 1);

delay (600);

until keypressed;

closegraph;

end. 

 

МИШКА

 

program mixa;

uses graph;

var

grDriver:integer;

grMode:integer;

begin

grDriver:=Detect;

InitGraph(grDriver,grMode,'');

SetColor(5);

 line(240,110,260,110);

SetColor(7); circle(250,180,60);

 circle(200,235,15);

 circle(300,235,15);

circle(250,90,30);

 circle(180,150,15);

circle(320,150,15);

 circle(230,55,10);

 circle(270,55,10);

 circle(235,85,5);

 circle(265,85,5);

circle(250,100,3);

readln;

end.

 

ЛЕСЕНКА

Program Lecenka

Uses Graph,Crt;

Var grDriver: Integer;

grMode: Integer;

i,x1,x2,dy,y,d:integer;

Begin

 grDriver:=Detect;

 InitGraph(grDriver, grMode, 'c:\bp\bgi');

 x1:=280;

 x2:=360;

 dy:=40;

 y:=400;

 d:=50;

 for i:=1 to 10 do begin

line(x1,y,x1,y+dy);

delay(d);

line(x2,y,x2,y+dy);

delay(d);

line(x1,y+(dy div 2),x2,y+(dy div 2));

delay(d*2);

y:=y-dy;

 end;

 readkey;

 closegraph;

End.

 

ЧЕРВЯК

Program SHERVIAK

uses crt, graph;

var Gd, Gm: Integer;

i,d,uu,n,u,x,y,dx,dy: integer;

vx,vy:array[1..1000] of integer;

begin

 Gd:= Detect;

 InitGraph(Gd, Gm, 'c:\bp\bgi');

{ SetFillStyle(1,8);

 Bar(140,120,503,360);{}

 Rectangle(140,120,503,360);

 Line(320,140,220,140);

 Line(320,140,320,220);

 Line(460,220,460,350);

 Line(200,330,320,330);

 Line(170,220,170,266);{}

 x:=320;

 y:=240;

 dx:=1;

 dy:=1;

 u:=50;

 d:=0;

 uu:=1;

 for i:=1 to u do

 begin

 vx[i]:=0;

 vy[i]:=0

 end;

 d:=1;

 repeat

putpixel(x,y,11);

putpixel(320,240,0);

if d>10 then

begin

putpixel(vx[1],vy[1],0);

if (uu)mod(3)=0 then

begin

for i:=20 to 1 do

   begin

     putpixel(vx[n-2*i],vy[n-2*i],0);

   end;

end;

end;

if (getpixel(x,y-1) = 15) or (getpixel(x,y+1) = 15) then dy:=-dy;

if (getpixel(x-1,y) = 15) or (getpixel(x+1,y) = 15) then dx:=-dx;

x:=x+dx;

y:=y+dy;

for i:=2 to u do

begin

vx[i-1]:=vx[i];

vy[i-1]:=vy[i];

end;

vx[u]:=x;

vy[u]:=y;

if d<=10 then d:=d+1;

delay(500);{}

uu:=uu+1;

until keypressed;

ReadKey;

 CloseGraph; { Shut down graphics }

end.

 

ВЕЛОСИПЕД

 

program VELOSIPED;

uses graph;

var

grDriver:integer;

grMobe:integer;

Begin

grDriver:=Detect;

InitGraph(grDriver,grMobe,'');

SetColor(12);

circle(200,150,30);

circle(200,150,23);

circle(330,150,30);

circle(330,150,23);

line(200,150,280,150);

line(280,150,320,110);

line(320,110,210,110);

line(210,110,250,150);

line(200,150,210,110);

circle(200,150,5);

circle(270,150,10);

line(270,150,270,170);

line(265,170,275,170);

line(200,145,270,140);

line(200,155,270,160);

line(330,150,320,110);

line(320,110,320,98);

line(320,98,310,98);

line(210,110,210,100);

circle(210,100,5);

line(210,100,220,100);

line(270,150,270,130);

line(265,130,275,130);

readln;

End.

 

 

                                                              


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: