Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Турбо Паскаль.doc
Скачиваний:
789
Добавлен:
10.04.2015
Размер:
1.84 Mб
Скачать

1. 15. 3. Рисование геометрических фигур

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

Причем, двоичное число разбивается на тетрады цифр с конца числа, а шестнадцатеричное число получается заменой каждой тетрады соответствующей цифрой с добавлением в начале числа символа "$".

88

Орнамент удобно задавать, используя переменные с начальным значением (типизированные константы), например:

{оператор описания:}

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), а затем демонстрирующей набор стандартных орнаментов на передней грани параллелепипедов:

89

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);