Root /ArchiveAbout
()

Процедуры Arc, DrawPie, FillPie, Pie

Процедуры Arc, DrawPie, FillPie, Pie

Здравствуйте всем, кто интересуется графикой в паскале. Здесь поговорим о том, как с помощью процедур Arc, DrawPie, FillPie и Pie нарисовать дугу и сектор окружности в PascalABC, PascalABC.Net, то есть части окружности и круга. Из этих четырех подпрограм в простом PascalABC присутствуют только Arc и Pie.

Раньше мы изучили процедуры для работы с окружностью и кругом Circle, DrawCircle, FillCircle, поэтому рекомендую познакомится сначала с тем материалом.

Процедура Arc

Эта подпрограмма есть в PascalABC и PascalABC.Net, и предназначена для рисования дуги окружности. Вот определение:

**procedure** Arc(x,y,r,a1,a2: integer);

— Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки).

Как видно из определения, для рисования дуги необходимо задать центр окружности, радиус и два угла. Прорисовка происходит как в обычной системе координат – против часовой стрелки. Но необходимо иметь ввиду, что в PascalABC процедура Arc рисует от угла a1 до угла a2, а в PascalABC.Net – от меньшего угла до большего, не зависимо от величин углов a1 и a2. Это значит, что в PascalABC.Net перемена местами углов a1 и a2 ни к чему не приведет (процедура выбирает меньший угол и рисует к большему), а в простом PascalABC будет нарисована дополнительная дуга.

Ещё одно замечание: величины углов задаются в градусах, а не в радианах. В разделе задачника мы рассматривали, чем отличаются градусы от радианов. А теперь наводим пример, демонстрирующий сказаное выше.

uses
  GraphABC;

var
  x, y, r, a1, a2: integer;

begin
  x := 150; y := 250; //координаты центра окружности
  r := 150; //радиус окружности
  a1 := 10; a2 := 120; //углы, образованные с осью OX
  SetPenColor(clTeal); //Цвет дуги
  SetPenWidth(5); //Толщина дуги
  Arc(x, y, r, a1, a2) { <-- Рисуем дугу окужности с }
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** SetPenColor(c: Color);: Устанавливает цвет текущего пера **procedure** SetPenWidth(Width: integer);: Устанавливает ширину текущего пера **procedure** Arc(x,y,r,a1,a2: integer);: Рисует дугу окружности с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) Дуга окружности в Pascal

Здесь мы нарисовали дугу радиуса 150px, образованную углами 10° и 120°, с центром в точке (150, 250) графического окна.

Процедура DrawPie

Эта подпрограмма присутствует в PascalABC.Net.

**procedure** DrawPie(x,y,r,a1,a2: integer);

— Рисует сектор окружности, ограниченный дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)

Необходимо иметь ввиду, что сектор DrawPie незаполненный, а поэтому использовать в программе процедуры ля работы с кистью Brush (SetBrushColor, например) не имет смысла – они все равно не применятся.

А углы a1 и a2 ведут себя так же как и в процедуре Arc для PascalABC.Net – рисование происходит от меньшего угла к бо́льшему.

uses
  GraphABC;

var
  x, y, r, a1, a2: integer;

begin
  x := 100; y := 280; //координаты центра окружности
  r := 250; //радиус окружности
  a1 := 30; a2 := 70; //углы с осью OX
  SetPenColor(ClBlue); //Цвет дуги
  SetPenWidth(3); //Толщина дуги
  { Рисуем сектор окружности: }
  DrawPie(x, y, r, a1, a2)
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** SetPenColor(c: Color);: Устанавливает цвет текущего пера Цвет: clBlue – синий **procedure** SetPenWidth(Width: integer);: Устанавливает ширину текущего пера **procedure** DrawPie(x,y,r,a1,a2: integer);: Рисует сектор окружности, ограниченный дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) Незаполненный сектор окружности в Pascal

А теперь попробуйте добавить в код программы процедуру для заливки SetBrushColor(clred); – ничего не произойдет.

Чтобы показать, что сектор DrawPie действительно пустой внутри, нарисуем какую-либо фигуру таким образом, чтобы она пересекалась с данным сектором. Следующая программа это прекрасно демонстрирует: сначала создаем круг (FillCircle – без границы), а потом через 2 секунды "появляется" сектор. Комментарии в коде.

uses
  GraphABC;

var
  x, y, r, a1, a2: integer;

begin
  x := 50; y := 270; //координаты центра окружности
  r := 250; //радиус окружности
  a1 := 30; a2 := 70; //углы с осью OX
  SetPenColor(ClBlue); //Цвет дуги
  SetPenWidth(3); //Толщина дуги
  { Заливаем круг цветом: }
  SetBrushColor(clGreenYellow);
  FillCircle(150, 150, 90);
  sleep(2000); { <-- ждем 2 секунды }
  { Рисуем сектор окружности: }
  DrawPie(x, y, r, a1, a2)
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** SetPenColor(c: Color);: Устанавливает цвет текущего пера Цвет: clBlue – синий **procedure** SetPenWidth(Width: integer);: Устанавливает ширину текущего пера **procedure** SetBrushColor(c: Color);: Устанавливает цвет текущей кисти **procedure** FillCircle(x,y,r: integer);: Заполняет внутренность окружности с центром (x,y) и радиусом r **procedure** Sleep(ms: integer);: Делает паузу на ms миллисекунд **procedure** DrawPie(x,y,r,a1,a2: integer);: Рисует сектор окружности, ограниченный дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) Незаполненный сектор окружности в Pascal пустой внутри

Как видим, внутренняя область сектора действительно просматривается насквозь.

Процедура FillPie

Бывает, что необходимо только залить сектор цветом, не рисуя его границы. В таком случае в PascalABC.Net используется процедура FillPie. Наводим определение и сразу приведем пример.

**procedure** FillPie(x,y,r,a1,a2: integer);

— Заполняет внутренность сектора окружности, ограниченного дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)

uses
  GraphABC;

var
  x, y, r, a1, a2: integer;

begin
  x := 100; y := 280; //координаты центра окружности
  r := 280; //радиус окружности
  a1 := 30; a2 := 70;
  SetBrushColor(ClBlue); //Цвет заливки
  FillPie(x, y, r, a1, a2) { <-- Заполняем внутренность
  сектора окружности }
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** SetBrushColor(c: Color);: Устанавливает цвет текущей кисти Цвет: clBlue – синий **procedure** FillPie(x,y,r,a1,a2: integer);: Заполняет внутренность сектора окружности, ограниченного дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) Заполненный сектор окружности без границы в PascalЗаполненный сектор окружности без границы в Pascal

Первый сектор из указанных соответствует коду программы выше. Чтобы нарисовать другой сектор (напоминающий печенье или вафли), необходимо сначала изменить стиль заливки, а потом изменить цвет на оранжевый.

Так, строку 11 предыдущего кода замените на SetBrushStyle(bsHatch); SetBrushColor(clOrange); Первая процедура меняет стиль на штриховой, а вторая задаёт цвет.

Процедура Pie

Процерура Pie присутствует в PascalABC и PascalABC.Net, и предназначена для рисования сектора с возможностью заливки.

**procedure** Pie(x,y,r,a1,a2: integer);

— Рисует заполненный сектор окружности, ограниченный дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)

Нарисуем заплолненный красный сектор с синей границей. Комментарии в коде программы.

uses
  GraphABC;

var
  x, y, r, a1, a2: integer;

begin
  x := 100; y := 280; //координаты центра окружности
  r := 280; //радиус окружности
  a1 := 30; a2 := 70;
  SetPenColor(ClBlue); //Цвет границы
  SetPenWidth(5); //толщина границы сектора
  SetBrushColor(ClRed); //цвет заливки сектора
  { Рисуем заполненный сектор окружности: }
  Pie(x, y, r, a1, a2)
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** SetPenColor(c: Color);: Устанавливает цвет текущего пера Цвет: clBlue – синий **procedure** SetPenWidth(Width: integer);: Устанавливает ширину текущего пера **procedure** SetBrushColor(c: Color);: Устанавливает цвет текущей кисти Цвет: clRed – красный **procedure** Pie(x,y,r,a1,a2: integer);: Рисует заполненный сектор окружности, ограниченный дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) Заполненный сектор окружности с границей в PascalЗаполненный сектор окружности с границей в Pascal

Чтобы получить второй рисунок, нужно изменить стиль заливки из "сплошной" (по умолчанию) на "штриховой". Для этого в PascalABC.Net вместо 11 строки вставьте SetPenColor(clOrange); – цвет границы, а 13 строку кода замените на SetBrushStyle(bsHatch); SetBrushColor(clOrange); – стиль и цвет заливки.

Чтобы картинку-вафельку получить в простом PascalABC, необходимо стиль bsHatch из PascalABC.Net заменить, например, на bsCross из PascalABC. К тому же, цветовой константы clOrange тоже нет в PascalABC, поэтому заменим его на равнозначный RGB(255, 165, 0) – функция, возвращающая 255 красной, 165 зеленой и 0 синей составляющих цвета. Вот, что мы получим:

uses
  GraphABC;

var
  x, y, r, a1, a2: integer;

begin
  x := 20; y := 280; //координаты центра окружности
  r := 280; //радиус окружности
  a1 := 30; a2 := 70;
  SetPenColor(rgb(255, 165, 0)); //Цвет границы
  SetPenWidth(5); //толщина границы сектора
  SetBrushStyle(bsCross); //Стиль заливки
  SetBrushColor(rgb(255, 165, 0));
  { Рисуем заполненный сектор окружности: }
  Pie(x, y, r, a1, a2)
end.

**unit** GraphABC;: Модуль предоставляет константы, типы, процедуры, функции и классы для рисования в графическом окне **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** SetPenColor(c: Color);: Устанавливает цвет текущего пера **function** RGB(r,g,b: byte): Color;: Возвращает цвет, который содержит красную (r), зеленую (g) и синюю (b) составляющие (r,g и b - в диапазоне от 0 до 255) **procedure** SetPenWidth(Width: integer);: Устанавливает ширину текущего пера **procedure** SetBrushStyle(bs: BrushStyleType);: Устанавливает стиль текущей кисти **procedure** SetBrushColor(c: Color);: Устанавливает цвет текущей кисти **function** RGB(r,g,b: byte): Color;: Возвращает цвет, который содержит красную (r), зеленую (g) и синюю (b) составляющие (r,g и b - в диапазоне от 0 до 255) **procedure** Pie(x,y,r,a1,a2: integer);: Рисует заполненный сектор окружности, ограниченный дугой с центром в точке (x,y) и радиусом r, заключенной между двумя лучами, образующими углы a1 и a2 с осью OX (a1 и a2 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) Наверное, на этом всё. Комментируйте и спрашивайте, что можно ещё дописать или переписать.