- •Листинги программ к статье и. М. Павловой "графика на паскале"
- •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. Организация движения с использованием динамической памяти
2. Создание рисунков с использованием прямоугольников
2.1. Использование процедур Rectangle, Bar
Задание 2.1.1. Нарисовать пять квадратов, лежащих на одной прямой и соприкасающихся друг с другом, причем сторона каждого следующего квадрата в два раза меньше стороны предыдущего. С клавиатуры вводятся координаты точки, из которой проводится линия, служащая основанием всех пяти квадратов.
uses
graph, crt;
var
x, x1, x2, y, y1, y2, i, err, gd, gm, rebro: integer;
begin
writeln('Введите координаты начальной точки построения x и y:');
readln(x, y);
writeln('Введите значение ребра квадрата:');
readln(rebro);
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
x1:=x; {x1 и y1 - координаты верхнего левого}
y1:=y-rebro; {угла каждого квадрата}
y2:=y; {х2 и у2 - нижнего правого угла}
for i:=1 to 5 do
begin
setcolor(4);
x2:=x1+rebro;
rectangle(x1, y1, x2, y2);
x1:=x2; {х1 данного квадрата совпадает с х2 предыдущего}
rebro:=rebro div 2;
y1:=y1+rebro
end;
readln;
closegraph;
end.
Задание 2.1.2. Нарисовать цепочку из квадратов, расположенных на диагонали экрана. С клавиатуры вводятся значение ребра квадрата и значение ребра малого квадрата, получающегося при наложении квадратов друг на друга.
uses
graph, crt;
const
x1=1;
y1=1;
var
x2, y2, i, err, gd, gm, rebro, period, kol_kv: integer;
begin
writeln('Введите значения ребер большого и малого квадратов,
а также количество квадратов:');
readln(rebro, period, kol_kv);
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 kol_kv do
begin
setcolor(4);
x2:=x1+rebro;
y2:=y1+rebro;
rectangle(x1, y1, x2, y2);
x1:=x1+rebro-period; {x1 и y1 - координаты нового квадрата}
y1:=y1+rebro-period
end;
readln;
closegraph;
end.
Задание 2.1.3. Нарисовать рамку для картины, состоящую из пересекающихся между собой квадратов (или ромбов). Приведенная программа рисует рамку последовательно из нижнего левого угла против часовой стрелки с небольшой задержкой, что создает дополнительный зрительный эффект. Программа упростится, если одновременно рисовать по две горизонтальные цепочки и по две вертикальные. Такой вариант подойдет для случая, когда рамка появляется одновременно вместе с размещенной в ней "картиной". При рисовании вертикальных цепочек используется прием переориентации осей координат. Очевидно, что для решения этой задачи можно использовать процедуры пользователя.
uses
graph, crt;
const
a=20;
x=80;
y=455;
var
x2, x3, y2v, y2n, 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;
y2v:=y-a;
y2n:=y+a;
for i:=1 to 14 do
begin {нижняя цепочка}
x2:=x+a;
x3:=x2+a;
moveto(x, y);
lineto(x2, y2v);
lineto(x3, y);
lineto(x2, y2n);
lineto(x, y);
x:=x3- a div 2;
delay(10000)
end;
x:=y;
y:=x3;
y2v:=y-a;
y2n:=y+a;
for i:=1 to 14 do
begin {правая цепочка}
x2:=x-a;
x3:=x2-a;
moveto(y, x);
lineto(y2v, x2);
lineto(y, x3);
lineto(y2n, x2);
lineto(y, x);
x:=x3+ a div 2;
delay(10000);
end;
x:=y;
y:=x3;
y2v:=y-a;
y2n:=y+a;
for i:=14 downto 1 do
begin {верхняя цепочка}
x2:=x-a;
x3:=x2-a;
moveto(x, y);
lineto(x2, y2v);
lineto(x3, y);
lineto(x2, y2n);
lineto(x, y);
x:=x3+a div 2;
delay(10000)
end;
x:=y;
y:=x3;
y2v:=y-a;
y2n:=y+a;
for i:=14 downto 1 do
begin {левая цепочка}
x2:=x+a;
x3:=x2+a;
moveto(y, x);
lineto(y2v, x2);
lineto(y, x3);
lineto(y2n, x2);
lineto(y, x);
x:=x3- a div 2;
delay(10000)
end;
readln;
closegraph;
end.
