- •Листинги программ к статье и. М. Павловой "графика на паскале"
- •1. Создание рисунков с использованием прямой линии
- •1.1. Использование процедур MoveTo, LineTo
- •1.2. Использование процедуры Line
- •2. Создание рисунков с использованием прямоугольников
- •2.1. Использование процедур Rectangle, Bar
- •2.2. Создание рисунков с использованием процедур для работы с прямоугольниками и процедур для работы с текстом
- •3. Создание рисунков с использованием окружностей, эллипсов, дуг, секторов
- •3.1. Использование процедуры Circle
- •3.2. Использование процедур Ellipse, FillEllipse
- •3.3. Использование процедур PieSlice, FloodFill
- •3.4. Использование подпрограмм и процедур рисования окружностей, эллипсов, дуг, линий, закраски замкнутой фигуры
- •4. Организация движения
- •4.1. Стирание изображения и восстановление его в новом месте
- •4.2. Организация движения с использованием динамической памяти
4. Организация движения
4.1. Стирание изображения и восстановление его в новом месте
Задание 4.1.1. Нарисовать цветик-семицветик, у которого поочередно после нажатия клавиши улетает лепесток (исчезает с экрана).
uses
crt, graph;
var
err, gd, gm: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
setcolor(1); {1-й лепесток}
setfillstyle(1, 1);
pieslice (300, 300, 0, 360, 30);
setcolor(2); {2-й лепесток}
setfillstyle(1, 2);
pieslice (240, 330, 0, 360, 30);
setcolor(3); {3-й лепесток}
setfillstyle(1, 3);
pieslice (370, 330, 0, 360, 30);
setcolor(4); {4-й лепесток}
setfillstyle(1, 4);
pieslice (240, 260, 0, 360, 30);
setcolor(5); {5-й лепесток}
setfillstyle(1, 5);
pieslice (360, 260, 0, 360, 30);
setcolor(6); {6-й лепесток}
setfillstyle(1, 6);
pieslice (300, 230, 30);
setcolor(7); {7-й лепесток}
setfillstyle(1, 7);
pieslice(300, 370, 0, 360, 30);
readln; {Убираем лепестки при нажатии клавиши}
setcolor(black);
setfillstyle(1, black);
pieslice(300, 370, 0, 360, 30); {-7}
readln;
pieslice (300, 230, 0, 360, 30); {-6}
readln;
pieslice(360, 260, 0, 360, 30); {-5}
readln;
pieslice(240, 260, 0, 360, 30); {-4}
readln;
pieslice(370, 330, 0, 360, 30); {-3}
readln;
pieslice(220, 320, 0, 360, 30); {-2}
readln;
pieslice(300, 300, 0, 360, 30); {-1}
readln;
closegraph;
end.
Задание 4.1.2. Проиллюстрировать биологический цикл жизни дерева: дерево зеленеет и растет, потом желтеет и увядает (уменьшается в размере). Так как дерево вначале растет, то центр эллипса сдвигается вверх, иначе крона будет расти и в сторону земли. После достижения деревом его максимального размера вся крона закрашивается цветом фона, и начинают уменьшаться размеры эллипса, поменявшего цвет на желтый. После завершения цикла крону дерева рисуем еще раз.
uses
graph, crt;
const
x=215;
rx=30;
ry=50;
var
err, gd, gm, i: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
setcolor(brown); {Ствол дерева}
setfillstyle(1, brown);
bar(210, 430, 220, 350);
for i:=330 downto 280 do
begin {Дерево растет и зеленеет}
setcolor(green);
setfillstyle(1, green);
ry:=ry+1;
rx:=rx+1;
fillellipse(x, i, rx, ry);
delay(4000)
end;
setcolor(0); {Закрашиваем цветом фона}
setfillstyle(1, black);
fillellipse(x, i, rx, ry);
delay(2000);
for i:=280 to 330 do
begin {Дерево желтеет, и уменьшается крона}
setcolor(yellow);
setfillstyle(1, yellow);
ry:=ry-1;
rx:=rx-1;
fillellipse(x, i, rx, ry);
delay(4000);
setcolor(0);
setfillstyle(1, black);
fillellipse(x, i, rx, ry);
delay(2000)
end;
setcolor(yellow);
setfillstyle(1, yellow);
fillellipse(x, i, rx, ry);
readln;
closegraph;
end.
Задание 4.1.3. Организовать горизонтальное движение шарика внутри прямоугольника. Шарик движется до правой границы прямоугольника, отталкивается от нее, движется влево, отталкивается от левой границы прямоугольника и т. д., пока не будет нажата клавиша. В программе используется переменная n, которая позволяет увеличивать значения координаты шарика по оси х на 2 единицы для движения слева направо или уменьшать на 2 единицы при движении в обратную сторону. Условный оператор if x>=540-2-r then ... проверяет, достиг ли центр шарика предельного значения, когда контур шарика пересечет контур прямоугольника. Вычитание числа 2 позволяет добиться эффекта соприкосновения двух объектов, но не их пересечения.
uses
graph, crt;
const
r=20;
n=2;
var
x, y, err, gd, gm, i: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
rectangle(100, 80, 540, 400); {Прямоугольник}
y:=getmaxy div 2;
x:=100+r; {Начальная точка движения шара по оси х}
repeat
x:=x+n; {Текущая координата центра шарика}
if x>=540-2-r then n:=-2;
if x<=100+2+r then n:=2;
setcolor(4);
setfillstyle(1, 4);
pieslice(x, y, 0, 360, r);
delay(500);
setcolor(0);
setfillstyle(1, 0);
pieslice(x, y, 0, 360, r);
delay(500)
until keypressed;
readln;
closegraph;
end.
Движение шарика по вертикали организуется аналогичным образом. Ниже приводится фрагмент программы, непосредственно осуществляющий перемещение шарика.
repeat
y:=y+n;
if y>=400-2-r then n:=-2;
if y<=80+2+r then n:=2;
setcolor(4);
setfillstyle(1, 4);
pieslice(x, y, 0, 360, r);
delay(500);
setcolor(0);
setfillstyle(1, 0);
pieslice(x, y, 0, 360, r);
delay(500)
until keypressed;
Задание 4.1.4. Организовать зигзагообразное движение мячика внутри некой трубы слева направо. В программе используются следующие переменные: n - число ударов по верхнему и нижнему краям трубы, i - параметр цикла для организации движения мячика сверху вниз, t - параметр цикла для организации движения мячика снизу вверх.
uses
graph, crt;
var
err, gd, gm, i, n, t: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
setcolor(10);
line(0, 45, 640, 45); {Труба}
line(0, 435, 640, 435);
repeat
for n:=0 to 4 do
begin
for i:=0 to 80 do
begin
setcolor(0);
circle(160*n+i-1, 80+4*i-4, 30);
setcolor(10);
circle(160*n+i, 80+4*i, 30);
delay(1000);
if keypressed then halt(1)
end;
for t:=1 to 80 do
begin
setcolor(0);
circle(160*n+80+t-1, 400-4*t+4, 30);
setcolor(10);
circle(160*n+80+t, 400-4*t, 30);
delay(1000);
if keypressed then halt(1)
end
end
until keypressed;
readln;
closegraph;
end.
Задание 4.1.5. Смоделировать скачки мяча, брошенного на поверхность: мяч совершает несколько движений с максимальной амплитудой, затем амплитуда уменьшается, и мяч постепенно останавливается. Чтобы изменения амплитуды движения мяча были лучше заметны, смоделируем процесс в некоторой трубе.
uses
graph, crt;
const
x=40;
r=10;
t=0;
a=0.2;
var
y, err, gd, gm: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln(Ошибка открытия графики');
halt(1)
end;
line(0, 180, 640, 180);
line(0, 402, 640, 402);
repeat
setcolor(11);
y:=290+trunc(a*t)-trunc((100-(a*t))*cos(t*pi/15));
if 100-trunc(a*t)<>0 then
begin
inc(t);
circle(trunc(x+1.15*t), y, r);
delay(1000);
setcolor(0);
circle(trunc(x+1.15*t), y, r);
delay(1000)
end
until keypressed;
readln;
closegraph;
end.
Задание 4.1.6. Смоделировать движение шара на бильярдном столе, когда шар поочередно отскакивает от стенок стола. Задача решается аналогично задаче 4.1.3. Отличие в том, что после удара о стенку шар продолжает движение не в противоположную сторону, а под прямым углом. В программе используются переменные nx и ny для координации направления движения шара по осям х и у с учетом размера бильярдного стола.
uses
graph, crt;
const
r=20;
nx=2;
ny=-2;
var
nfs, x, y, err, gd, gm, i, k: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
rectangle(100, 80, 540, 400);
y:=(400-80) div 2;
x:=100+r;
repeat
x:=x+nx;
y:=y+ny;
if y<=80+2+r then ny:=2;
if y>=400-2-r then ny:=-2;
if x>=540-r-2 then nx:=-2;
if x<=100+r+2 then nx:=2;
setcolor(4);
setfillstyle(1, 4);
pieslice(x, y, 0, 360, r);
delay(500);
setcolor(0);
setfillstyle(1, 0);
pieslice(x, y, 0, 360, r);
delay(500)
until keypressed;
readln;
closegraph;
end.
Задание 4.1.7. Написать программу, в которой Колобок (шарик) поднимается по ступенькам вверх, движется по площадке, падает вниз, разделяется на два новых колобка, которые начинают движение в разные стороны.
uses
graph, crt;
const
x=60;
y=400;
var
x1, x2, y1, err, gd, gm, i, j: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
for i:=1 to 5 do
begin {Лестница}
setcolor(15);
line(x, y, x, y-40);
line(x, y-40, x+40, y-40);
x:=x+40;
y:=y-40
end;
x:=60;
y:=400;
for I:=1 to 5 do
begin {Движение по лестнице}
for j:=1 to 40 do
begin
setcolor(15); {Колобок поднимается вверх}
circle(x-12, y-12-j, 10);
delay(1000);
setcolor(0);
circle(x-12, y-12-j, 10);
delay(1000)
end;
y1:=y-j;
for j:=1 to 40 do
begin
setcolor(15); {Колобок перемещается вправо}
circle(x-12+j, y1-12, 10);
delay(1000);
setcolor(0);
circle(x-12+j, y1-12, 10);
delay(1000)
end;
x:=x+40;
y:=y-40
end;
x:=x+14;
y:=y1-12;
setcolor(15); {Колобок на верхней площадке}
circle(x, y, 10);
delay(2000);
for i:=0 to 210 do
begin
setcolor(15); {Падение вниз}
circle(x, y+i, 10);
delay(1000);
setcolor(0);
circle(x, y+i, 10);
delay(1000)
end;
y:=y+i;
x1:=x-10;
x2:=x+10;
for i:=1 to 150 do
begin
setcolor(15); {Колобок 1 движется влево}
circle(x1-i, y, 5);
circle(x2+i, y, 5);
delay(1000);
setcolor(0); {Колобок 2 движется вправо}
circle(x1-i, y, 5);
circle(x2+i, y, 5);
delay(1000)
end;
setcolor(15); {Последний кадр}
circle(x1-i, y, 5); {и два новых колобка}
circle(x2+i, y, 5);
delay(2000);
readln;
closegraph;
end.
Задание 4.1.8. Нарисовать циркового клоуна, у которого из стороны в сторону движутся глаза. В программе используются переменные n и n1 для контроля направления движения зрачков левого и правого глаза.
uses
graph, crt;
const
d=1000;
r=10;
var
x, y, y1, x1, x2, n, n1, err, gd, gm, i, k: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
x:=getmaxx div 2;
y:=getmaxy div 2;
setbkcolor(8); {Фон}
pieslice(x, y, 0, 360, 150); {Голова клоуна}
setcolor(4); {Красный нос}
setfillstyle(1, 4);
pieslice(x, y, 0, 360, 30);
arc(x,y+40,250,340,80); {Улыбка}
ellipse(x-35, y+110, 270, 0, 10, 10);
ellipse(x+75, y+58, 200, 340, 10, 10);
setcolor(1);
arc(x, y, 0, 360, 150); {Синий контур вокруг головы}
moveto(x-60, y-136); {Колпак}
lineto(x, y-200);
lineto(x+60, y-136);
setfillstyle(4, 1);
floodfill(x, y-180, 1);
moveto(x-130, y+80); {Воротник}
lineto(x-250, y+170);
lineto(x-100, y+150);
lineto(x-30, y+200);
lineto(x, y+160);
lineto(x+30, y+200);
lineto(x+100, y+150);
lineto(x+250, y+170);
lineto(x+128, y+80);
setfillstyle(4, 1);
floodfill(x, y+155, 1);
setcolor(0); {Глаза}
ellipse(x-50, y-70, 0, 360, 45, 25);
ellipse(x+50, y-70, 0, 360, 45, 25);
y1:=y-70;
x1:=r+(x-80);
x2:=r+(x+20);
nfs:=1;
nfs1:=1;
repeat
x1:=x1+n;
x2:=x2+n1;
if x1>=(x-20)-st-r then n:=-1;
if x1<=(x-80)+st+r then n:=1;
if x2>=(x+80)-st-r then n1:=-1;
if x2<=(x+20)+st+r then n1:=1;
setcolor(0); {Левый глаз}
circle(x1, y1, r);
setcolor(1);
pieslice(x1, y1, 0, 360, 5);
circle(x2, y1, r); {Правый глаз}
setcolor(1);
pieslice(x2, y1, 0, 360, 5);
delay(d);
setcolor(15); {Зрачки}
circle(x1, y1, r);
circle(x1, y1, 5);
circle(x2, y1, r);
circle(x2, y1, 5)
until keypressed;
readln;
closegraph;
end.
Задание 4.1.9. Нарисовать Царь-рыбу, мимо которой проплывают образующиеся пузырьки воздуха разного размера.
uses
graph, crt;
const
st=0.1;
var
x, y, x1, y1, x2, y2, x3, y3, x4, y4, x5, y5: integer;
x6, y6, x7, y7, x8, y8, x9, y9, x10, y10: integer;
err, gd, gm, i, j: integer;
r, r1, r2, r3, r4, r5: integer;
i1, i2, i3, i4, i5: real;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики");
halt(1)
end;
ellipse(190, 240, 140, 185, 100, 70); {Голова рыбы}
line(90, 245, 130, 255);
line(130, 255, 112, 284);
ellipse(190, 240, 220, 270, 100, 70);
line(190, 310, 190, 170);
circle(130, 190, 20);
ellipse(190, 240, 90, 115, 100, 70);
setfillstyle(1, 4); {Красный зрачок}
circle(130, 190, 10);
floodfill(130, 190, 15);
setfillstyle(8, 2); {Туловище}
ellipse(190, 240, 270, 90, 270, 70);
floodfill(200, 240, 15);
line(450, 220, 520, 170); {Хвост}
line(450, 260, 520, 310);
ellipse(520, 240, 90, 270, 10, 70);
line(457, 230, 500, 210);
line(460, 240, 495, 240);
line(457, 250, 500, 270);
line(240, 170, 330, 110); {Верхний плавник}
arc(390, 190, 120, 171, 100);
line(200, 300, 210, 350); {Нижний плавник}
line(210, 350, 250, 355);
line(250, 355, 220, 300);
line(420, 270, 440, 290); {Второй нижний плавник}
line(440, 290, 420, 295);
line(420, 295, 410, 270);
setfillstyle(1, 1); {Фон - море}
floodfill(0, 1, 15);
setfillstyle(4, 8); {Штриховка}
floodfill(120, 240, 15); {головы}
setfillstyle(11, 8); {нижнего плавника}
floodfill(215, 315, 15);
setfillstyle(11, 8); {второго нижнего плавника}
floodfill(425, 285, 15);
setfillstyle(11, 8); {хвоста}
floodfill(455, 220, 15);
setfillstyle(11, 8); {верхнего плавника}
floodfill(255, 170, 15);
setfillstyle(2, 9); {радужной оболочки глаза}
floodfill(135, 205, 15);
r1:=random(10); {Определяем размер пузырьков}
r2:=random(10);
r3:=random(10);
r4:=random(10);
r5:=random(10);
x1:=72; y1:=260; {Координаты пузырьков}
x2:=65; y2:=230;
x3:=59; y3:=190;
x4:=40; y4:=210;
x5:=30; y5:=180;
i1:=pi/4;
i2:=pi/4;
i3:=pi/4;
i4:=pi/4;
i5:=pi/4;
while not keypressed do
begin
x6:=x1; y6:=y1-round(i1);
x7:=x2; y7:=y2-round(i2);
x8:=x3; y8:=y8-round(i3);
x9:=x4; y9:=y4-round(i4);
x10:=x5; y10:=y5-round(i5);
if y6+r1+9<0 then
begin
i1:=pi/4;
r1:=random(10)
end;
if y7+r2+9<0 then
begin
i2:=pi/4;
r2:=random(10)
end;
if y8+31+9<0 then
begin
i3:=pi/4;
r3:=random(10)
end;
if y9+r4+9<0 then
begin
i4:=pi/4;
r4:=random(10)
end;
if y10+r5+9<0 then
begin
i5:=pi/4;
r1:=random(10)
end;
setcolor(15);
setfillstyle(10, 4);
pieslice(x6, y6, 0, 360, r1);
pieslice(x7, y7, 0, 360, r2);
pieslice(x8, y8, 0, 360, r3);
pieslice(x9, y9, 0, 360, r4);
pieslice(x10, y10, 0, 360, r5);
delay(100);
setcolor(blue);
setfillstyle(1, blue);
pieslice(x6, y6, 0, 360, r1);
pieslice(x7, y7, 0, 360, r2);
pieslice(x8, y8, 0, 360, r3);
pieslice(x9, y9, 0, 360, r4);
pieslice(x10, y10, 0, 360, r5);
i1:=i1+st;
i2:=i2+st;
i3:=i3+st;
i4:=i4+st;
i5:=i5+st
end;
readln;
closegraph;
end.
Задание 4.1.10. Нарисовать идущего человечка из детской считалочки "Палка, палка, огуречик...", только туловище тоже будет палочкой (линией). При составлении программы может быть использована процедура пользователя.
uses
graph, crt;
const
k=0;
b=0;
c=0;
r=10;
var
err, gd, gm, i: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
line(0,241,640,241); repeat
for i:=1 to 40 do
begin
setcolor(15);
line(120+k+i+b, 200+c, 120+k+i+b, 160+c); {Туловище}
circle(120+k+i+b, 150+c, r); {Голова}
line(120+k+i+b, 180+c, 100+2*i+k+b, 195+c); {Правая рука}
line(100+i+k+b+i, 195+c, 110+2*i+k+b, 200+c);
line(120+i+k+b, 180+c, 140+k+b, 195+c); {Левая рука}
line(140+k+b, 195+c, 150+k+b, 190+c);
line(120+k+i+b, 200+c, 100+2*i+k+b, 240+c); {Ноги}
line(120+i+k+b, 200+c, 140+k+b, 240+c);
delay(1000);
setcolor(0);
line(120+k+i+b, 200+c, 120+k+i+b, 160+c);
circle(120+k+i+b, 150+c, r);
line(120+k+i+b, 180+c, 100+2*i+k+b, 195+c);
line(100+i+k+b+i, 195+c, 110+2*i+k+b, 200+c);
line(120+i+k+b, 180+c, 140+k+b, 195+c);
line(140+k+b, 195+c, 150+k+b, 190+c);
line(120+k+i+b, 200+c, 100+2*i+k+b, 240+c);
line(120+i+k+b, 200+c, 140+k+b, 240+c);
delay(1000)
end;
b:=b+40
until keypressed;
readln;
closegraph;
end.
Задание 4.1.11. Написать программу, имитирующую движение маленького шара по поверхности большого шара. Для обозначения радиусов маленького и большого шаров в программе используются переменные r и r1. Программа легко видоизменяется для решения задачи о движении одной планеты по эллиптической орбите другой.
uses
graph, crt;
const
r=100;
r1=10;
i=pi/4;
var
x, y, err, gd, gm, j: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
setcolor(2);
circle(320, 240, r);
while not keypressed do
begin
x:=320+round((r+r1+1.5)*cos(i));
y:=240+round((r+r1+1.5)*sin(i));
setcolor(4);
circle(x, y, r1);
delay(1000);
setcolor(0);
circle(x, y, r1);
i:=i+0.1
end;
readln;
closegraph;
end.
Задание 4.1.12. Написать программу, имитирующую движение по кругу около солнца его лучей. Один конец луча касается солнца, второй конец лежит на некоторой внешней окружности, определяемой радиусом r1. Число лучей и их длина устанавливаются пользователем в программе.
uses
graph, crt;
const
r=70; {радиус солнца}
r1=130; {радиус внешней окружности}
i=pi/4;
var
x, x1, y1, y, err, gd, gm, j: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
setcolor(yellow);
setfillstyle(1, yellow);
pieslice(320, 240, 0, 360, r-2); {солнце}
while not keypressed do
begin
setcolor(yellow);
for j:=1 to 26 do
begin {рисуются лучи}
setcolor(yellow);
x:=320+round(r*cos((j-1)+i));
y:=240-round(r*sin((j-1)+i));
x1:=320+round(r1*cos((j-1)+i));
y1:=240-round(r1*sin((j-1)+i));
line(x, y, x1, y1)
end;
delay(1000);
setcolor(0);
for j:=1 to 26 do
begin
setcolor(0);
x:=320+round(r*cos((j-1)+i));
y:=240-round(r*sin((j-1)+i));
x1:=320+round(r1*cos((j-1)+i));
y1:=240-round(r1*sin((j-1)+i));
line(x, y, x1, y1)
end;
delay(1000);
i:=i+0.01
end;
readln;
closegraph;
end.
Задание 4.1.13. Создать "виртуальный" вращающийся бублик. Рисуется некоторое количество окружностей, радиусы которых лежат на невидимой окружности большого диаметра. Объемный эффект бублика создается за счет того, что изображения окружностей закрашиваются цветом фона, а затем накладываются друг на друга с некоторым смещением.
uses
graph, crt;
const
r=70;
r1=20; {радиус маленькой окружности}
i=pi/4;
var
x, x1, y1, y, err, gd, gm, j: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
setcolor(2);
circle(320, 240, r);
while not keypressed do
begin
setcolor(2);
for j:=1 to 50 do
begin
x:=320+round((r+1.5)*cos((j-1)*7.2+i));
y:=240+round((r+1.5)*sin((j-1)*7.2+i));
setcolor(4);
circle(x, y, r1)
end;
delay(1000);
setcolor(0);
for j:=1 to 50 do
begin
x:=320+round((r+1.5)*cos((j-1)*7.2+i));
y:=240+round((r+1.5)*sin((j-1)*7.2+i));
circle(x, y, r1)
end;
i:=i+0.01
end;
readln;
closegraph;
end.
Задание 4.1.14. Нарисовать тучу, закрывающую солнце. Когда туча наполовину закрывает солнце, начинается дождь.
uses
graph, crt;
const
x1=160;
y1=270;
x2=480;
y2=214;
var
err, gd, gm, i: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
setcolor(yellow);
setfillstyle(1, yellow);
pieslice(400, 100, 0, 360, 20); {Солнце}
for i:=500 downto 300 do
begin
setcolor(7);
setfillstyle(1, 7);
fillellipse(i-10, 100, 30, 20); {Облако}
fillellipse(i-35, 105, 25, 15);
fillellipse(i+13, 105, 25, 15);
if i <450 then
begin {Дождик}
setlinestyle(2, 0, 1);
line(i+10, 125, i-10, 325);
line(i, 125, i-20, 325);
line(i-10, 125, i-30, 325);
line(i-20, 125, i-40, 325);
line(i-30, 125, i-50, 325)
end;
delay(1000);
setcolor(0);
setfillstyle(1, 0);
fillellipse(i-10, 100, 30, 20);
fillellipse(i-35, 105, 25, 15);
fillellipse(i+13, 105, 25, 15);
if i <450 then
begin
line(i+10, 125, i-10, 325);
line(i, 125, i-20, 325);
line(i-10, 125, i-30, 325);
line(i-20, 125, i-40, 325);
line(i-30, 125, i-50, 325)
end;
delay(1000)
end;
readln;
closegraph;
end.
