- •Листинги программ к статье и. М. Павловой "графика на паскале"
- •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. Организация движения с использованием динамической памяти
1.2. Использование процедуры Line
Задание 1.2.1. Нарисовать лист из нотной тетради. Вычерчивается 12 полос по пять линий, причем сначала рисуется нижняя (пятая) линия в каждой полосе, а в последнюю очередь - верхняя.
uses
graph, crt;
var
j, i, 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(blue);
setbkcolor(white);
for i:=1 to 12 do
for j:=1 to 5 do
line(0, i*40-j*4, 640, i*40-j*4);
readln;
closegraph;
end.
Задание 1.2.2. Подготовить лист в косую линейку, как в тетради-прописи для младших школьников (с полями).
uses
graph, crt;
var
x, y, i, 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(blue);
setbkcolor(white);
for i:=1 to 12 do
begin
line(x, i*40, x+640, i*40); {Две горизонтальные линии - узкая}
line(x, i*40-10, x+640, i*40-10); {полоска высотой в 10 пикселей}
line(i*90, y, x, i*90) {Косая линия}
end;
setcolor(red);
line(580, 0, 580, 480); {Красная линия - поля}
readln;
closegraph;
end.
Задание 1.2.3. Нарисовать зигзаг из линий. В программе задаются координаты начальной точки, а также расстояние между зубцами по горизонтали и высота зубцов зигзага.
uses
graph, crt;
const
x=100;
y=240;
a=40;
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;
for i:=1 to 10 do
begin
line(x, y, x+a div 2, y-a);
line(x+a div 2,y-a, x+a, y);
x:=x+a
end;
readln;
closegraph;
end.
Задание 1.2.4. Нарисовать вертикальные жалюзи, которые медленно опускаются. Опускание жалюзи происходит за счет использования процедуры Delay (значение в данной процедуре нужно подбирать для каждого компьютера индивидуально, все примеры приводятся для Pentium с частотой 1000 Мгц). Если рисовать не каждую линию, то можно получать более "редкие" жалюзи или, наоборот, добиться эффекта полного закрашивания прямоугольника. Значения параметров в цикле отличаются на 1 от значений координат опорных точек линий, вычерчивающих контур прямоугольника. Это сделано с тем, чтобы при работе программы контур оставался закрашенным в свой цвет, в нашем случае это белая рама окна и голубые жалюзи. В качестве аналогичного задания можно предложить учащимся написать программу для двух пар горизонтальных жалюзи, которые раздвигаются в разные стороны или движутся навстречу друг другу. Можно использовать этот прием для имитации открытия или закрытия театрального занавеса.
uses
graph, crt;
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(100, 100, 300, 100); {Рисуется контур окна}
line(100, 100, 100, 400);
line(100, 400, 300, 400);
line(300, 400, 300, 100);
setcolor(blue);
for i:=101 to 399 do
begin {Опускаются жалюзи}
delay(1000);
if i mod 5 = 0 then line(101, i, 299, i)
end;
readln;
closegraph;
end.
Задание 1.2.5. Провести диагональную штриховку квадрата: из левого нижнего угла в правый верхний проводится линия, а остальные линии проводятся параллельно на расстоянии, задаваемом как шаг. Число линий штриховки определяется как результат целочисленного деления стороны квадрата на шаг штриховки. Можно предложить учащимся задание провести диагональную штриховку квадрата, аналогичную штриховке, описанной в предыдущей задаче, только направление линий выбирается параллельным диагонали, проведенной из левого верхнего угла квадрата в правый нижний.
uses
graph, crt;
var
x, y, error, gd, gm, a, v, i, z, w: integer;
begin
writeln('Введите координаты начальной точки:');
readln(x, y);
writeln('Введите длину стороны квадрата и шаг штриховки:');
readln(a, v);
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
error:=graphresult;
if error<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
moveto(x,y); {Рисуется квадрат}
linerel(a, 0);
linerel(0, a);
linerel(-a, 0);
linerel(0, -a);
moveto(x, y);
z:=x+a; {Вычисляются координаты точки,}
w:=y+a; {из которой начнется штриховка}
for i:=1 to a div v do
begin
line(x, w-i*v, x+i*v, w); {Заполняется верхний треугольник квадрата}
line(x+i*v, y, z, w-i*v) {Заполняется нижний треугольник квадрата}
end;
readln;
closegraph;
end.
Задание 1.2.6. Нарисовать два заштрихованных треугольника, расположенных на одной диагонали квадрата.
uses
graph, crt;
var
x, y, error, gd, gm, a, v, i, z, w: integer;
begin
writeln('Введите координаты начальной точки:');
readln(x, y);
writeln('Введите длину стороны квадрата и шаг штриховки:');
readln(a, v);
gd:=vga;
gm:=vgahi;
initgraph(gd ,gm, 'd:\bp\bgi');
error:=graphresult;
if error<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
moveto(x, y); {Рисуется квадрат}
linerel(a, 0);
linerel(0, a);
linerel(-a, 0);
linerel(0, -a);
moveto(x, y);
z:=x+a div 2; {Вычисляются координаты центра квадрата,}
w:=y+a div 2; {откуда начнется штриховка}
for i:=1 to (a div 2) div v do
begin
line(z, w-i*v, z-i*v, w);
line(z+i*v, w, z, w+i*v)
end;
readln;
closegraph;
end.
Задание 1.2.7. Нарисовать горизонтальную бабочку из линий штриховки путем вращения одной из диагоналей треугольника вокруг горизонтальной оси квадрата. Примечание. Использование разных шагов штриховки и подбор значений процедуры Delay позволяют добиваться эффектных результатов.
uses
graph, crt;
var
x, y, error, gd, gm, a, v, i, z, w: integer;
begin
writeln('Введите координаты начальной точки:');
readln(x, y);
writeln('Введите длину стороны квадрата и шаг штриховки:');
readln(a, v);
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
error:=graphresult;
if error<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
moveto(x, y);
linerel(a, 0);
linerel(0, a);
linerel(-a, 0);
linerel(0, -a);
moveto(x, y);
z:=x+a;
w:=y+a;
for i:=1 to (a div v)+1 do
line(x, y+(i-1)*v, z, w-(i-1)*v);
readln;
closegraph;
end.
Задание 1.2.8. Нарисовать цветок, лепестками которого будут служить прямые линии. Если изменять значения радиуса и коэффициенты перед функциями sin и cos, то размер лепестков и их количество будут меняться.
uses
graph, crt;
var
x, y, err, gd, gm, i, r: integer;
begin
gd:=vga;
gm:=vgahi;
initgraph(gd, gm, 'd:\bp\bgi');
err:=graphresult;
if err<>grok then
begin
writeln('Ошибка открытия графики');
halt(1)
end;
r:=10;
for i:=1 to 360 do
begin
setcolor(11);
y:=240+round(5*sin((i*pi)/180))*r;
x:=320+round(5*cos((i*pi)/180))*r;
line(320, 240, x, y)
end;
readln;
closegraph;
end.
