ВВЕРХ
ВНИЗ

Замкнутая незаполненная кривая 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  
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.

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

Идем далее. С помощью процедуры DrawClosedCurve можно создавать самые разные фигуры. Например, создадим рисунок, который мне напоминает зуб. Чтобы поместить его в центре окна, используем процедуру SetCoordinateOrigin(x,y), где x,y – новые координаты начала координат. Напомню, что по умолчанию начало координат, то есть точка (0; 0), находится в левом верхнем углу графического окна, а указанная выше процедура перемещает его в точку (x; y). Дополнительные комментарии в коде.

Код PascalABC.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
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.

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

Нарисуем ещё одну замкнутую кривую, используя процедуру DrawClosedCurve в PascalABC.Net. В этом случае основные вычисления выполним в подпрограмме bone ("кость" по-английски), а потом только вызовем её из тела программы. Название процедуры bone взято потому, что нарисованная линия действительно напоминает кость. К тому же, замкнутую фигуру всегда можно залить некоторым цветом с помощью процедуры FloodFill(...), поэтому в 24-й строке кода нашу кость мы окрашиваем в один из стандартных цветов 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;

{ Процедура рисует фигуру похожую на кость, где
 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.

Кость, нарисованная с помощью DrawClosedCurve в PascalABC.Net

Естественно, чтобы нарисованная кость выглядела более естественно, нужно использовать больше узловых точек, через которые проходит линия, а мы взяли только 8 (для примера).

Наконец, напишем программу-слайд, демонстрирующую появление случайно нарисованных замкнутых линий, подобно тому, как это было сделано на предыдущей странице.

Код 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  
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.

Вот примеры кривых на картинках:



В дальнейшем мы не раз ещё встретимся на страницах сайта с примерами использования подпрограммы DrawClosedCurve в PascalABC.Net, а пока всё. Если есть вопросы, то задавайте их в комментариях.


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