Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование - 12 - Графика.doc
Скачиваний:
13
Добавлен:
09.03.2016
Размер:
410 Кб
Скачать
☆

12.6 Процедуры построения фигур из линий

Procedure ...

Rectangle ( x1, y1, x2, y2 : Integer ) ;

—

рисует контур прямоугольника текущим цветом.

x1, y1—

координаты левого верхнего угла прямоугольника.

x2, y2—

координаты правого нижнего угла прямоугольника

( необходимо, чтобы 0 ≤ x1 < x2 ≤ GetMaxX и 0 ≤ y1< y2≤ GetMaxY ).

Текущий цвет задается процедурой SetColor, текущие параметры линии — процедуройSetLineStyle, а режим построения линии — процедуройSetWriteMode.

Bar ( x1, y1, x2, y2 : Integer ) ;

—

рисует закрашенный прямоугольник текущим орнаментом и цветом заполнения.

x1, y1, x2, y2—

координаты левого верхнего и правого нижнего углов прямоугольника.

Орнамент и цвет заполнения задаются процедурой SetFillStyleилиSetFillPattern.

Пример 12.9

. . .

For i := 1 to 5 do

Bar ( i*w, i*10, Succ( i )*w + 1, 200 ) ;

. . .

Bar3d ( x1, y1, x2, y2 : Integer ; Depth : Word ; Top : Boolean ) ;

—

рисует трехмерный параллелепипед и закрашивает его переднюю грань.

x1, y1, x2, y2—

координаты левого верхнего и правого нижнего углов передней грани.

Depth—

«глубина» параллелепипеда — ширина боковой грани в пикселях (отсчитывается по горизонтали).

Top—

признак включения верхней грани (если True— верхняя грань вычерчивается, в противном случае верхняя грань не отображается — используется при изображении нескольких параллелепипедов один над другим).

В модуле Graphопределенны следующие константы:

Const

TopOn = True ;

TopOff = False ;

Параллелепипед «прозрачен — за не закрашенными гранями могут быть видны другие элементы изображения.

Текущий цвет трехмерного контура параллелепипеда задается процедурой SetColor, текущие параметры линии — процедуройSetLineStyle, а режим построения линии — процедуройSetWriteMode. Орнамент и цвет заполнения передней грани задаются процедуройSetFillStyleилиSetFillPattern.

Процедура часто применяется для построения столбчатых диаграмм.

Если возникает ошибка, то GraphResultвозвращает значение -6.

Пример 12.10

. . .

{ Типичный параметр «глубины» - 25% ширины параллелепипеда : }

Bar3d ( x1, y1, x2, y2, (x2 - x1 ) div 4 , TopOn ) ;

. . .

{ один параллелепипед над другим: }

y0 := 10 ; y1 := 60 ; y2 := 110 ;

x1 := 10 ; x2 := 50 ;

Bar3d ( x1, y0, x2, y1, 10 , TopOn ) ;

Bar3d ( x1, y1, x2, y2, 10 , TopOff ) ;

. . .

DrawPoly ( NumPoints : Word ; var PolyPoints ) ;

—

рисует текущим цветом ломаную линию, заданную координатами точек излома, включая обе крайние точки (в частности, контур замкнутого многоугольника).

NumPoints—

число пар координат точек — вершин ломаной, включая обе крайние точки — задаваемых параметром PolyPoints( при этом для замкнутогоn-угольникаNumPoints = n + 1 ).

PolyPoints—

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

Координаты точек излома задаются парой значений типа Word:первое определяет горизонтальную, второе — вертикальную координаты. Для них можно использовать следующий определенный в модулеGraphтип:

Type

PoitType = Record

x, y : Word

End;

Текущий цвет задается процедурой SetColor, текущие параметры линии — процедуройSetLineStyle, а режим построения линии — процедуройSetWriteMode.

Пример 12.11 (рисунок контура треугольника):

. . .

Const

Triangle : Array [ 1..4 ] of PoitType =

( ( x : 10 ; y : 100 ) ,

( x : 100 ; y : 100 ) ,

( x : 150 ; y : 150 ) ,

( x : 10 ; y : 100 ) ) ;

Begin

. . .

DrawPoly ( SizeOf ( Triangle ) div SizeOf ( PoitType ) , Triangle ) ;

. . .

End.

FillPoly ( NumPoints : Word ; var PolyPoints ) ;

—

рисует текущим цветом замкнутый многоугольник и закрашивает его текущим орнаментом и цветом заполнения.

NumPoints—

число вершин n-угольника (NumPoints = n + 1 ).

PolyPoints—

переменная без типа, содержащая пары координат вершин многоугольника (координаты должны перечисляться в той последовательности, как они идут по контуру, причем первая вершина должна быть повторена в конце перечисления).

Текущий цвет контура задается процедурой SetColor, текущие параметры линии — процедуройSetLineStyle, а режим построения линии — процедуройSetWriteMode. Орнамент и цвет заполнения задаются процедуройSetFillStyleилиSetFillPattern.

Пример 12.12 (рисунок закрашенного пятиугольника):

. . .

Const

Pentagon : Array [ 1..4 ] of PoitType =

( ( x : 50 ; y : 50 ) ,

( x : 75 ; y : 75 ) ,

( x : 62 ; y : 100 ) ,

( x : 48 ; y : 100 ) ,

( x : 25 ; y : 75 ) ,

( x : 50 ; y : 50 ) ) ;

Begin

. . .

FillPoly ( SizeOf ( Pentagon ) div SizeOf ( PoitType ) , Pentagon ) ;

. . .

End.

FloodFill ( x, y : Integer ; Border : Word ) ;

—

закрашивает область, ограниченную непрерывной линией, текущим орнаментом и цветом заполнения до границы заданного цвета.

x, y—

координаты любой точки внутри закрашиваемой области.

Border—

цвет линии, до которой производится закрашивание.

Если фигура не замкнута, заполнение «разольется» по всему экрану.

Если возникает ошибка, то GraphResultвозвращает значение -7.

Орнамент и цвет заполнения задаются процедурой SetFillStyleилиSetFillPattern.

Пример 12.13(закрашивание прямоугольника):

. . .

SetColor ( Blue ) ;

Rectangle ( 0, 0, 100, 150 ) ;

FloodFill ( 10, 10, Blue ) ;

. . .

SetFillStyle ( Pattern, Color : Word ) ;

—

задает стандартный орнамент и цвет заполнения фигур.

Pattern—

задаваемый стандартный параметр орнамента, определяемый одной из следующих констант модуля Graph:

Сonst

EmptyFill = 0; { без узора — заполнение фоном }

SolidFill = 1; { однородное заполнение }

LineFill = 2; { заполнение - - - - }

LtSlashFill = 3; { заполнение ///// }

SlashFill = 4; { заполнение утолщенными//////}

BkSlashFill = 5; { заполнение утолщенными\\\\\\}

LtBkSlashFill = 6; { заполнение \\\\\\\\\ }

HatchFill = 7; { заполнение ++++++++ }

XHatchFill = 8; { заполнение ххххххх }

InterleaveFill = 9; { заполнение частой сеткой }

WideDotFill = 10; { заполнение редкими точками }

CloseDotFill = 11; { заполнение частыми точками }

UserFill = 12; { узор определяется пользователем }

Если орнамент заполнения имеет значение UserFill, то рисунок узора определяется программистом путем обращения к процедуреSetFillPattern.

Color —

цвет заполнения фигур (номер цвета в палитре).

В случае аварийной ситуации (недопустимые входные данные) процедура устанавливает код ошибки: -11, а текущий орнамент и цвет не изменяются.

SetFillPattern ( Pattern : FillPatternType ; Color : Word ) ;

—

задает произвольный (пользовательский) орнамент, а также цвет заполнения фигур.

Pattern—

задаваемый пользователем орнамент — параметр типа FillPatternType, определенный в модулеGraph:

Type

FillPatternType = Array [ 1..8 ] of Byte;

Color —

цвет заполнения фигур (номер цвета в палитре).

Согласно типу, образец орнамента задается в виде матрицы из 88 пикселей. Каждый разряд любого из этих байтов управляет светимостью пикселя, причем первый байт определяет 8 пикселей первой строки на экране, второй байт — 8 пикселей второй строки и т.д.

В случае аварийной ситуации (недопустимые входные данные) процедура устанавливает код ошибки: -11, а текущий орнамент и цвет не изменяются.

Пример 12.14(приводятся два пользовательских орнаментов заполнения — для каждых 8 пикселей приводится шестнадцатеричный код соответствующего байта, а также программа, рисующая два прямоугольника с использованием приведенных орнаментов):

Образец 1

Значение байта

Образец 2

Значение байта

$49

$00

$92

$18

$49

$24

$92

$42

$49

$42

$92

$24

$49

$18

$92

$00

Закрашенному квадрату соответствует 1, не закрашенному — 0. Таким образом, получаем двоичное представление шестнадцатеричного числа: например, первая строка первого образца: 01001001 — двоичное представление шестнадцатеричного числа 49.

Uses

Crt , Graph ;

Const

MyPattern1 : FillPatternType = ( $49, $92, $49, $92, $49, $92, $49, $92 ) ;

MyPattern2 : FillPatternType = ( $00, $18, $24, $42, $42, $24, $18, $00 ) ;

Var

Driver, Mode : Integer ;

Begin

Driver := Detect ;

InitGraph ( Driver, Mode, ’’ ) ;

SetFillStyle ( UserFill, White ) ;

{ левый верхний квадрат : }

SetFillPattern ( MyPattern1, 1 ) ;

Bar ( 0, 0, GetMaxX div 2, GetMaxY div 2 ) ;

{ правый нижний квадрат : }

SetFillPattern ( MyPattern2, 2 ) ;

Bar ( GetMaxX div 2, GetMaxY div 2, GetMaxX, GetMaxY ) ;

ReadLn ;

CloseGraph

End.