Байта орнамента числа числа

       
 
 
   


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", то заполнение "разольется" по экрану.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: