TURBO PASCAL |
Новости |
1. 15. 3. 1. Построение заполненных фигурРяд графических процедур выполняет построение заполненных фигур - фигур с замкнутым контуром, автоматически заполняемых сразу после построения. По умолчанию заполнение производится сплошным белым цветом. Цвет и стиль (орнамент) заполнения можно устанавливать из стандартного набора BGI или определять самим. SetFillStyle(P,
N);
-
процедура установки орнамента
P=0, 1, . . . , 12 и
цвета с номером "N" для заполняемых фигур.
P = 0 - сплошное заполнение цветом фона, при
этом значение "N" игнорируется,
P = 1 - сплошное заполнение цветом с номером
"N",
P = 2. . . 11 - стандартный набор орнаментов BGI,
P = 12 - орнамент и цвет определяет
пользователь.
SetFillPattern(PP,
N); - процедура установки орнамента
пользователя PP
и цвета
с номером "N" для заполняемых фигур.
Параметр PP имеет тип FillPatternType
или array [1. . 8] of byte. Байт
состоит из восьми битов и соответствует
ряду из 8 пикселов, т. е. параметр
РР определяет элемент орнамента размером 8*8 пикселов (восемь рядов по
восемь пикселов). Если бит равен 1,
то пиксел высвечивается заданным
цветом, если бит
равен 0 - текущим цветом фона. Пример орнамента в виде буквы Y:
№
элемент
двоичные шестнадцатеричные байта
орнамента
числа
числа
1
1 0 0
0 0
0 0 1
$81
2
1
1 0
0 0 0
1 1
$C3
3
0
1 1 0 0
1 1
0 $66
4
0
0 1
1 1 1
0 0
$3C
5
0
0 0
1 1 0
0 0
$18
6
0
0 0 1 1
0 0
0
$18
7
0
0 0
1 1 0
0 0
$18
8
0
0 0
1 1 0
0 0
$18
Шестнадцатеричные цифры соответствуют
двоичным тетрадам цифр:
0000
- 0 0100 -
4 1000
- 8 1100
- С
0001 - 1 0101
- 5 1001 -
9 1101 - D
0010 - 2 0110
- 6 1010 -
A 1110
- E
0011 - 3 0111
- 7 1011
- B 1111 -
F
Причем, двоичное
число разбивается на тетрады цифр с конца
числа, а
шестнадцатеричное число получается
заменой каждой тетрады соответствующей
цифрой с добавлением в начале числа символа
"$".
Орнамент удобно задавать,
используя переменные с начальным
значением (типизированные константы), например: {оператор описания:} Const
Bukva_Y: FillPatternType=($81,$C3,$66,$3C,$18,$18,$18,$18 ); {оператор выполнения:} SetFillPattern(Bukva_Y, 4);
Можно добавлять один орнамент к другому
используя логические операции,
например, A и B -
исходные орнаменты, Z
-
результирующий орнамент.
Тогда:
Z:= A and B; -
орнамент из совпадающих единичных частей
исходных орнаментов,
Z:= A or B;
-
орнамент с добавлением единичных частей
исходных орнаментов,
Z:= A xor B; -
орнамент из несовпадающих единичных частей
исходных орнаментов,
Z:= not A; - орнамент инверсный (обратный) к
исходному орнаменту.
Z:= A xor A; -
обнуление, Z:=
A xor (not A); -
сплошное заполнение орнамента.
Приведем процедуры
построения заполненных установленным
орнаментом фигур. Граница
заполняемых фигур рисуется текущим цветом
для линий.
Bar(X1,
Y1, X2, Y2);
-
построить заполненный
прямоугольник с заданными
координатами левого верхнего (X1, Y1) и
правого
нижнего (X2, Y2) углов.
Аналог процедуры: Rectangle(X1,
Y1, X2, Y2);.
Bar3d(X1, Y1, X2, Y2, d, t); -построить
параллелепипед с
заполненной
передней гранью.
Координаты углов: (X1, Y1),
(X2, Y2), глубина
"d". Переменная
"t" типа boolean задает вывод верхней грани.
При t=TopOn (true)
верхняя грань показывается,
при t=TopOff (false) - нет.
FillEllipse(X, Y, RX, RY); -
построить заполненный
эллипс с центром в
точке
(X, Y) и радиусами (
полуосями ) :
RX -
по горизонтали, RY -
по вертикали.
Sector(X, Y, A1, A2, RX, RY); -
построить заполненный
сектор эллипса.
A1 и A2 -
начальный и конечный углы (в градусах),
отсчитываемые против часовой стрелки
относительно направления оси Х. Аналог процедуры:
Ellipse(X,
Y, A1, A2, RX, RY); строит сектор
эллипса без автоматического заполнения.
PieSlice(X, Y, A1, A2, R);
- построить заполненный
сектор круга с
центром в точке
(X, Y) и радиусом R. Аналог
процедуры:
Arc(X, Y, A1, A2, R); строит дугу
окружности.
FillPoly(N, M); -
заполнить
произвольную плоскую фигуру с границей,
описанной массивом точек.
N - число точек
границы, М - параметр
- переменная типа PointType, определяемая в
модуле Graph в виде: TYPE PointType = Record
x, y: Integer End; В программе массив можно описать операторами: Const N=100; Var
M: array[1..N] of PointType; Присвоение значений можно
провести в цикле: For i:=1 to 3 do
begin M[i].x:=random(95); M[i].y:=random(95) end;
Приведем пример программы, выводящей два прямоугольника с
орнаментами пользователя (bukva_Y и Red_50),
а затем демонстрирующей набор
стандартных орнаментов на передней грани
параллелепипедов: uses Graph;
Сonst bukva_Y: FillPatternType=($81, $C3, $66, $3C, $18, $18, $18, $18); Red_50: FillPatternType=($AA,
$55, $AA, $55, $AA, $55, $AA, $55); var i, x1, y1, x2, y2, Gd,
Gm : integer; Begin Gd:= Detect;
InitGraph(Gd, Gm, '_'); SetFillPattern(Red_50,
Red); {
орнамент - 50% красных
пикселов }
Bar(250, 10, 350, 110); SetFillPattern(bukva_Y,
Blue); {
орнамент - синяя
буква "Y" }
Bar(340,
30, 440,
130);
{ стандартный набор из 12 орнаментов BGI
выводим цветом с номером "11" }
for i:=0 to 11 do begin SetFillStyle(i, 11);
if i<6 then begin x1:=90*i;
y1:=150 end
else begin x1:=90*(i-6);
y1:=270 end;
x2:=x1+70; y2:=y1+80; Bar3d(x1, y1,
x2, y2, 10, TopOn) end;
ReadLn; CloseGraph End. Заполняя не черный экран
орнаментом Red_50, можно
получить новые цвета фона.
Выбранным из стандартных или
определенным орнаментом можно заполнить
любую замкнутую область с границей цвета
"N" оператором
FloodFill(X, Y, N);
Заполнение начинает
производится из точки X, Y и ограничивается
при достижении границы цвета с номером "N".
Например: Rectangle(x1,
y1, x2, y2);
FloodFill((x1+x2)
div 2, (y1+y2) div 2, Red); Если область не замкнута или цвет
границы не равен "N",
то заполнение "разольется" по
экрану. |
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |