ВВЕРХ
ВНИЗ

Процедуры ClosedCurve, FillClosedCurve

Здравствуйте! Сегодня изучим, как в PascalABC.Net нарисовать замкнутую кривую линию процедурой ClosedCurve, а также заполнить цветом замкнутую кривую с помощью процедуры FillClosedCurve. Эта статья является продолжением материала Замкнутая незаполненная кривая DrawClosedCurve в PascalABC.Net, поэтому рекомендую прочитать вначале его. Как видно из названия последней ссылки, в той статье речь шла о рисовании с помощь паскаля незамкнутой кривой, а здесь поговорим о замкнутых.

Процедура ClosedCurve

Как всегда, вначале дадим определение, а потом рассмотрим примеры.

procedure ClosedCurve(points: array of Point);

   — Рисует заполненную замкнутую кривую по точкам, координаты которых заданы в массиве points

Здесь видно из названия, что переменной процедуры ClosedCurve является массив точек типа Point. Что это значит? Это означает, что для задания замкнутой кривой необходимо задать координаты точек, через которые она будет проходить. Потом в конце просто вызывается процедура, которая нарисует замкнутую кривую с заданными узловыми точками.

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

var
  P: array of point;

begin
  SetWindowSize(400, 300); //размеры окна
  SetLength(P, 4); //количество точек кривой
  p[0].X := 100; p[0].Y := 50;  //1-я точка
  p[1].X := 350; p[1].Y := 100; //2-я точка
  p[2].X := 200; p[2].Y := 250; //3-я точка
  p[3].X := 70;  p[3].Y := 200; //4-я точка
  SetPenColor(clRandom); //цвет границы кривой
  SetPenWidth(3); //толщина границы кривой
  SetBrushColor(clRandom); //цвет заливки кривой
  ClosedCurve(P) { <-- Рисуем замкнутую заполненную 
кривую по точкам,координаты которых заданы в массиве P }
end.

Замкнутая кривая ClosedCurve в PascalABC.Net

Разберем кратко содержание кода программы.

5 строка. Описываем переменную P – название массива точек.

8 строка. Задаем размеры окна с помощью процедуры SetWindowSize. Если этого не сделать, то по-умолчанию окно будет 800 на 600 пикселей.

9 строка. Количество точек задаем 4.

10 – 13 строки. Задаем координаты точек.

14, 15 строки. Цвет границы кривой берем случайным, толщина 3 px.

16 строка. Цвет заливки тоже случайный. Это значит, что при запуске программы каждый раз цвет будет разный.

17 строка. Вызываем саму процедуру ClosedCurve(P), передавая в неё параметр Р – массив точек, заданный в строках 10 - 13.


А теперь напишем такую же программу, но которая будет выводить одину за другой случайную замкнутую линию, залитую случайным цветом. Проходить это будет в цикле до тех пор, пока вы его не остановите. К стати, чтобы запустить бесконечный цикл с предусловием
while [условие входа в цикл] do begin [тело цикла] end,
нужно условии указать логическое True, а для бесконечного цикла
repeat [тело цикла] until [условие выхода из цикла]
в условии указываем False
.

Запускаем программу и смотрим на картинки.

Код 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  
uses
  GraphABC;

var
  P: array of point;

begin
  //SetWindowSize(400, 300); //размеры окна (не обязательно)
  LockDrawing; //блокировка рисования
  while true do begin
    var n := random(5, 50); //количество вершин случайно - от 5 до 50
    SetLength(P, n); //уснанавливаем размер массива равным n
    randomize;
    { Инициализация случайных координат точек: }
    for var i := 0 to n - 1 do begin
      p[i].X := random(25, WindowWidth - 25);
      p[i].Y := random(25, WindowHeight - 25)
    end;
    SetPenColor(clRandom); //цвет границы замкнутой кривой
    SetPenWidth(3); //толщина границы кривой
    SetBrushColor(clRandom); //цвет заливки кривой
    ClosedCurve(P); //вызываем процедуру для рисования кривой
    ReDraw; //перерисовываем содержимое графического окна
    sleep(2000); //делаем паузу на 2 секунды
    ClearWindow //очищаем окно белым цветом
  end
end.


Наведите курсором на картинку и полистайте стрелкой:

А теперь сравните с похожими рисунками, но нарисованными с помощью FillPolygon в статье Процедуры DrawPolygon и FillPolygon. Правда, отличие тех рисунков от указанных выше состоит в отсутствии границы области, так как для этого нужно использовать процеруру, которую мы рассмотрим ниже.

Процедура FillClosedCurve

procedure FillClosedCurve(points: array of Point);

   — Заполняет замкнутую кривую по точкам, координаты которых заданы в массиве points

Эта процедура только заполняет цветом кривую, но не рисует самой линии.

Код 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(400, 300); //размеры окна
  SetLength(P, 4); //количество точек кривой
  p[0].X := 100; p[0].Y := 50;  //1-я точка
  p[1].X := 350; p[1].Y := 100; //2-я точка
  p[2].X := 200; p[2].Y := 250; //3-я точка
  p[3].X := 70;  p[3].Y := 200; //4-я точка
  SetBrushColor(clRandom); //цвет заливки кривой
  FillClosedCurve(P) { <-- Заполняем замкнутую 
  кривую по точкам из массива P }
end.

Заполнение замкнутой кривой FillClosedCurve в PascalABC.Net

Как видно из рисунка, он отличается от картинки выше только тем, что у него отсутствует граница. Так и должно быть, это и есть главное отличие процедуры ClosedCurve (замкнутая кривая с границей) от FillClosedCurve (заполнение замкнутой кривой).

Приведем ещё один приер. Нарисуем сначала линию с помощью процедуры DrawClosedCurve (см. статью), а потом заполним её цветом процедурой FillClosedCurve. Последовательность такова: сначала рисуется линия, а потом через 2 секунды (процедура sleep) по тем же точкам заполняем данную кривую цветом. Комментарии все в коде программы.

Код 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;
  
const
  n = 10;
  
var
  points: array of point;
  
begin
  SetWindowSize(400, 300); //размеры окна
  SetLength(points, n); //количество точек кривой
  randomize;
  { Вычисляем случайные координаты точек: }
  for var i := 0 to n - 1 do begin
    points[i].X := random(20, Window.Width - 20);
    points[i].Y := random(20, Window.Height - 20);
  end;

  { Рисуем линию: }
  SetPenWidth(2); //толщина линии
  SetPenColor(clred); //цвет линии
  DrawClosedCurve(points); //рисуем саму линию
  
  sleep(2000); //пауза на 2 секунды
  
  { Заливаем линию цветом: }
  SetBrushColor(Cllime); //цвет заливки
  FillClosedCurve(points); //вызываем процедуру для заливки кривой
end.

Замкнутая линия DrawClosedCurve в PascalABC.NetЗаполнение замкнутой кривой FillClosedCurve в PascalABC.Net

На этом все. Пишите в комментариях, спрашивайте.


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