ВВЕРХ
ВНИЗ

Ломаная PolyLine и замкнутая Polygon

На предыдущей странице Линии в паскаль мы рассматривали построение последовательных прямых линий, используя процедуры 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  
type
  Point = 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:

Код PascalABC
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
uses
  graphABC;

type { Описание типа Point с полями x, y: }
  Point = record
    x, y: integer;
end;

var
  P: array[1..4] of Point; //Массив точек

begin
  SetPenColor(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) //Рисуем ломаную по точкам из массива P
end.

То самое получим при использовании MoveTo(x, y) и LineTo(x, y):

Код PascalABC, PascalABC.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
uses
  graphABC;

begin
  SetWindowSize(600, 450);
  SetPenColor(clGreen); //Цвет линий
  SetPenWidth(3); //Толщина линий
  MoveTo(300, 100); //Начальная позиция рисования
  LineTo(500, 200);
  LineTo(300, 400);
  LineTo(150, 250)
end.

В обоих вариантах получим одинаковый результат:

Пример PolyLine в PascalABC

Приведем пример той же программы, но в PascalABC.Net:

Код PascalABC.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
uses
  graphABC;

var
  P: array of Point; //Массив точек

begin
  SetWindowSize(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) //Рисуем ломаную по точкам из массива P
end.

На странице Графики функций в паскале мы учились строить простейшие графики, используя процедуру Line для соединения точек графика. Приведем здесь пример ещё одного несложного графика на PascalABC.Net, но уже с использованием подпрограммы PolyLine. Комментарии в коде.


Процедура 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  
uses
  graphABC;

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.

Рисуем заполненный четырехугольник в PascalABC:

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
uses
  graphABC;

type
  Point = record
    x, y: integer;
end;

var
  P: array[1..4] of Point; //Массив точек

begin
  SetPenColor(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); //Рисуем ломаную по точкам из массива P
  FloodFill(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  
uses
  graphABC;

var
  P: array of Point;

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:

Код PascalABC.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
uses
  GraphABC;

var
  points: array of point; //координаты вершин многоугольника
  
begin
  SetWindowSize(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" (этот файл будет находится в той же папке, куда вы сохраните код данной программы):

Закрашенный четырехугольник в Pascal

Закрашенные многоугольники в PascalABC.Net:

Код PascalABC.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
uses
  GraphABC;

var
  points: array of point;
  
begin
  var R := 150; //Радиус окружности
  SetWindowSize(2 * R + 40, 2 * R + 40); //Размеры окна
  { Координаты центра окружности, вокруг
  которой будем строить многоугольник: }
  var x0 := WindowWidth div 2;
  var y0 := WindowHeight div 2;
  var count := 0;
  repeat
    var n := random(3, 30); //количество вершин многоугольника
    SetLength(points, n); //задаем размер массива координат вершин
    randomize;
    { Задаем вершины многоугольника: }
    for var i := 0 to n - 1 do begin
      var alfa : real := 2 * pi * i / n; //угол повотота радиуса
       //координаты точки окружности, соответствующей углу alfa
      var 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 //очищаем окно белым цветом
  until false { цикл будет бесконечным, поскольку условие после 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).


Яндекс.Метрика