Эта статья является естественным продолжением предыдущей Кривая линия Curve, и здесь рассмотрим построение замкнутой кривой линиии в PascalABC.Net, отличающееся от построения линиии Curve только тем, что первая и последняя точка соединяются вместе.
✎ **procedure** DrawClosedCurve(points: **array of** Point);
— Рисует замкнутую кривую по точкам, координаты которых заданы в массиве points
Перейдем сразу к делу – нарисуем простейшую замкнутую линию, проходящую через три точки. В этом случае длина массива будет равна 3, индексы массива меняются от 0 до 2 (массив динамический), длина задается с помощью процедуры SetLength(...)
. Вот, что получилось:
uses
GraphABC;
var
P: array of Point;
begin
SetLength(P, 3); //Длина массива P равна 3
{ Назначаем координаты фигуры: }
p[0].X := 50; p[0].Y := 100;
p[1].X := 200; p[1].Y := 50;
p[2].X := 200; p[2].Y := 150;
{ Рисуем замкнутую кривую из массива P: }
DrawClosedCurve(P)
end.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** Point = System.Drawing.Point;
: Тип точки**procedure** SetLength(**var** a: System.Array; n: integer);
: Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется. Ссылка a на массив может измениться.**procedure** DrawClosedCurve(points: **array** **of** Point);
: Рисует замкнутую кривую по точкам, координаты которых заданы в массиве points
Идем далее. С помощью процедуры DrawClosedCurve можно создавать самые разные фигуры. Например, создадим рисунок, который мне напоминает зуб. Чтобы поместить его в центре окна, используем процедуру SetCoordinateOrigin(x,y)
, где x,y – новые координаты начала координат. Напомню, что по умолчанию начало координат, то есть точка (0; 0), находится в левом верхнем углу графического окна, а указанная выше процедура перемещает его в точку (x; y). Дополнительные комментарии в коде.
uses
GraphABC;
var
P: array of Point;
begin
{ Координаты центра окна: }
var x0 := WindowWidth div 2;
var y0 := WindowHeight div 2;
{ Устанавливаем начало координат в точку (x0,y0): }
SetCoordinateOrigin(x0, y0);
SetLength(P, 4); //Длина массива P равна 4
{ Назначаем координаты фигуры: }
p[0].X := 0; p[0].Y := 100;
p[1].X := -100; p[1].Y := -100;
p[2].X := 0; p[2].Y := -100;
p[3].X := 100; p[3].Y := -100;
{ Рисуем замкнутую кривую из массива P: }
DrawClosedCurve(P)
end.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** Point = System.Drawing.Point;
: Тип точки**function** WindowWidth: integer;
: Возвращает ширину клиентской части графического окна в пикселахA **div** B
- целочисленное деление А на В**function** WindowHeight: integer;
: Возвращает высоту клиентской части графического окна в пикселахA **div** B
- целочисленное деление А на В**procedure** SetCoordinateOrigin(x0,y0: integer);
:
Устанавливает начало координат в точку (x0,y0)**procedure** SetLength(**var** a: System.Array; n: integer);
: Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется. Ссылка a на массив может измениться.**procedure** DrawClosedCurve(points: **array** **of** Point);
: Рисует замкнутую кривую по точкам, координаты которых заданы в массиве points
Нарисуем ещё одну замкнутую кривую, используя процедуру DrawClosedCurve в PascalABC.Net. В этом случае основные вычисления выполним в подпрограмме bone ("кость" по-английски), а потом только вызовем её из тела программы. Название процедуры bone взято потому, что нарисованная линия действительно напоминает кость. К тому же, замкнутую фигуру всегда можно залить некоторым цветом с помощью процедуры FloodFill(...)
, поэтому в 24-й строке кода нашу кость мы окрашиваем в один из стандартных цветов PascalABC.Net. Все комментарии в коде:
uses
GraphABC;
{ Процедура рисует фигуру похожую на кость, где
x, y - координаты левого верхнего угла фигуры: }
procedure bone(x, y: integer);
var
P: array of Point; //Массив точек
begin
SetCoordinateOrigin(x, y); //Начало координат в точке (x,y)
SetLength(P, 8); //Длина массива равна 8
{ Определяем координаты: }
p[0].X := -150; p[0].Y := -50;
p[1].X := -155; p[1].Y := 0;
p[2].X := -150; p[2].Y := 50;
p[3].X := 0; p[3].Y := 25;
p[4].X := 150; p[4].Y := 50;
p[5].X := 155; p[5].Y := 0;
p[6].X := 150; p[6].Y := -50;
p[7].X := 0; p[7].Y := -25;
SetPenWidth(2); //Толщина линии 2 пикселя
DrawClosedCurve(P); //Рисуем замкнутую линию
{ Заполняем замкнутую линию цветом: }
FloodFill(x, y, clLightGoldenrodYellow)
end;
begin
{ Вызываем процедуру и помещаем её в центр окна: }
bone(WindowWidth div 2, WindowHeight div 2)
end.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647**type** Point = System.Drawing.Point;
: Тип точки**procedure** SetCoordinateOrigin(x0,y0: integer);
:
Устанавливает начало координат в точку (x0,y0)**procedure** SetLength(**var** a: System.Array; n: integer);
: Устанавливает длину одномерного динамического массива. Старое содержимое сохраняется. Ссылка a на массив может измениться.**procedure** SetPenWidth(Width: integer);
: Устанавливает ширину текущего пера**procedure** DrawClosedCurve(points: **array** **of** Point);
: Рисует замкнутую кривую по точкам, координаты которых заданы в массиве points**procedure** FloodFill(x,y: integer; c: Color);
: Заливает область одного цвета цветом c, начиная с точки (x,y) Цвет:clLightGoldenrodYellow
– Светло-жёлтый золотистый**function** WindowWidth: integer;
: Возвращает ширину клиентской части графического окна в пикселахA **div** B
- целочисленное деление А на В**function** WindowHeight: integer;
: Возвращает высоту клиентской части графического окна в пикселахA **div** B
- целочисленное деление А на В
Естественно, чтобы нарисованная кость выглядела более естественно, нужно использовать больше узловых точек, через которые проходит линия, а мы взяли только 8 (для примера).
Наконец, напишем программу-слайд, демонстрирующую появление случайно нарисованных замкнутых линий, подобно тому, как это было сделано на предыдущей странице.
uses
GraphABC;
var
points: array of point; //массив точек
begin
SetFontColor(ClRed); //цвет шрифта подписи точек номерами
SetFontSize(12); //размер шрифта в пунктах
SetPenColor(ClGreen); //цвет линии (по умолчанию черный)
randomize; //количество точек и координаты будут случайными
LockDrawing;
repeat
var n := random(5, 20); { <== количество точек случайно от 5 до 20 }
SetLength(points, n); //размер массива точек равен n
for var i := 0 to n - 1 do begin
{ Координаты точек: }
points[i].X := random(50, WindowWidth - 50);
points[i].Y := random(50, WindowHeight - 50);
{ Рисуем для наглядности точку: }
SetBrushColor(clGreen); //цвет точки
FillCircle(points[i].X, points[i].Y, 3); //точка в виде кружечка
{ Подписываем точку номером: }
SetBrushColor(clTransparent); //цвет области подписи прозрачный
TextOut(points[i].X, points[i].Y, i.ToString) //сама подпись
end;
DrawClosedCurve(points); //Рисуем замкнутую линию из массива
ReDraw;
sleep(3000); //пауза на 3 секунды (3000 мс)
ClearWindow //очищаем графическое окно белым цветом
until false { <-- Бесконечный цикл }
end.
**unit** GraphABC;
: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне**type** Point = System.Drawing.Point;
: Тип точки**procedure** SetFontColor(c: Color);
: Устанавливает цвет текущего шрифта Цвет:clRed
– красный**procedure** SetFontSize(size: integer);
: Устанавливает размер текущего шрифта в пунктах**procedure** SetPenColor(c: Color);
: Устанавливает цвет текущего пера Цвет:clGreen
– зеленый
**procedure** Randomize;
: Инициализирует датчик псевдослучайных чисел.2)**procedure** Randomize(seed: integer);
: Инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности.**procedure** LockDrawing;
: Блокирует рисование на графическом окне. Перерисовка графического окна выполняется с помощьюRedraw
**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 на массив может измениться.**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** SetBrushColor(c: Color);
: Устанавливает цвет текущей кисти Цвет:clGreen
– зеленый**procedure** FillCircle(x,y,r: integer);
: Заполняет внутренность окружности с центром (x,y) и радиусом r**procedure** SetBrushColor(c: Color);
: Устанавливает цвет текущей кисти Цвет:clTransparent
– прозрачный**procedure** TextOut(x,y: integer; s: string);
: Выводит строку s в прямоугольник к координатами левого верхнего угла (x,y)**procedure** DrawClosedCurve(points: **array** **of** Point);
: Рисует замкнутую кривую по точкам, координаты которых заданы в массиве points**procedure** Redraw;
: Перерисовывает содержимое графического окна. Вызывается в паре сLockDrawing
**procedure** Sleep(ms: integer);
: Делает паузу на ms миллисекунд**procedure** ClearWindow;
: Очищает графическое окно белым цветом**const** false = False;
: Представляет логическое значение. Вот примеры кривых на картинках:
В дальнейшем мы не раз ещё встретимся на страницах сайта с примерами использования подпрограммы DrawClosedCurve в PascalABC.Net, а пока всё. Если есть вопросы, то задавайте их в комментариях.