Выдержка из текста работы
Изучение работы в графическом режиме. Ознакомление с блоками стандартного модуля Graph. Создание эффекта движения в графическом режиме. Задание цвета и стиля линий и заливки объектов. Создание различных шаблонов. Создание эффекта движения в графическом режиме.
Условие задачи:
Написать программу, максимально демонстрирующую возможности графического режима. Данная программа должна включать в себя минимум 3 движущихся объекта и состоять минимум из 300 строк.
Словесный алгоритм решения задачи:
Подключаем модуль Graph. В процедурах описываем прорисовку птицы, озера, дерева, цветка, облака и солнца.
В процедуре oblako описывается рисование облаков с помощью эллипсов, где сами параметра эллипса задаются случайным образом, что дает эффект реальных облаков. Также в ней задаются параметры, чтобы облако можно было нарисовать в любом месте экрана.
В процедуре ptica описывается рисование птицы с помощью процедуры Arc, которая рисует дугу от начального угла к конечному. Используем несколько дуг изменяя координаты у, чтобы птица была более объемной. Процедура ptica2 используется для того, чтобы птица исчезла. Процедура та же самая, но с цветом фона.
В процедуре osero описывается рисование озера с помощью дуг эллипса. Процедура рисует заполненный эллипс, используя х,у как центр и xr,xy как горизонтальные и вертикальные оси.
В процедуре derevo рисуем заполненные эллипсы. В процедуре stvol рисуем треугольник и заполняем область, не выходя за границы.
В процедуре cvetok рисуем окружности одинакового размера и располагаем на экране так, чтобы окружности образовали круг. Таким образом, получается цветок. Далее рисуем три линии с разными координатами, которые являются стволами цветка.
В процедуре solnishko1 и solnishko2 рисуем круг солнца желтым цветом и прорисовываем лучи солнца в цикле через 9 градусов.
Начинаем мультфильм с рисования горизонта и дороги с помощью синусоиды. Заполняем цветом фона небо и дорогу, а землю заполняем с помощью шаблона. Облака рисуем с помощью процедуры oblako.
Далее рисуем дерево, заполняя область эллипса шаблоном.
Шаблон это тип заливки, он является константой и задается размером 8х8 пикселей, его удобно задавать в виде числа двоичной или шестнадцатеричной системе счисления. Этот тип заливки очень удобный, его можно применить к любому объекту. Таких шаблонов можно создать сколько угодно на свое усмотрение, так же он позволяется создать различные узоры (текстуры), что разнообразит рисование в графическом режиме. Описываем два шаблона, первый будет заливать область дерева, а второй заполнит землю.
Рисуем цветок с помощью процедуры cvetok, указанной выше. Далее рисуем озеро.
Около озера рисуем камыши, с помощью эллипсов и линии.
Рисуем зайца с помощью эллипсов. Тело, голову, уши и лапы прорисовываем с помощью эллипсов, а глаза задаются точками.
Рисуем утку точно так же как и зайца.
Далее рисуем птицу, используя процедуру Arc, кторая рисует дугу от начального угла к конечному.
Реализуем эффект движения через динамическую память, где изображение объекта запоминается в динамической области памяти в виде прямоугольника. Таким образом, мы может двигать объекты по разным траекториям.
Движение в мультфильме начинает утка, которая двигается по плавной синусоиде вправо по озеру, после этого начинает двигаться заяц, который прыгает, здесь уже синусоиду задаем более крутую. Потом движется птица по линии и садится на дерево. Далее в цикле рисуется солнце solnishko1 и solnishko2. Они отличаются тем, что у solnishko2 лучи солнца закрашены в цвет фона. Таким образом получается мерцание солнца.
В конце рисуем круг, который заполняет весь экран, и на котором появляется текст.
Листинг программы:
Program multfilm;
uses crt,graph;
const C1: FillPatternType = ($AA, $FF, $11, $FA, $FF, $FC, $BA, $CF);
C2: FillPatternType = ($FF, $FF, $FF, $DD, $FF, $AB, $FF, $BF);
type point=record
x,y:integer;
end;
var gd,gm,code:integer;
alfa,size,x,y,x0,y0,x1,y1,x2,y2,dx,dy,r,r1,r2,i,j:integer;
a:array[1..20] of point;
priz:boolean;
p,p1,p2,p3,p4,p5,pm:pointer;
{ptica}
procedure ptica(x0,y0:integer);
begin
SetFillStyle(1,0);
SetColor(0);
Arc(x0,y0,9,160,9);
Arc(x0,y0+1,9,160,9);
Arc(x0,y0+2,9,160,9);
Arc(x0+12,y0,9,130,9);
Arc(x0+12,y0+1,9,130,9);
Arc(x0+12,y0+2,9,130,9);
end;
procedure ptica2(x0,y0:integer);
begin
SetColor(9);
SetFillStyle(1,9);
Arc(x0,y0,9,160,9);
Arc(x0,y0+1,9,160,9);
Arc(x0,y0+2,9,160,9);
Arc(x0+12,y0,9,130,9);
Arc(x0+12,y0+1,9,130,9);
Arc(x0+12,y0+2,9,130,9);
end;
{osero}
procedure osero;
begin
FillEllipse(x0-50,y0+250,300,35);
FillEllipse(x0+50,y0+270,250,35);
end;
{DEREVO}
procedure derevo;
begin
FillEllipse(x0+70,y0-35,30,35);
FillEllipse(x0+50,y0+5,30,40);
end;
procedure stvol;
begin
Line(500,400,510,300);
Line(500,400,520,400);
Line(520,400,510,300);
FloodFill(510,350,6);
end;
{CVeTOK}
procedure cvetok(x0,y0:integer);
begin
SetColor(4);
SetFillStyle(1,4);
circle(x0+2,y0+5,4);
circle(x0+5,y0+2,4);
circle(x0+5,y0-3,4);
circle(x0+1,y0-5,4);
circle(x0-3,y0-4,4);
circle(x0-4,y0,4);
circle(x0-3,y0+4,4);
SetFillStyle(1,2);
SetColor(2);
line(600,350,600,390);
line(580,359,600,390);
line(620,359,600,390);
end;
procedure oblaka(x0,y0:integer);
begin
for j:=1 to 2 do
begin
for i:=1 to 30 do
FillEllipse(x0+random(20),y0+random(10),80+random(5),30+random(5));
x0:=x0+random(20); y0:=y0+random(5);
end;
end;
procedure solnishko1;
begin
SetColor(14);
SetFillStyle(1,14);
FillEllipse(140,70,20,20);
alfa:=0;
r1:=20;
r2:=80;
repeat
alfa:=alfa+9;
x1:=round(r1*cos(alfa))+140;
y1:=round(r1*sin(alfa))+70;
x2:=round(r2*cos(alfa))+140;
y2:=round(r2*sin(alfa))+70;
line(x1,y1,x2,y2);
until alfa>=360;
end;
procedure solnishko2;
begin
SetColor(9);
SetFillStyle(1,14);
FillEllipse(140,70,20,20);
alfa:=0;
r1:=20;
r2:=80;
repeat
alfa:=alfa+9;
x1:=round(r1*cos(alfa))+140;
y1:=round(r1*sin(alfa))+70;
x2:=round(r2*cos(alfa))+140;
y2:=round(r2*sin(alfa))+70;
line(x1,y1,x2,y2);
until alfa>=360;
end;
{procedure pticasidit;
begin
SetFillStyle(1,0);
SetColor(0);
FillEllipse(x0+420,y0+135,3,9);
FillEllipse(x0+423,y0+125,2,4);
SetColor(14);
SetFillStyle(1,14);
FillEllipse(x0+427,y0+125,2,1);
end;}
BEGIN
clrscr;
randomize;
gd:=detect;
initgraph(gd,gm,»);
code:=graphresult;
if code<>0 then begin
writeLn(‘OSHIBKA: ‘, code);
halt(1);
end;
{——-}
SetBkColor(0);
SetColor(15);
for x:=0 to 700 do
if GetPixel(x,400)<>GetColor then
begin
y:=round(5*cos(x/70)+400);
PutPixel(x,y,getcolor)
else break;
SetFillStyle(1,6);
FloodFill(20,450,getcolor);
SetBkColor(0);
SetColor(15);
for x:=0 to 700 do
if GetPixel(x,300)<>GetColor then
begin
y:=round(10*cos(x/70)+190);
PutPixel(x,y,getcolor)
else
break;
SetFillStyle(1,10);
{SetColor(10); }
SetFillPattern(C2,10);
FloodFill(20,400,getcolor);
SetFillStyle(1,9);
FloodFill(600,10,getcolor);
{oblaka}
SetColor(15);
SetFillStyle(1,15);
oblaka(550,50);
delay(200);
{Deurevo}
SetFillStyle(1,6);
SetColor(6);
stvol;
delay(250);
SetFillStyle(1,2);
SetColor(2);
SetFillPattern(C1,2);
x0:=450;
y0:=264;
derevo;
delay(200);
SetFillStyle(1,2);
SetColor(2);
SetFillPattern(C1,2);
x0:=470;
y0:=300;
derevo;
delay(200);
{cvetok}
cvetok(600,350);
delay(200);
cvetok(580,359);
delay(200);
cvetok(620,359);
delay(200);
{osero}
SetColor(9);
SetFillStyle(1,9);
x0:=100;
y0:=50;
osero;
delay(200);
{kamish}
SetFillStyle(1,2);
SetColor(2);
Line(100,220,110,260);
delay(250);
SetFillStyle(1,6);
SetColor(6);
FillEllipse(x0,y0+170,2,8);
delay(250);
SetFillStyle(1,2);
SetColor(2);
Line(120,220,120,260);
delay(250);
SetFillStyle(1,6);
SetColor(6);
FillEllipse(x0+20,y0+160,2,8);
delay(250);
SetFillStyle(1,2);
SetColor(2);
Line(136,210,130,260);
delay(250);
SetFillStyle(1,6);
SetColor(6);
FillEllipse(x0+36,y0+165,2,10);
delay(250);
{utka}
SetColor(15);
SetFillStyle(1,14);
FillEllipse(30,310,10,6);
FillEllipse(35,301,5,3);
SetFillStyle(1,0);
FillEllipse(40,301,4,1);
PutPixel(35,300,6);
{zajchik}
SetColor(15);
SetFillStyle(1,8);
FillEllipse(50,450,10,6);
FillEllipse(45,455,3,2);
FillEllipse(55,455,3,2);
FillEllipse(42,445,2,2);
FillEllipse(57,442,5,5);
FillEllipse(55,433,2,5);
SetFillStyle(1,15);
PutPixel(60,440,14);
{dvizhenie utki}
Size:=ImageSize(25,325,65,360);
GetMem(pm,size);
setfillstyle(1,14);
GetImage(15,330,60,295,pm^);
for x:=2 to 280 do begin
y:=round(5*cos(x/9)+290);
PutImage(x,y,pm^,copyput);
SetFillStyle(1,14);
Delay(30);
end;
{ptica}
ptica(30,107);
repeat
{dvezhenie zajchika}
Size:=ImageSize(25,425,65,460);
GetMem(p3,size);
setfillstyle(1,9);
GetImage(25,425,65,465,p3^);
for x:=40 to 450 do begin
y:=round(10*cos(x/4)+425);
PutImage(x,y,p3^,copyput);
SetFillStyle(1,9);
Delay(30);
end;
{ptica}
{ptica(30,107);
{ptica dvizhetsa}
Size:=ImageSize(20,680,65,648);
GetMem(p1,size);
SetFillStyle(1,7);
GetImage(20,107,70,75,p1^);
for x:=20 to 500 do begin
y:=round(4*(x/30)+90);
PutImage(x,y,p1^,copyput);
SetFillStyle(1,7);
Delay(10);
end;
ptica2(510,189);
{pticasidit}
SetFillStyle(1,0);
SetColor(0);
FillEllipse(x0+420,y0+135,3,9);
FillEllipse(x0+423,y0+125,2,4);
SetColor(14);
SetFillStyle(1,14);
FillEllipse(x0+427,y0+125,2,1);
{SOLNYSHKO}
repeat
solnishko1;
solnishko2;
until keypressed;
solnishko1;
readkey;
until keypressed;
for i:=1 to 150 do
begin
SetColor(3);
SetFillStyle(1,11);
FillEllipse(x,y,40+i*5,40+i*5);
end;
SetColor(2);
OutTextxy(270,250,’THE END.’);
readkey;
closegraph;
end.
Вывод
В ходе работы были изучены возможности графического режима. Было рассмотрено создание шаблонов. Изучены такие режимы как рисование точек, линий, построение различных фигур, дуг, эллипсов и окружностей. Были применены различные стили линей и виды заливок. Был рассмотрен эффект движения в графическом режиме с помощью динамической памяти.
Список литературы
1. В.С Талашева Программирование на ЯВУ. Алгоритмический язык Паскаль – Иж.: ИжГТУ, 2006
2. С.В. Белецкий Турбо Паскаль с графикой для ПК – М.: Машиностроение, 1991
3. В.Б. Попов TURBO-PASCAL для школьников – М.: Финансы и статистика, 2001
4. Е.В. Шикин Начала компьютерной графики – М.: Диалог-МИФИ, 1993
5.http://graphic-in-pascal.blogspot.ru/2012/04/turbo-pascal.html
6. http://pas1.ru/graph