Здравствуйте всем, кто интересуется графикой в паскале. Здесь поговорим о том, как с помощью процедур Arc, DrawPie, FillPie и Pie нарисовать дугу и сектор окружности в PascalABC, PascalABC.Net, то есть части окружности и круга. Из этих четырех подпрограм в простом PascalABC присутствуют только Arc и Pie.
Раньше мы изучили процедуры для работы с окружностью и кругом Circle, DrawCircle, FillCircle, поэтому рекомендую познакомится сначала с тем материалом.
Эта подпрограмма есть в 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 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)
Здесь мы нарисовали дугу радиуса 150px, образованную углами 10° и 120°, с центром в точке (150, 250) графического окна.
Эта подпрограмма присутствует в 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 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)
А теперь попробуйте добавить в код программы процедуру для заливки 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 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)
Как видим, внутренняя область сектора действительно просматривается насквозь.
Бывает, что необходимо только залить сектор цветом, не рисуя его границы. В таком случае в 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 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)
Первый сектор из указанных соответствует коду программы выше. Чтобы нарисовать другой сектор (напоминающий печенье или вафли), необходимо сначала изменить стиль заливки, а потом изменить цвет на оранжевый.
Так, строку 11 предыдущего кода замените на SetBrushStyle(bsHatch); SetBrushColor(clOrange);
Первая процедура меняет стиль на штриховой, а вторая задаёт цвет.
Процерура 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 – вещественные, задаются в градусах и отсчитываются против часовой стрелки)
Чтобы получить второй рисунок, нужно изменить стиль заливки из "сплошной" (по умолчанию) на "штриховой". Для этого в 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 – вещественные, задаются в градусах и отсчитываются против часовой стрелки) Наверное, на этом всё. Комментируйте и спрашивайте, что можно ещё дописать или переписать.