TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

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

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz