Замкнутая незаполненная кривая DrawClosedCurve в PascalABC.Net
Эта статья является естественным продолжением предыдущей Кривая линия Curve, и здесь рассмотрим построение замкнутой кривой линиии в PascalABC.Net, отличающееся от построения линиии Curve только тем, что первая и последняя точка соединяются вместе.
✎procedure DrawClosedCurve(points: array of Point);
— Рисует замкнутую кривую по точкам, координаты которых заданы в массиве points
Перейдем сразу к делу – нарисуем простейшую замкнутую линию, проходящую через три точки. В этом случае длина массива будет равна 3, индексы массива меняются от 0 до 2 (массив динамический), длина задается с помощью процедуры SetLength(...). Вот, что получилось:
Код PascalABC.Net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
usesGraphABC;
var
P:arrayofPoint;
beginSetLength(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.
Идем далее. С помощью процедуры DrawClosedCurve можно создавать самые разные фигуры. Например, создадим рисунок, который мне напоминает зуб. Чтобы поместить его в центре окна, используем процедуру SetCoordinateOrigin(x,y), где x,y – новые координаты начала координат. Напомню, что по умолчанию начало координат, то есть точка (0; 0), находится в левом верхнем углу графического окна, а указанная выше процедура перемещает его в точку (x; y). Дополнительные комментарии в коде.
usesGraphABC;
var
P:arrayofPoint;
begin{ Координаты центра окна: }var x0 :=WindowWidthdiv2;
var y0 :=WindowHeightdiv2;
{ Устанавливаем начало координат в точку (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.
Нарисуем ещё одну замкнутую кривую, используя процедуру DrawClosedCurve в PascalABC.Net. В этом случае основные вычисления выполним в подпрограмме bone ("кость" по-английски), а потом только вызовем её из тела программы. Название процедуры bone взято потому, что нарисованная линия действительно напоминает кость. К тому же, замкнутую фигуру всегда можно залить некоторым цветом с помощью процедуры FloodFill(...), поэтому в 24-й строке кода нашу кость мы окрашиваем в один из стандартных цветов PascalABC.Net. Все комментарии в коде:
usesGraphABC;
{ Процедура рисует фигуру похожую на кость, где
x, y - координаты левого верхнего угла фигуры: }procedure bone(x, y:integer);
var
P:arrayofPoint; //Массив точекbeginSetCoordinateOrigin(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(WindowWidthdiv2,WindowHeightdiv2)end.
Естественно, чтобы нарисованная кость выглядела более естественно, нужно использовать больше узловых точек, через которые проходит линия, а мы взяли только 8 (для примера).
Наконец, напишем программу-слайд, демонстрирующую появление случайно нарисованных замкнутых линий, подобно тому, как это было сделано на предыдущей странице.
usesGraphABC;
var
points:arrayofpoint; //массив точекbeginSetFontColor(ClRed); //цвет шрифта подписи точек номерамиSetFontSize(12); //размер шрифта в пунктахSetPenColor(ClGreen); //цвет линии (по умолчанию черный)randomize; //количество точек и координаты будут случайнымиLockDrawing;
repeatvar n :=random(5,20); { <== количество точек случайно от 5 до 20 }SetLength(points, n); //размер массива точек равен nforvar i :=0to n -1dobegin{ Координаты точек: }
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//очищаем графическое окно белым цветомuntilfalse{ <-- Бесконечный цикл }end.
Вот примеры кривых на картинках:
В дальнейшем мы не раз ещё встретимся на страницах сайта с примерами использования подпрограммы DrawClosedCurve в PascalABC.Net, а пока всё. Если есть вопросы, то задавайте их в комментариях.