Здравствуйте! Сегодня изучим, как в PascalABC.Net нарисовать замкнутую кривую линию процедурой ClosedCurve, а также заполнить цветом замкнутую кривую с помощью процедуры FillClosedCurve. Эта статья является продолжением материала Замкнутая незаполненная кривая DrawClosedCurve в PascalABC.Net, поэтому рекомендую прочитать вначале его. Как видно из названия последней ссылки, в той статье речь шла о рисовании с помощь паскаля незамкнутой кривой, а здесь поговорим о замкнутых.
Как всегда, вначале дадим определение, а потом рассмотрим примеры.
✎ **procedure** ClosedCurve(points: **array of** Point);
— Рисует заполненную замкнутую кривую по точкам, координаты которых заданы в массиве points
Здесь видно из названия, что переменной процедуры ClosedCurve является массив точек типа Point. Что это значит? Это означает, что для задания замкнутой кривой необходимо задать координаты точек, через которые она будет проходить. Потом в конце просто вызывается процедура, которая нарисует замкнутую кривую с заданными узловыми точками.
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.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** Point = System.Drawing.Point;
: Тип точки**procedure** SetWindowSize(w,h: integer);
: Устанавливает размеры клиентской части графического окна в пикселах**procedure** SetLength(**var** a: System.Array; n: integer);
: Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется. Ссылка a на массив может измениться.**procedure** SetPenColor(c: Color);
: Устанавливает цвет текущего пера**function** clRandom: Color;
: Возвращает случайный цвет**procedure** SetPenWidth(Width: integer);
: Устанавливает ширину текущего пера**procedure** SetBrushColor(c: Color);
: Устанавливает цвет текущей кисти**function** clRandom: Color;
: Возвращает случайный цвет**procedure** ClosedCurve(points: **array** **of** Point);
: Рисует заполненную замкнутую кривую по точкам, координаты которых заданы в массиве points
Разберем кратко содержание кода программы.
А теперь напишем такую же программу, но которая будет выводить одину за другой случайную замкнутую линию, залитую случайным цветом. Проходить это будет в цикле до тех пор, пока вы его не остановите. К стати, чтобы запустить бесконечный цикл с предусловием
while [условие входа в цикл] do begin [тело цикла] end,
нужно условии указать логическое True, а для бесконечного цикла
repeat [тело цикла] until [условие выхода из цикла]
в условии указываем False.
Запускаем программу и смотрим на картинки.
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.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** Point = System.Drawing.Point;
: Тип точки**procedure** LockDrawing;
: Блокирует рисование на графическом окне. Перерисовка графического окна выполняется с помощьюRedraw
**const** true = True;
: Представляет логическое значение.
**function** Random(maxValue: integer): integer;
: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2)**function** Random(a,b: integer): integer;
: Возвращает случайное целое в диапазоне от a до b.3)**function** Random: real;
: Возвращает случайное вещественное в диапазоне [0..1).**procedure** SetLength(**var** a: System.Array; n: integer);
: Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется. Ссылка a на массив может измениться.**procedure** Randomize;
: Инициализирует датчик псевдослучайных чисел.2)**procedure** Randomize(seed: integer);
: Инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности.**function** Random(maxValue: integer): integer;
: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2)**function** Random(a,b: integer): integer;
: Возвращает случайное целое в диапазоне от a до b.3)**function** Random: real;
: Возвращает случайное вещественное в диапазоне [0..1).**function** WindowWidth: integer;
: Возвращает ширину клиентской части графического окна в пикселах**function** Random(maxValue: integer): integer;
: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2)**function** Random(a,b: integer): integer;
: Возвращает случайное целое в диапазоне от a до b.3)**function** Random: real;
: Возвращает случайное вещественное в диапазоне [0..1).**function** WindowHeight: integer;
: Возвращает высоту клиентской части графического окна в пикселах**procedure** SetPenColor(c: Color);
: Устанавливает цвет текущего пера**function** clRandom: Color;
: Возвращает случайный цвет**procedure** SetPenWidth(Width: integer);
: Устанавливает ширину текущего пера**procedure** SetBrushColor(c: Color);
: Устанавливает цвет текущей кисти**function** clRandom: Color;
: Возвращает случайный цвет**procedure** ClosedCurve(points: **array** **of** Point);
: Рисует заполненную замкнутую кривую по точкам, координаты которых заданы в массиве points**procedure** Redraw;
: Перерисовывает содержимое графического окна. Вызывается в паре сLockDrawing
**procedure** Sleep(ms: integer);
: Делает паузу на ms миллисекунд**procedure** ClearWindow;
: Очищает графическое окно белым цветом А теперь сравните с похожими рисунками, но нарисованными с помощью FillPolygon в статье Процедуры DrawPolygon и FillPolygon. Правда, отличие тех рисунков от указанных выше состоит в отсутствии границы области, так как для этого нужно использовать процеруру, которую мы рассмотрим ниже.
✎ **procedure** FillClosedCurve(points: **array of** Point);
— Заполняет замкнутую кривую по точкам, координаты которых заданы в массиве points
Эта процедура только заполняет цветом кривую, но не рисует самой линии.
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.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** Point = System.Drawing.Point;
: Тип точки**procedure** SetWindowSize(w,h: integer);
: Устанавливает размеры клиентской части графического окна в пикселах**procedure** SetLength(**var** a: System.Array; n: integer);
: Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется. Ссылка a на массив может измениться.**procedure** SetBrushColor(c: Color);
: Устанавливает цвет текущей кисти**function** clRandom: Color;
: Возвращает случайный цвет**procedure** FillClosedCurve(points: **array** **of** Point);
: Заполняет замкнутую кривую по точкам, координаты которых заданы в массиве points
Как видно из рисунка, он отличается от картинки выше только тем, что у него отсутствует граница. Так и должно быть, это и есть главное отличие процедуры ClosedCurve (замкнутая кривая с границей) от FillClosedCurve (заполнение замкнутой кривой).
Приведем ещё один приер. Нарисуем сначала линию с помощью процедуры DrawClosedCurve (см. статью), а потом заполним её цветом процедурой FillClosedCurve. Последовательность такова: сначала рисуется линия, а потом через 2 секунды (процедура sleep) по тем же точкам заполняем данную кривую цветом. Комментарии все в коде программы.
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.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** Point = System.Drawing.Point;
: Тип точки**procedure** SetWindowSize(w,h: integer);
: Устанавливает размеры клиентской части графического окна в пикселах**procedure** SetLength(**var** a: System.Array; n: integer);
: Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется. Ссылка a на массив может измениться.
**procedure** Randomize;
: Инициализирует датчик псевдослучайных чисел.2)**procedure** Randomize(seed: integer);
: Инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности.**function** Random(maxValue: integer): integer;
: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2)**function** Random(a,b: integer): integer;
: Возвращает случайное целое в диапазоне от a до b.3)**function** Random: real;
: Возвращает случайное вещественное в диапазоне [0..1).**function** Random(maxValue: integer): integer;
: Возвращает случайное целое в диапазоне от 0 до maxValue - 1.2)**function** Random(a,b: integer): integer;
: Возвращает случайное целое в диапазоне от a до b.3)**function** Random: real;
: Возвращает случайное вещественное в диапазоне [0..1).**procedure** SetPenWidth(Width: integer);
: Устанавливает ширину текущего пера**procedure** SetPenColor(c: Color);
: Устанавливает цвет текущего пера Цвет:clRed
– красный**procedure** DrawClosedCurve(points: **array** **of** Point);
: Рисует замкнутую кривую по точкам, координаты которых заданы в массиве points**procedure** Sleep(ms: integer);
: Делает паузу на ms миллисекунд**procedure** SetBrushColor(c: Color);
: Устанавливает цвет текущей кисти**procedure** FillClosedCurve(points: **array** **of** Point);
: Заполняет замкнутую кривую по точкам, координаты которых заданы в массиве points На этом все. Пишите в комментариях, спрашивайте.