Root /ArchiveAbout
()

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

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

Эта статья является естественным продолжением предыдущей Кривая линия 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 в PascalABC.Net

Идем далее. С помощью процедуры 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

Нарисуем ещё одну замкнутую кривую, используя процедуру 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 - целочисленное деление А на В Кость, нарисованная с помощью DrawClosedCurve в PascalABC.Net

Естественно, чтобы нарисованная кость выглядела более естественно, нужно использовать больше узловых точек, через которые проходит линия, а мы взяли только 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 – зеленый

  1. **procedure** Randomize;: Инициализирует датчик псевдослучайных чисел.2) **procedure** Randomize(seed: integer);: Инициализирует датчик псевдослучайных чисел, используя значение seed. При одном и том же seed генерируются одинаковые псевдослучайные последовательности. **procedure** LockDrawing;: Блокирует рисование на графическом окне. Перерисовка графического окна выполняется с помощью Redraw
  2. **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 на массив может измениться.
  3. **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;: Возвращает ширину клиентской части графического окна в пикселах
  4. **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, а пока всё. Если есть вопросы, то задавайте их в комментариях.