Байта орнамента числа числа
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 -00100 -41000 -81100 - С
0001 -10101 -51001 -91101 - D
0010 -20110 -61010 -A1110 -E
0011 -30111 -71011 -B1111 -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", то заполнение "разольется" по экрану.
Дата добавления: 2016-06-29; просмотров: 1431;