Главная » Free Pascal » Закраска и заполнение замкнутых областей Free Pascal

0

В этом разделе речь пойдет о закрашивании замкнутых областей любым цветом или их заполнение фиксированным цветным узором — шаблоном заливки. Шаблон заливки задается массивом 8 8 бит, где каждый единичный разряд окрашивается указанным цветом, а каждый нулевой разряд — цветом фона. Представьте себе, что весь графический экран покрыт такими узорными квадратиками, примыкающими друг к другу по горизонтали и вертикали. Наложим на этот узор контур замкнутой области, и та часть узора, которая ограничена контуром, используется для окраски внутренней или внешней части нашей фигуры. Если шаблон заполнен только еди- ничными разрядами, то закраска ведется сплошным цветом. Наличие единичных разрядов только в отдельных строках шаблона (например, хотя бы в одной) приво- дит к горизонтальной штриховке области. Варьирование комбинаций нулей и еди- ниц в шаблоне позволяет создавать довольно много различных узоров — до 32  63.

В графической библиотеке BGI предусмотрено 13 стандартных шаблонов за-

ливки, приведенных в табл. 15.7. Для использования любого из них достаточно указать нужный номер или соответствующую мнемоническую константу. Установ- ка того или иного стиля заливки выполняется с помощью процедуры SetFillStyle:

SetFillStyle(v_FST);

Аргументом этой процедуры является запись типа FillSettingsType, содер- жащая всего два поля:

type FillSettingsType = record pattern: Word;   // номер шаблона color: Word;     // код цветности

end;

Таблица 15.7

Номер шаблона

Константа

Способ заполнения

0

EmptyFill

Заливается цветом фона (все биты шаблона нулевые)

1

SolidFill

Заливается цветом color

2

LineFill

Штриховка горизонтальными линиями

3

LtSlashFill

Тонкая штриховка под   45

4

SlashFill

Толстая штриховка под   45

5

BkSlashFill

Толстая штриховка под   135

6

LtBkSlashFill

Тонкая штриховка под   135

7

HatchFill

Двойная штриховка   (0и 90 )

8

XHatchFill

Двойная штриховка   (45и 135 )

9

InterleaveFill

Короткие чередующиеся штрихи

10

WideDotFill

Редкий точечный растр

11

CloseDotFill

Густой точечный растр

12

UserFill

Заполнение шаблоном пользователя

Шаблон пользователя устанавливается с помощью процедуры SetFillPattern: SetFillPattern(fill_pat,color);

Первый параметр представляет собой 8-байтовый массив, биты которого сфор- мированы по желанию пользователя. Например, шаблон, напоминающий кирпич- ную стену, образованную окрашенными кирпичиками, может быть задан следую- щим образом:

var

pat94:FillPatternType=(

В этом разделе речь пойдет о закрашивании замкнутых областей любым цветом или их заполнение фиксированным цветным узором — шаблоном заливки. Шаблон заливки задается массивом 8 8 бит, где каждый единичный разряд окрашивается указанным цветом, а каждый нулевой разряд — цветом фона. Представьте себе, что весь графический экран покрыт такими узорными квадратиками, примыкающими друг к другу по горизонтали и вертикали. Наложим на этот узор контур замкнутой области, и та часть узора, которая ограничена контуром, используется для окраски внутренней или внешней части нашей фигуры. Если шаблон заполнен только еди- ничными разрядами, то закраска ведется сплошным цветом. Наличие единичных разрядов только в отдельных строках шаблона (например, хотя бы в одной) приво- дит к горизонтальной штриховке области. Варьирование комбинаций нулей и еди- ниц в шаблоне позволяет создавать довольно много различных узоров — до 32  63.

В графической библиотеке BGI предусмотрено 13 стандартных шаблонов за-

ливки, приведенных в табл. 15.7. Для использования любого из них достаточно указать нужный номер или соответствующую мнемоническую константу. Установ- ка того или иного стиля заливки выполняется с помощью процедуры SetFillStyle:

SetFillStyle(v_FST);

Аргументом этой процедуры является запись типа FillSettingsType, содер- жащая всего два поля:

type FillSettingsType = record pattern: Word;   // номер шаблона color: Word;     // код цветности

end;

Таблица 15.7

Номер шаблона

Константа

Способ заполнения

0

EmptyFill

Заливается цветом фона (все биты шаблона нулевые)

1

SolidFill

Заливается цветом color

2

LineFill

Штриховка горизонтальными линиями

3

LtSlashFill

Тонкая штриховка под   45

4

SlashFill

Толстая штриховка под   45

5

BkSlashFill

Толстая штриховка под   135

6

LtBkSlashFill

Тонкая штриховка под   135

7

HatchFill

Двойная штриховка   (0и 90 )

8

XHatchFill

Двойная штриховка   (45и 135 )

9

InterleaveFill

Короткие чередующиеся штрихи

10

WideDotFill

Редкий точечный растр

11

CloseDotFill

Густой точечный растр

12

UserFill

Заполнение шаблоном пользователя

Шаблон пользователя устанавливается с помощью процедуры SetFillPattern: SetFillPattern(fill_pat,color);

Первый параметр представляет собой 8-байтовый массив, биты которого сфор- мированы по желанию пользователя. Например, шаблон, напоминающий кирпич- ную стену, образованную окрашенными кирпичиками, может быть задан следую- щим образом:

var

pat94:FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

Около сотни нестандартных узоров вы можете найти в книге [20].

Процедуры и функции, используемые для работы с залитыми областями, при- ведены в табл. 15.8.

Таблица 15.8

Формат обращения к процедуре

Выполняемое действие

Bar(x1,y1,x2,y2);

Построение залитого прямоугольника

Bar3D(x1,y1,x2,y2,depth,top);

Построение параллелепипеда

FloodFill(x,y,bord_col);

Заливка внутренней или внешней части замкнутой области

Таблица 15.8 (окончание)

Формат обращения к процедуре

Выполняемое действие

FillEllipse(x,y,Rx,Ry);

Построение залитого эллипса

FillPoly(n,xy);

Построение залитого многоугольника

GetFillPattern(fill_pat);

Опрос текущего шаблона заливки

GetFillSettings(v_FST);

Опрос параметров заливки

PieSlice(x,y,a1,a2,R);

Построение залитого сектора окружности

Sector(x,y,a1,a2,Rx,Ry);

Построение залитого сектора эллипса

SetFillPattern(fill_pat,color);

Задание пользовательского шаблона

SetFillStyle(v_FST);

Установка режима заливки

Пример использования процедуры Bar в режиме заливки сплошным цветом приводился в разд. 15.3. Результат работы соответствующей программы показыва- ет, что цветной прямоугольник строится без обводки границ. Чтобы построить цветной прямоугольник с четко очерченной границей другого цвета, надо обра- титься к двум последовательным процедурам (листинг 15.7).

   Листинг 15.7. Программа  fill1                                               

program fill1; uses graph; var

gd,gm: SmallInt;

pat94: FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”);

SetFillPattern(pat94,4);  // назначение шаблона пользователя SetFillStyle(UserFill,4); // установка режима заливки Bar(10,10,100,100);       // отображение прямоугольника без границы Rectangle(9,9,101,101);   // обводка границы

readln;

CloseGraph; end.

Результат ее работы в истинных цветах представлен на рис. 15.8.

Рис. 15.8. Обводка границ прямоугольника

Процедура Bar3D ориентирована, главным образом, на построение трехмерных столбчатых диаграмм. В графиках такого рода основным элементом является либо однородный цветной столбик с "крышей", либо столбик без "крыши", над которым можно надстроить еще один или несколько столбиков с другой раскраской. Обра- щение к процедуре Bar3D требует задания следующих параметров:

Bar3D(x1, y1, x2, y2, depth, top);

Первые четыре аргумента задают угловые точки передней панели столбика. Параметр depth определяет глубину столбика и иногда его рекомендуют выбирать равным четверти ширины (deph=0.25*(x2-x1)). Естественно, что все эти парамет- ры целочисленные и неотрицательные, задаются они в пикселах. Последний аргу- мент top — логического типа. Если он равен True, то крыша столбика рисуется, в противном случае столбик воспроизводится без крыши, и это дает возможность надстроить над ним следующий столбик и не заботиться об удалении невидимых линий. Приведенный в листинге 15.8 пример демонстрирует возможность воспро- изведения одиночного (с крышей) и составного столбика (нижний — без крыши, верхний — с крышей).

   Листинг 15.8. Программа  bar3d_1                                             

program bar3d_1; uses graph;

var

gd,gm: SmallInt; begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(HatchFill,Blue);

Bar3d(20,20,40,100,10,true);

SetFillStyle(SolidFill,Yellow);

Bar3d(80,60,120,100,15,false);

SetFillStyle(CloseDotFill,Red);

Bar3d(80,20,120,60,15,true);

readln; CloseGraph;

end.

Результат работы этой программы приведен на рис. 15.9.

Рис. 15.9. Элементы столбчатых диаграмм

Иногда к процедуре Bar3D обращаются с нулевым значением параметра depth. В этом случае можно построить залитый прямоугольник с четко выделенной гра- ницей.

Процедура FloodFill предназначена для заливки или штриховки внутренней или внешней части замкнутого контура:

FloodFill(x, y, bord_col);

Параметр bord_col задает цвет пикселов, составляющих непрерывную границу области. Если точка с координатами (x, y) находится внутри области, то обработке подвергается внутренняя часть замкнутого контура. В противном случае окраска (штриховка) выполняется для внешней части контура. Разрыв границы контура да- же на один пиксел приведет к тому, что краска (штриховка) "просочится" на про- тивоположную часть контура и залитым окажется весь экран или большая его часть. Последнее может произойти, если на пути краски встретится еще один замк- нутый контур с таким же цветом границы. Если цвет заливки, установленный в од- ной из процедур SetFillPattern или SetFillStyle, не совпадает с цветом грани- цы, то цвет контура после работы процедуры FloodFill остается прежним. Однако оба указанных цвета могут совпасть, и тогда залитая область лишится ярко выра- женного цвета границы. Повторная перекраска такой области с помощью процеду- ры FloodFill уже невозможна.

Процедура FillEllipse предназначена для построения залитого эллипса. При

необходимости его граница может быть очерчена с помощью процедуры Ellipse.

Параметры процедуры FillPoly совпадают с аргументами процедуры DrawPoly

(листинг 15.9).

   Листинг 1 5 .9 .  Программа  f_polygon                                           

program f_polygon; uses graph;

var

gd,gm: SmallInt;

xy:   array [1..4] of PointType; begin

xy[1].x:=10;  xy[1].y:=10;

xy[2].x:=100; xy[2].y:=10;

xy[3].x:=80;  xy[3].y:=60;

xy[4].x:=10;  xy[4].y:=10;

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(SolidFill,Green);

FillPoly(4,xy); readln; CloseGraph;

end.

Залитый по этой программе треугольник представлен на рис. 15.10.

Рис. 15.10. Заливка многоугольника

Секторы окружностей или эллипсов, окрашиваемые с помощью процедур PieSlice и Sector, часто используются для построения круговых диаграмм (рис. 15.11).

Рис. 15.11. Круговая диаграмма

Опрос текущих параметров заливки осуществляется с помощью процедур Get- FillSettings и GetFillPattern.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

,$FB,$FB,$FB,

В этом разделе речь пойдет о закрашивании замкнутых областей любым цветом или их заполнение фиксированным цветным узором — шаблоном заливки. Шаблон заливки задается массивом 8 8 бит, где каждый единичный разряд окрашивается указанным цветом, а каждый нулевой разряд — цветом фона. Представьте себе, что весь графический экран покрыт такими узорными квадратиками, примыкающими друг к другу по горизонтали и вертикали. Наложим на этот узор контур замкнутой области, и та часть узора, которая ограничена контуром, используется для окраски внутренней или внешней части нашей фигуры. Если шаблон заполнен только еди- ничными разрядами, то закраска ведется сплошным цветом. Наличие единичных разрядов только в отдельных строках шаблона (например, хотя бы в одной) приво- дит к горизонтальной штриховке области. Варьирование комбинаций нулей и еди- ниц в шаблоне позволяет создавать довольно много различных узоров — до 32  63.

В графической библиотеке BGI предусмотрено 13 стандартных шаблонов за-

ливки, приведенных в табл. 15.7. Для использования любого из них достаточно указать нужный номер или соответствующую мнемоническую константу. Установ- ка того или иного стиля заливки выполняется с помощью процедуры SetFillStyle:

SetFillStyle(v_FST);

Аргументом этой процедуры является запись типа FillSettingsType, содер- жащая всего два поля:

type FillSettingsType = record pattern: Word;   // номер шаблона color: Word;     // код цветности

end;

Таблица 15.7

Номер шаблона

Константа

Способ заполнения

0

EmptyFill

Заливается цветом фона (все биты шаблона нулевые)

1

SolidFill

Заливается цветом color

2

LineFill

Штриховка горизонтальными линиями

3

LtSlashFill

Тонкая штриховка под   45

4

SlashFill

Толстая штриховка под   45

5

BkSlashFill

Толстая штриховка под   135

6

LtBkSlashFill

Тонкая штриховка под   135

7

HatchFill

Двойная штриховка   (0и 90 )

8

XHatchFill

Двойная штриховка   (45и 135 )

9

InterleaveFill

Короткие чередующиеся штрихи

10

WideDotFill

Редкий точечный растр

11

CloseDotFill

Густой точечный растр

12

UserFill

Заполнение шаблоном пользователя

Шаблон пользователя устанавливается с помощью процедуры SetFillPattern: SetFillPattern(fill_pat,color);

Первый параметр представляет собой 8-байтовый массив, биты которого сфор- мированы по желанию пользователя. Например, шаблон, напоминающий кирпич- ную стену, образованную окрашенными кирпичиками, может быть задан следую- щим образом:

var

pat94:FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

Около сотни нестандартных узоров вы можете найти в книге [20].

Процедуры и функции, используемые для работы с залитыми областями, при- ведены в табл. 15.8.

Таблица 15.8

Формат обращения к процедуре

Выполняемое действие

Bar(x1,y1,x2,y2);

Построение залитого прямоугольника

Bar3D(x1,y1,x2,y2,depth,top);

Построение параллелепипеда

FloodFill(x,y,bord_col);

Заливка внутренней или внешней части замкнутой области

Таблица 15.8 (окончание)

Формат обращения к процедуре

Выполняемое действие

FillEllipse(x,y,Rx,Ry);

Построение залитого эллипса

FillPoly(n,xy);

Построение залитого многоугольника

GetFillPattern(fill_pat);

Опрос текущего шаблона заливки

GetFillSettings(v_FST);

Опрос параметров заливки

PieSlice(x,y,a1,a2,R);

Построение залитого сектора окружности

Sector(x,y,a1,a2,Rx,Ry);

Построение залитого сектора эллипса

SetFillPattern(fill_pat,color);

Задание пользовательского шаблона

SetFillStyle(v_FST);

Установка режима заливки

Пример использования процедуры Bar в режиме заливки сплошным цветом приводился в разд. 15.3. Результат работы соответствующей программы показыва- ет, что цветной прямоугольник строится без обводки границ. Чтобы построить цветной прямоугольник с четко очерченной границей другого цвета, надо обра- титься к двум последовательным процедурам (листинг 15.7).

   Листинг 15.7. Программа  fill1                                               

program fill1; uses graph; var

gd,gm: SmallInt;

pat94: FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”);

SetFillPattern(pat94,4);  // назначение шаблона пользователя SetFillStyle(UserFill,4); // установка режима заливки Bar(10,10,100,100);       // отображение прямоугольника без границы Rectangle(9,9,101,101);   // обводка границы

readln;

CloseGraph; end.

Результат ее работы в истинных цветах представлен на рис. 15.8.

Рис. 15.8. Обводка границ прямоугольника

Процедура Bar3D ориентирована, главным образом, на построение трехмерных столбчатых диаграмм. В графиках такого рода основным элементом является либо однородный цветной столбик с "крышей", либо столбик без "крыши", над которым можно надстроить еще один или несколько столбиков с другой раскраской. Обра- щение к процедуре Bar3D требует задания следующих параметров:

Bar3D(x1, y1, x2, y2, depth, top);

Первые четыре аргумента задают угловые точки передней панели столбика. Параметр depth определяет глубину столбика и иногда его рекомендуют выбирать равным четверти ширины (deph=0.25*(x2-x1)). Естественно, что все эти парамет- ры целочисленные и неотрицательные, задаются они в пикселах. Последний аргу- мент top — логического типа. Если он равен True, то крыша столбика рисуется, в противном случае столбик воспроизводится без крыши, и это дает возможность надстроить над ним следующий столбик и не заботиться об удалении невидимых линий. Приведенный в листинге 15.8 пример демонстрирует возможность воспро- изведения одиночного (с крышей) и составного столбика (нижний — без крыши, верхний — с крышей).

   Листинг 15.8. Программа  bar3d_1                                             

program bar3d_1; uses graph;

var

gd,gm: SmallInt; begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(HatchFill,Blue);

Bar3d(20,20,40,100,10,true);

SetFillStyle(SolidFill,Yellow);

Bar3d(80,60,120,100,15,false);

SetFillStyle(CloseDotFill,Red);

Bar3d(80,20,120,60,15,true);

readln; CloseGraph;

end.

Результат работы этой программы приведен на рис. 15.9.

Рис. 15.9. Элементы столбчатых диаграмм

Иногда к процедуре Bar3D обращаются с нулевым значением параметра depth. В этом случае можно построить залитый прямоугольник с четко выделенной гра- ницей.

Процедура FloodFill предназначена для заливки или штриховки внутренней или внешней части замкнутого контура:

FloodFill(x, y, bord_col);

Параметр bord_col задает цвет пикселов, составляющих непрерывную границу области. Если точка с координатами (x, y) находится внутри области, то обработке подвергается внутренняя часть замкнутого контура. В противном случае окраска (штриховка) выполняется для внешней части контура. Разрыв границы контура да- же на один пиксел приведет к тому, что краска (штриховка) "просочится" на про- тивоположную часть контура и залитым окажется весь экран или большая его часть. Последнее может произойти, если на пути краски встретится еще один замк- нутый контур с таким же цветом границы. Если цвет заливки, установленный в од- ной из процедур SetFillPattern или SetFillStyle, не совпадает с цветом грани- цы, то цвет контура после работы процедуры FloodFill остается прежним. Однако оба указанных цвета могут совпасть, и тогда залитая область лишится ярко выра- женного цвета границы. Повторная перекраска такой области с помощью процеду- ры FloodFill уже невозможна.

Процедура FillEllipse предназначена для построения залитого эллипса. При

необходимости его граница может быть очерчена с помощью процедуры Ellipse.

Параметры процедуры FillPoly совпадают с аргументами процедуры DrawPoly

(листинг 15.9).

   Листинг 1 5 .9 .  Программа  f_polygon                                           

program f_polygon; uses graph;

var

gd,gm: SmallInt;

xy:   array [1..4] of PointType; begin

xy[1].x:=10;  xy[1].y:=10;

xy[2].x:=100; xy[2].y:=10;

xy[3].x:=80;  xy[3].y:=60;

xy[4].x:=10;  xy[4].y:=10;

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(SolidFill,Green);

FillPoly(4,xy); readln; CloseGraph;

end.

Залитый по этой программе треугольник представлен на рис. 15.10.

Рис. 15.10. Заливка многоугольника

Секторы окружностей или эллипсов, окрашиваемые с помощью процедур PieSlice и Sector, часто используются для построения круговых диаграмм (рис. 15.11).

Рис. 15.11. Круговая диаграмма

Опрос текущих параметров заливки осуществляется с помощью процедур Get- FillSettings и GetFillPattern.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

,$DF,$DF,$DF);

Около сотни нестандартных узоров вы можете найти в книге [20].

Процедуры и функции, используемые для работы с залитыми областями, при- ведены в табл. 15.8.

Таблица 15.8

Формат обращения к процедуре

Выполняемое действие

Bar(x1,y1,x2,y2);

Построение залитого прямоугольника

Bar3D(x1,y1,x2,y2,depth,top);

Построение параллелепипеда

FloodFill(x,y,bord_col);

Заливка внутренней или внешней части замкнутой области

Таблица 15.8 (окончание)

Формат обращения к процедуре

Выполняемое действие

FillEllipse(x,y,Rx,Ry);

Построение залитого эллипса

FillPoly(n,xy);

Построение залитого многоугольника

GetFillPattern(fill_pat);

Опрос текущего шаблона заливки

GetFillSettings(v_FST);

Опрос параметров заливки

PieSlice(x,y,a1,a2,R);

Построение залитого сектора окружности

Sector(x,y,a1,a2,Rx,Ry);

Построение залитого сектора эллипса

SetFillPattern(fill_pat,color);

Задание пользовательского шаблона

SetFillStyle(v_FST);

Установка режима заливки

Пример использования процедуры Bar в режиме заливки сплошным цветом приводился в разд. 15.3. Результат работы соответствующей программы показыва- ет, что цветной прямоугольник строится без обводки границ. Чтобы построить цветной прямоугольник с четко очерченной границей другого цвета, надо обра- титься к двум последовательным процедурам (листинг 15.7).

   Листинг 15.7. Программа  fill1                                               

program fill1; uses graph; var

gd,gm: SmallInt;

pat94: FillPatternType=(

В этом разделе речь пойдет о закрашивании замкнутых областей любым цветом или их заполнение фиксированным цветным узором — шаблоном заливки. Шаблон заливки задается массивом 8 8 бит, где каждый единичный разряд окрашивается указанным цветом, а каждый нулевой разряд — цветом фона. Представьте себе, что весь графический экран покрыт такими узорными квадратиками, примыкающими друг к другу по горизонтали и вертикали. Наложим на этот узор контур замкнутой области, и та часть узора, которая ограничена контуром, используется для окраски внутренней или внешней части нашей фигуры. Если шаблон заполнен только еди- ничными разрядами, то закраска ведется сплошным цветом. Наличие единичных разрядов только в отдельных строках шаблона (например, хотя бы в одной) приво- дит к горизонтальной штриховке области. Варьирование комбинаций нулей и еди- ниц в шаблоне позволяет создавать довольно много различных узоров — до 32  63.

В графической библиотеке BGI предусмотрено 13 стандартных шаблонов за-

ливки, приведенных в табл. 15.7. Для использования любого из них достаточно указать нужный номер или соответствующую мнемоническую константу. Установ- ка того или иного стиля заливки выполняется с помощью процедуры SetFillStyle:

SetFillStyle(v_FST);

Аргументом этой процедуры является запись типа FillSettingsType, содер- жащая всего два поля:

type FillSettingsType = record pattern: Word;   // номер шаблона color: Word;     // код цветности

end;

Таблица 15.7

Номер шаблона

Константа

Способ заполнения

0

EmptyFill

Заливается цветом фона (все биты шаблона нулевые)

1

SolidFill

Заливается цветом color

2

LineFill

Штриховка горизонтальными линиями

3

LtSlashFill

Тонкая штриховка под   45

4

SlashFill

Толстая штриховка под   45

5

BkSlashFill

Толстая штриховка под   135

6

LtBkSlashFill

Тонкая штриховка под   135

7

HatchFill

Двойная штриховка   (0и 90 )

8

XHatchFill

Двойная штриховка   (45и 135 )

9

InterleaveFill

Короткие чередующиеся штрихи

10

WideDotFill

Редкий точечный растр

11

CloseDotFill

Густой точечный растр

12

UserFill

Заполнение шаблоном пользователя

Шаблон пользователя устанавливается с помощью процедуры SetFillPattern: SetFillPattern(fill_pat,color);

Первый параметр представляет собой 8-байтовый массив, биты которого сфор- мированы по желанию пользователя. Например, шаблон, напоминающий кирпич- ную стену, образованную окрашенными кирпичиками, может быть задан следую- щим образом:

var

pat94:FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

Около сотни нестандартных узоров вы можете найти в книге [20].

Процедуры и функции, используемые для работы с залитыми областями, при- ведены в табл. 15.8.

Таблица 15.8

Формат обращения к процедуре

Выполняемое действие

Bar(x1,y1,x2,y2);

Построение залитого прямоугольника

Bar3D(x1,y1,x2,y2,depth,top);

Построение параллелепипеда

FloodFill(x,y,bord_col);

Заливка внутренней или внешней части замкнутой области

Таблица 15.8 (окончание)

Формат обращения к процедуре

Выполняемое действие

FillEllipse(x,y,Rx,Ry);

Построение залитого эллипса

FillPoly(n,xy);

Построение залитого многоугольника

GetFillPattern(fill_pat);

Опрос текущего шаблона заливки

GetFillSettings(v_FST);

Опрос параметров заливки

PieSlice(x,y,a1,a2,R);

Построение залитого сектора окружности

Sector(x,y,a1,a2,Rx,Ry);

Построение залитого сектора эллипса

SetFillPattern(fill_pat,color);

Задание пользовательского шаблона

SetFillStyle(v_FST);

Установка режима заливки

Пример использования процедуры Bar в режиме заливки сплошным цветом приводился в разд. 15.3. Результат работы соответствующей программы показыва- ет, что цветной прямоугольник строится без обводки границ. Чтобы построить цветной прямоугольник с четко очерченной границей другого цвета, надо обра- титься к двум последовательным процедурам (листинг 15.7).

   Листинг 15.7. Программа  fill1                                               

program fill1; uses graph; var

gd,gm: SmallInt;

pat94: FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”);

SetFillPattern(pat94,4);  // назначение шаблона пользователя SetFillStyle(UserFill,4); // установка режима заливки Bar(10,10,100,100);       // отображение прямоугольника без границы Rectangle(9,9,101,101);   // обводка границы

readln;

CloseGraph; end.

Результат ее работы в истинных цветах представлен на рис. 15.8.

Рис. 15.8. Обводка границ прямоугольника

Процедура Bar3D ориентирована, главным образом, на построение трехмерных столбчатых диаграмм. В графиках такого рода основным элементом является либо однородный цветной столбик с "крышей", либо столбик без "крыши", над которым можно надстроить еще один или несколько столбиков с другой раскраской. Обра- щение к процедуре Bar3D требует задания следующих параметров:

Bar3D(x1, y1, x2, y2, depth, top);

Первые четыре аргумента задают угловые точки передней панели столбика. Параметр depth определяет глубину столбика и иногда его рекомендуют выбирать равным четверти ширины (deph=0.25*(x2-x1)). Естественно, что все эти парамет- ры целочисленные и неотрицательные, задаются они в пикселах. Последний аргу- мент top — логического типа. Если он равен True, то крыша столбика рисуется, в противном случае столбик воспроизводится без крыши, и это дает возможность надстроить над ним следующий столбик и не заботиться об удалении невидимых линий. Приведенный в листинге 15.8 пример демонстрирует возможность воспро- изведения одиночного (с крышей) и составного столбика (нижний — без крыши, верхний — с крышей).

   Листинг 15.8. Программа  bar3d_1                                             

program bar3d_1; uses graph;

var

gd,gm: SmallInt; begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(HatchFill,Blue);

Bar3d(20,20,40,100,10,true);

SetFillStyle(SolidFill,Yellow);

Bar3d(80,60,120,100,15,false);

SetFillStyle(CloseDotFill,Red);

Bar3d(80,20,120,60,15,true);

readln; CloseGraph;

end.

Результат работы этой программы приведен на рис. 15.9.

Рис. 15.9. Элементы столбчатых диаграмм

Иногда к процедуре Bar3D обращаются с нулевым значением параметра depth. В этом случае можно построить залитый прямоугольник с четко выделенной гра- ницей.

Процедура FloodFill предназначена для заливки или штриховки внутренней или внешней части замкнутого контура:

FloodFill(x, y, bord_col);

Параметр bord_col задает цвет пикселов, составляющих непрерывную границу области. Если точка с координатами (x, y) находится внутри области, то обработке подвергается внутренняя часть замкнутого контура. В противном случае окраска (штриховка) выполняется для внешней части контура. Разрыв границы контура да- же на один пиксел приведет к тому, что краска (штриховка) "просочится" на про- тивоположную часть контура и залитым окажется весь экран или большая его часть. Последнее может произойти, если на пути краски встретится еще один замк- нутый контур с таким же цветом границы. Если цвет заливки, установленный в од- ной из процедур SetFillPattern или SetFillStyle, не совпадает с цветом грани- цы, то цвет контура после работы процедуры FloodFill остается прежним. Однако оба указанных цвета могут совпасть, и тогда залитая область лишится ярко выра- женного цвета границы. Повторная перекраска такой области с помощью процеду- ры FloodFill уже невозможна.

Процедура FillEllipse предназначена для построения залитого эллипса. При

необходимости его граница может быть очерчена с помощью процедуры Ellipse.

Параметры процедуры FillPoly совпадают с аргументами процедуры DrawPoly

(листинг 15.9).

   Листинг 1 5 .9 .  Программа  f_polygon                                           

program f_polygon; uses graph;

var

gd,gm: SmallInt;

xy:   array [1..4] of PointType; begin

xy[1].x:=10;  xy[1].y:=10;

xy[2].x:=100; xy[2].y:=10;

xy[3].x:=80;  xy[3].y:=60;

xy[4].x:=10;  xy[4].y:=10;

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(SolidFill,Green);

FillPoly(4,xy); readln; CloseGraph;

end.

Залитый по этой программе треугольник представлен на рис. 15.10.

Рис. 15.10. Заливка многоугольника

Секторы окружностей или эллипсов, окрашиваемые с помощью процедур PieSlice и Sector, часто используются для построения круговых диаграмм (рис. 15.11).

Рис. 15.11. Круговая диаграмма

Опрос текущих параметров заливки осуществляется с помощью процедур Get- FillSettings и GetFillPattern.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

,$FB,$FB,$FB,

В этом разделе речь пойдет о закрашивании замкнутых областей любым цветом или их заполнение фиксированным цветным узором — шаблоном заливки. Шаблон заливки задается массивом 8 8 бит, где каждый единичный разряд окрашивается указанным цветом, а каждый нулевой разряд — цветом фона. Представьте себе, что весь графический экран покрыт такими узорными квадратиками, примыкающими друг к другу по горизонтали и вертикали. Наложим на этот узор контур замкнутой области, и та часть узора, которая ограничена контуром, используется для окраски внутренней или внешней части нашей фигуры. Если шаблон заполнен только еди- ничными разрядами, то закраска ведется сплошным цветом. Наличие единичных разрядов только в отдельных строках шаблона (например, хотя бы в одной) приво- дит к горизонтальной штриховке области. Варьирование комбинаций нулей и еди- ниц в шаблоне позволяет создавать довольно много различных узоров — до 32  63.

В графической библиотеке BGI предусмотрено 13 стандартных шаблонов за-

ливки, приведенных в табл. 15.7. Для использования любого из них достаточно указать нужный номер или соответствующую мнемоническую константу. Установ- ка того или иного стиля заливки выполняется с помощью процедуры SetFillStyle:

SetFillStyle(v_FST);

Аргументом этой процедуры является запись типа FillSettingsType, содер- жащая всего два поля:

type FillSettingsType = record pattern: Word;   // номер шаблона color: Word;     // код цветности

end;

Таблица 15.7

Номер шаблона

Константа

Способ заполнения

0

EmptyFill

Заливается цветом фона (все биты шаблона нулевые)

1

SolidFill

Заливается цветом color

2

LineFill

Штриховка горизонтальными линиями

3

LtSlashFill

Тонкая штриховка под   45

4

SlashFill

Толстая штриховка под   45

5

BkSlashFill

Толстая штриховка под   135

6

LtBkSlashFill

Тонкая штриховка под   135

7

HatchFill

Двойная штриховка   (0и 90 )

8

XHatchFill

Двойная штриховка   (45и 135 )

9

InterleaveFill

Короткие чередующиеся штрихи

10

WideDotFill

Редкий точечный растр

11

CloseDotFill

Густой точечный растр

12

UserFill

Заполнение шаблоном пользователя

Шаблон пользователя устанавливается с помощью процедуры SetFillPattern: SetFillPattern(fill_pat,color);

Первый параметр представляет собой 8-байтовый массив, биты которого сфор- мированы по желанию пользователя. Например, шаблон, напоминающий кирпич- ную стену, образованную окрашенными кирпичиками, может быть задан следую- щим образом:

var

pat94:FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

Около сотни нестандартных узоров вы можете найти в книге [20].

Процедуры и функции, используемые для работы с залитыми областями, при- ведены в табл. 15.8.

Таблица 15.8

Формат обращения к процедуре

Выполняемое действие

Bar(x1,y1,x2,y2);

Построение залитого прямоугольника

Bar3D(x1,y1,x2,y2,depth,top);

Построение параллелепипеда

FloodFill(x,y,bord_col);

Заливка внутренней или внешней части замкнутой области

Таблица 15.8 (окончание)

Формат обращения к процедуре

Выполняемое действие

FillEllipse(x,y,Rx,Ry);

Построение залитого эллипса

FillPoly(n,xy);

Построение залитого многоугольника

GetFillPattern(fill_pat);

Опрос текущего шаблона заливки

GetFillSettings(v_FST);

Опрос параметров заливки

PieSlice(x,y,a1,a2,R);

Построение залитого сектора окружности

Sector(x,y,a1,a2,Rx,Ry);

Построение залитого сектора эллипса

SetFillPattern(fill_pat,color);

Задание пользовательского шаблона

SetFillStyle(v_FST);

Установка режима заливки

Пример использования процедуры Bar в режиме заливки сплошным цветом приводился в разд. 15.3. Результат работы соответствующей программы показыва- ет, что цветной прямоугольник строится без обводки границ. Чтобы построить цветной прямоугольник с четко очерченной границей другого цвета, надо обра- титься к двум последовательным процедурам (листинг 15.7).

   Листинг 15.7. Программа  fill1                                               

program fill1; uses graph; var

gd,gm: SmallInt;

pat94: FillPatternType=($00,$FB,$FB,$FB,$00,$DF,$DF,$DF);

begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”);

SetFillPattern(pat94,4);  // назначение шаблона пользователя SetFillStyle(UserFill,4); // установка режима заливки Bar(10,10,100,100);       // отображение прямоугольника без границы Rectangle(9,9,101,101);   // обводка границы

readln;

CloseGraph; end.

Результат ее работы в истинных цветах представлен на рис. 15.8.

Рис. 15.8. Обводка границ прямоугольника

Процедура Bar3D ориентирована, главным образом, на построение трехмерных столбчатых диаграмм. В графиках такого рода основным элементом является либо однородный цветной столбик с "крышей", либо столбик без "крыши", над которым можно надстроить еще один или несколько столбиков с другой раскраской. Обра- щение к процедуре Bar3D требует задания следующих параметров:

Bar3D(x1, y1, x2, y2, depth, top);

Первые четыре аргумента задают угловые точки передней панели столбика. Параметр depth определяет глубину столбика и иногда его рекомендуют выбирать равным четверти ширины (deph=0.25*(x2-x1)). Естественно, что все эти парамет- ры целочисленные и неотрицательные, задаются они в пикселах. Последний аргу- мент top — логического типа. Если он равен True, то крыша столбика рисуется, в противном случае столбик воспроизводится без крыши, и это дает возможность надстроить над ним следующий столбик и не заботиться об удалении невидимых линий. Приведенный в листинге 15.8 пример демонстрирует возможность воспро- изведения одиночного (с крышей) и составного столбика (нижний — без крыши, верхний — с крышей).

   Листинг 15.8. Программа  bar3d_1                                             

program bar3d_1; uses graph;

var

gd,gm: SmallInt; begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(HatchFill,Blue);

Bar3d(20,20,40,100,10,true);

SetFillStyle(SolidFill,Yellow);

Bar3d(80,60,120,100,15,false);

SetFillStyle(CloseDotFill,Red);

Bar3d(80,20,120,60,15,true);

readln; CloseGraph;

end.

Результат работы этой программы приведен на рис. 15.9.

Рис. 15.9. Элементы столбчатых диаграмм

Иногда к процедуре Bar3D обращаются с нулевым значением параметра depth. В этом случае можно построить залитый прямоугольник с четко выделенной гра- ницей.

Процедура FloodFill предназначена для заливки или штриховки внутренней или внешней части замкнутого контура:

FloodFill(x, y, bord_col);

Параметр bord_col задает цвет пикселов, составляющих непрерывную границу области. Если точка с координатами (x, y) находится внутри области, то обработке подвергается внутренняя часть замкнутого контура. В противном случае окраска (штриховка) выполняется для внешней части контура. Разрыв границы контура да- же на один пиксел приведет к тому, что краска (штриховка) "просочится" на про- тивоположную часть контура и залитым окажется весь экран или большая его часть. Последнее может произойти, если на пути краски встретится еще один замк- нутый контур с таким же цветом границы. Если цвет заливки, установленный в од- ной из процедур SetFillPattern или SetFillStyle, не совпадает с цветом грани- цы, то цвет контура после работы процедуры FloodFill остается прежним. Однако оба указанных цвета могут совпасть, и тогда залитая область лишится ярко выра- женного цвета границы. Повторная перекраска такой области с помощью процеду- ры FloodFill уже невозможна.

Процедура FillEllipse предназначена для построения залитого эллипса. При

необходимости его граница может быть очерчена с помощью процедуры Ellipse.

Параметры процедуры FillPoly совпадают с аргументами процедуры DrawPoly

(листинг 15.9).

   Листинг 1 5 .9 .  Программа  f_polygon                                           

program f_polygon; uses graph;

var

gd,gm: SmallInt;

xy:   array [1..4] of PointType; begin

xy[1].x:=10;  xy[1].y:=10;

xy[2].x:=100; xy[2].y:=10;

xy[3].x:=80;  xy[3].y:=60;

xy[4].x:=10;  xy[4].y:=10;

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(SolidFill,Green);

FillPoly(4,xy); readln; CloseGraph;

end.

Залитый по этой программе треугольник представлен на рис. 15.10.

Рис. 15.10. Заливка многоугольника

Секторы окружностей или эллипсов, окрашиваемые с помощью процедур PieSlice и Sector, часто используются для построения круговых диаграмм (рис. 15.11).

Рис. 15.11. Круговая диаграмма

Опрос текущих параметров заливки осуществляется с помощью процедур Get- FillSettings и GetFillPattern.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

,$DF,$DF,$DF);

begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”);

SetFillPattern(pat94,4);  // назначение шаблона пользователя SetFillStyle(UserFill,4); // установка режима заливки Bar(10,10,100,100);       // отображение прямоугольника без границы Rectangle(9,9,101,101);   // обводка границы

readln;

CloseGraph; end.

Результат ее работы в истинных цветах представлен на рис. 15.8.

Рис. 15.8. Обводка границ прямоугольника

Процедура Bar3D ориентирована, главным образом, на построение трехмерных столбчатых диаграмм. В графиках такого рода основным элементом является либо однородный цветной столбик с "крышей", либо столбик без "крыши", над которым можно надстроить еще один или несколько столбиков с другой раскраской. Обра- щение к процедуре Bar3D требует задания следующих параметров:

Bar3D(x1, y1, x2, y2, depth, top);

Первые четыре аргумента задают угловые точки передней панели столбика. Параметр depth определяет глубину столбика и иногда его рекомендуют выбирать равным четверти ширины (deph=0.25*(x2-x1)). Естественно, что все эти парамет- ры целочисленные и неотрицательные, задаются они в пикселах. Последний аргу- мент top — логического типа. Если он равен True, то крыша столбика рисуется, в противном случае столбик воспроизводится без крыши, и это дает возможность надстроить над ним следующий столбик и не заботиться об удалении невидимых линий. Приведенный в листинге 15.8 пример демонстрирует возможность воспро- изведения одиночного (с крышей) и составного столбика (нижний — без крыши, верхний — с крышей).

   Листинг 15.8. Программа  bar3d_1                                             

program bar3d_1; uses graph;

var

gd,gm: SmallInt; begin

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(HatchFill,Blue);

Bar3d(20,20,40,100,10,true);

SetFillStyle(SolidFill,Yellow);

Bar3d(80,60,120,100,15,false);

SetFillStyle(CloseDotFill,Red);

Bar3d(80,20,120,60,15,true);

readln; CloseGraph;

end.

Результат работы этой программы приведен на рис. 15.9.

Рис. 15.9. Элементы столбчатых диаграмм

Иногда к процедуре Bar3D обращаются с нулевым значением параметра depth. В этом случае можно построить залитый прямоугольник с четко выделенной гра- ницей.

Процедура FloodFill предназначена для заливки или штриховки внутренней или внешней части замкнутого контура:

FloodFill(x, y, bord_col);

Параметр bord_col задает цвет пикселов, составляющих непрерывную границу области. Если точка с координатами (x, y) находится внутри области, то обработке подвергается внутренняя часть замкнутого контура. В противном случае окраска (штриховка) выполняется для внешней части контура. Разрыв границы контура да- же на один пиксел приведет к тому, что краска (штриховка) "просочится" на про- тивоположную часть контура и залитым окажется весь экран или большая его часть. Последнее может произойти, если на пути краски встретится еще один замк- нутый контур с таким же цветом границы. Если цвет заливки, установленный в од- ной из процедур SetFillPattern или SetFillStyle, не совпадает с цветом грани- цы, то цвет контура после работы процедуры FloodFill остается прежним. Однако оба указанных цвета могут совпасть, и тогда залитая область лишится ярко выра- женного цвета границы. Повторная перекраска такой области с помощью процеду- ры FloodFill уже невозможна.

Процедура FillEllipse предназначена для построения залитого эллипса. При

необходимости его граница может быть очерчена с помощью процедуры Ellipse.

Параметры процедуры FillPoly совпадают с аргументами процедуры DrawPoly

(листинг 15.9).

   Листинг 1 5 .9 .  Программа  f_polygon                                           

program f_polygon; uses graph;

var

gd,gm: SmallInt;

xy:   array [1..4] of PointType; begin

xy[1].x:=10;  xy[1].y:=10;

xy[2].x:=100; xy[2].y:=10;

xy[3].x:=80;  xy[3].y:=60;

xy[4].x:=10;  xy[4].y:=10;

gd:=D8bit; gm:=m800x600; initgraph(gd,gm,”); SetColor(Green);

SetFillStyle(SolidFill,Green);

FillPoly(4,xy); readln; CloseGraph;

end.

Залитый по этой программе треугольник представлен на рис. 15.10.

Рис. 15.10. Заливка многоугольника

Секторы окружностей или эллипсов, окрашиваемые с помощью процедур PieSlice и Sector, часто используются для построения круговых диаграмм (рис. 15.11).

Рис. 15.11. Круговая диаграмма

Опрос текущих параметров заливки осуществляется с помощью процедур Get- FillSettings и GetFillPattern.

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии