На предыдущей странице Линии в паскаль мы рассматривали построение последовательных прямых линий, используя процедуры MoveTo и LineTo. Но зная координаты вершин ломаной (замкнутой или нет), того же можно добится с помощью процедур PolyLine и Polygon. Каким образом, и какое отличие между этими подпрограммами?
Процедура PolyLine рисования ломаной линии
✎PolyLine — процедура, рисует ломаную линию по точкам, координаты которых заданы в массиве points. В PascalABC и PascalABC.Net эта процедура задается немного по-разному.
Сначала мы определим PolyLine в PascalABC и PascalABC.Net, а ниже приведем примеры.
PolyLine в PascalABC:
procedure PolyLine(var points: array[1..n] of Point; n: integer);
— Строит ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point, задаваемый с помощью записи:
Код PascalABC
1
2
3
4
typePoint=record//Point типа запись
x, y:Integer; //x, y - поля записиend;
PolyLine в PascalABC.Net:
procedure PolyLine(points: array of Point);
— Рисует ломаную по точкам, координаты которых заданы в массиве points. То есть points – это динамический массив, для которого нужно предварительно задать размер, а тип Point описывать не нужно (это встроенный тип PascalABC.Net).
Здесь видно, что в PascalABC.Net процедура PolyLine имеет только один параметр - собственно сам массив точек points (в отличии от простого PascalABC, где есть ещё второй параметр – размер массива, или количество точек). Ещё нужно помнить, что в динамических массивах нумерация начинается с 0.
Построим пример ломаной линии из массива точек PolyLine в PascalABC:
usesgraphABC;
type{ Описание типа Point с полями x, y: }
Point =record
x, y:integer;
end;
var
P:array[1..4]of Point; //Массив точекbeginSetPenColor(clGreen); //Цвет линийSetPenWidth(3); //Толщина линий
p[1].x:=300; p[1].y:=100; //Координаты первой вершины
p[2].x:=500; p[2].y:=200; //Координаты второй вершины
p[3].x:=300; p[3].y:=400; //Координаты третьей вершины
p[4].x:=150; p[4].y:=250; //Координаты четвертой вершиныPolyLine(P,4)//Рисуем ломаную по точкам из массива Pend.
То самое получим при использовании MoveTo(x, y) и LineTo(x, y):
Приведем пример той же программы, но в PascalABC.Net:
Код PascalABC.Net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
usesgraphABC;
var
P:arrayofPoint; //Массив точекbeginSetWindowSize(600,450); //Устанавливаем размер окнаSetPenColor(clGreen); //Цвет линийSetPenWidth(3); //Толщина линийSetLength(P,4); //Устанавливаем размер массива points
p[0].x:=300; p[0].y:=100; //Координаты первой вершины
p[1].x:=500; p[1].y:=200; //Координаты второй вершины
p[2].x:=300; p[2].y:=400; //Координаты третьей вершины
p[3].x:=150; p[3].y:=250; //Координаты четвертой вершиныPolyLine(P)//Рисуем ломаную по точкам из массива Pend.
На странице Графики функций в паскале мы учились строить простейшие графики, используя процедуру Line для соединения точек графика. Приведем здесь пример ещё одного несложного графика на PascalABC.Net, но уже с использованием подпрограммы PolyLine. Комментарии в коде.
uses
GraphABC;
function f(const x:real):real;
begin
f := sqrt(x)//Функция корень квадратныйend;
var
P:arrayof Point;
beginvar W := WindowWidth;
var H := WindowHeight;
var x0 :=50;
var y0 := H -50;
SetPenColor(clGreen); //Цвет осей координат
SetPenWidth(2); //Толщина осей координат
Line(x0 -20, y0, W -30, y0); //Ось OX
Line(x0,30, x0, H -30); //Ось OY
SetFontSize(14); //Размер шрифта для букв O, X, Y
SetFontColor(clRed); //Цвет букв O, X, Y
TextOut(x0 -30, y0 +10,'O'); //Подписываем начало координат
TextOut(W -20, y0 +10,'X'); //Подписываем ось OX
TextOut(x0 +10,20,'Y'); //Подписываем ось OY
SetFontSize(10); //Для чисел уменьшаем шрифт с 14 до 10
SetFontColor(clBlue);
SetPenColor(clGreen);
SetPenWidth(1);
var mx :real:=(W -100)/10; //Масштаб по оси OXvar my :real:=(H -100)/3.2; //Масштаб по оси OY{ Засечки и вертикальная сетка: }forvar i :=1to10dobeginvar x1 := x0 + round(i * mx);
{ Рисуем вертикальную сетку: }
SetPenColor(RGB(220,220,220));
Line(x1, y0 -7, x1,30);
SetPenColor(clGreen);
{ Рисуем и подписываем засечки на оси OX: }
Line(x1, y0 +5, x1, y0 -5);
var s := i.ToString;
TextOut(x1 - TextWidth(s)div2, y0 +10, s)end;
{ Засечки и горизонтальная сетка: }forvar i :=1to16dobeginvar y1 := y0 - round(0.2* i * my);
{ Рисуем горизонтальную сетку: }
SetPenColor(RGB(220,220,220));
Line(x0 +7, y1, W -30, y1);
SetPenColor(clGreen);
{ Рисуем и подписываем засечки на оси OY: }
Line(x0 -5, y1, x0 +5, y1);
var s :=(0.2* i).ToString;
TextOut(x0 -35, y1 - TextHeight(S)div2, s);
end;
var n :=100; //Количество точек для построения графика
SetLength(P, n); //Устанавливаем размер массиваforvar i :=0to n -1dobeginvar x1 :=10* i /(n -1); //Интервал 10 делим на количество отрезков (n-1){ Вычисляем координаты точки (x1; f(x1)) в графическом окне: }
p[i].X:= x0 + round(x1 * mx);
p[i].Y:= y0 - round(f(x1)* my)end;
SetPenColor(clBlack); //Цвет графика - черный
PolyLine(P)//Рисуем ломаную через n точек, получим (n-1) отрезковend.
Результат построения графика функции корень квадратный в среде PascalABC.Net видно на рисунке:
Процедура Polygon рисования многоугольника
✎Polygon — процедура, рисует замкнутую ломаную в PascalABC и заполненный многоугольник в PascalABC.Net по точкам, координаты которых заданы в массиве points.
Определение:
Polygon в PascalABC:
procedure Polygon(var A: array[1..n] of Point; n: integer);
— Строит замкнутую ломаную по n точкам, координаты которых заданы в массиве a элементов типа Point. Здесь Point - тип точки в PascalABC.
Polygon в PascalABC.Net:
procedure Polygon(points: array of Point);
— Рисует заполненный многоугольник, координаты вершин которого заданы в массиве points. Здесь points - это динамический массив точек типа Point, имеющий поля X, Y (координаты точки в графическом окне). Point в PascalABC.Net - это встроенный тип данных (примитивный, базовый), то есть такой, описывать который не нужно.
Какое отличие Polygon от PolyLine? Отличие только в том, что в случае с Polygon первая точка замыкается с последней, и в результате получаем не просто ломаную линию, а замкнутую ломаную – многоугольник. Далее приводим серию примеров использвания процедуры Polygon в PascalABC и PascalABC.Net для рисования многоугольников.
Мгогоугольник в PascalABC
Рисуем треугольник в PascalABC:
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
usesgraphABC;
type{ Описание типа точки: }
Point =record
x, y:integer;
end;
var{ Многоугольник имеет 3 вершины: }
p:array[1..3]of Point;
begin{ Координаты точек: }
p[1].x:=100; p[1].y:=100;
p[2].x:=500; p[2].y:=200;
p[3].x:=300; p[3].y:=500;
{ Рисуем треугольник: }Polygon(p,3)end.
usesgraphABC;
type
Point =record
x, y:integer;
end;
var
P:array[1..4]of Point; //Массив точекbeginSetPenColor(clGreen); //Цвет границы многоугольникаSetPenWidth(3); //Толщина линий
p[1].x:=300; p[1].y:=100; //Координаты первой вершины
p[2].x:=500; p[2].y:=200; //Координаты второй вершины
p[3].x:=300; p[3].y:=400; //Координаты третьей вершины
p[4].x:=150; p[4].y:=250; //Координаты четвертой вершиныPolygon(P,4); //Рисуем ломаную по точкам из массива PFloodFill(350,200,clRed)end.
Многоугольник в PascalABC.Net
Рисуем треугольник в PascalABC.Net:
Код PascalABC.Net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
usesgraphABC;
var
P:arrayofPoint;
begin{ Длина массива давна количеству вершин многоугольника: }SetLength(P,3);
{ Определяем координаты 3 точек: }
p[0].x:=100; p[0].y:=50;
p[1].x:=500; p[1].y:=200;
p[2].x:=300; p[2].y:=400;
{ Рисуем многоугольник: }Polygon(P)end.
Рисуем закрашенный четырехугольник в PascalABC.Net:
usesGraphABC;
var
points:arrayofpoint; //координаты вершин многоугольникаbeginSetWindowSize(400,300); //Размеры окнаSetLength(points,4); //задаем размер массива координат вершинSetPenColor(ClGreen); //цвет границы многоугольникаSetPenWidth(5); //ширина границы многоугольникаSetBrushColor(ClRed); //цвет области многоугольника{ Задаем вершины многоугольника: }//координаты 1-й вершины многоугольника:
points[0].X:=80;
points[0].Y:=80;
//координаты 2-й вершины многоугольника:
points[1].X:=370;
points[1].Y:=35;
//координаты 3-й вершины многоугольника:
points[2].X:=300;
points[2].Y:=280;
//координаты 4-й вершины многоугольника:
points[3].X:=20;
points[3].Y:=200;
{ Строим многоугольник: }Polygon(points);
{ Сохраняем изображение в файл: }SaveWindow('Закрашенный четырехугольник.jpg')end.
Здесь мы сохранили результат изображения в графическом окне с помощью процедуры SaveWindow в файл с именем "Закрашенный четырехугольник.jpg" (этот файл будет находится в той же папке, куда вы сохраните код данной программы):
usesGraphABC;
var
points:arrayofpoint;
beginvar R :=150; //Радиус окружностиSetWindowSize(2* R +40,2* R +40); //Размеры окна{ Координаты центра окружности, вокруг
которой будем строить многоугольник: }var x0 :=WindowWidthdiv2;
var y0 :=WindowHeightdiv2;
var count :=0;
repeatvar n :=random(3,30); //количество вершин многоугольникаSetLength(points, n); //задаем размер массива координат вершинrandomize;
{ Задаем вершины многоугольника: }forvar i :=0to n -1dobeginvar alfa :real:=2*pi* i / n; //угол повотота радиуса//координаты точки окружности, соответствующей углу alfavar x1 := x0 +round(R *cos(alfa));
var y1 := y0 -round(R *sin(alfa));
//координаты i-й вершины многоугольника:
points[i].X:=random(x1 -15, x1 +15);
points[i].Y:=random(y1 -15, y1 +15);
end;
SetPenColor(ClRandom); //цвет границы многоугольникаSetPenWidth(random(1,5)); //ширина границы многоугольникаSetBrushColor(ClRandom); //цвет области многоугольникаPolygon(points); //строим многоугольникinc(count); //увеличиваем количество многоугольников{ Сохраняем рисунки многоугольников в файл: }SaveWindow('Закрашенный четырехугольник-'+ count.ToString+'.jpg');
sleep(2000); //задержка на 2 секундыClearWindow//очищаем окно белым цветомuntilfalse{ цикл будет бесконечным, поскольку условие после until всегда ложно }end.
Программа работает так: при запуске в графическом окне каждые 2 секунды появляются закрашенные многоугольники со случайным количеством вершин от 3 до 30 (строка 16 кода). Потом определяем координаты вершин правильного многоугольника, и вслед за этим находим вершины нужного нам многоугольника как случайное отклонение на 15 пикселей (строки 20 - 28). Далее рисуем многоугольник (строка 32) и сохраняем его изображение (строка 35).
Обратите внимание, что этот процесс запущен в бексонечном цикле (условие false на выходе цикла repeat-until всегда ложно, поэтому он никогда не остановится), поэтому остановить его нужно просто закрыв окно. А ещё важное: каждые две секунды у вас в папке с программой будет появляться новый файл изображения типа "Закрашенный четырехугольник-1.jpg", "Закрашенный четырехугольник-2.jpg", "Закрашенный четырехугольник-3.jpg" и т.д., и если вам будут не нужны эти рисунки, то их надо удалить. Вот примеры таких многоугольников (наведите мышкой на картинку и прокручивайте вперед-назад):
Наконец, хотелось бы отметить важное замечание относительно процедуры Polygon: в PascalABC она рисует незаполненный многоугольник, а в PascalABC.Net – заполненный. Это значит, что для закрашивания многоугольника в PascalABC нужно использовать процедуру FloodFill(x, y, Color: integer) заполнения замкнутой области цвета color начиная с точки (x, y), а в PascalABC.Net – только задать цвет кисти SetBrushColor(C: Color).