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

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.