ВВЕРХ
ВНИЗ

Процедуры 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 будет нарисована дополнительная дуга.

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

Код PascalABC, PascalABC.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
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.

Дуга окружности в 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 – рисование происходит от меньшего угла к бо́льшему.

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

Незаполненный сектор окружности в Pascal

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

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

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

Незаполненный сектор окружности в Pascal пустой внутри

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

Процедура FillPie

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

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

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

Код PascalABC.Net
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
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.

Заполненный сектор окружности без границы в 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 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)

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

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

Заполненный сектор окружности с границей в 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 синей составляющих цвета. Вот, что мы получим:

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

Наверное, на этом всё. Комментируйте и спрашивайте, что можно ещё дописать или переписать.



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