- •12 Графические возможности языка Паскаль
- •12.1 Управление графическим режимом
- •12.1.1 Процедуры управления графическим режимом
- •12.1.2 Функции управления графическим режимом
- •12.2 Процедуры управления экраном, окном, страницей
- •12.3 Управление цветом и палитрой
- •12.3.1 Процедуры управления цветом и палитрой
- •12.3.2 Функции управления цветом и палитрой
- •12.4 Работа с точками
- •12.4.1 Процедура работы с точками
- •12.4.2 Функции работы с точками
- •12.5 Процедуры работы с линиями
- •12.6 Процедуры построения фигур из линий
- •12.7 Процедуры построения криволинейных фигур
- •12.8 Работа с текстом в графическом режиме
- •12.8.1 Процедуры работы с текстом
- •12.8.2 Функции работы с текстом
- •12.9 Обмен с памятью
- •12.9.1 Процедуры обмена с памятью
- •12.9.2 Функция обмена с памятью
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 — цвет заполнения фигур (номер цвета в палитре). Согласно типу, образец орнамента задается в виде матрицы из 88 пикселей. Каждый разряд любого из этих байтов управляет светимостью пикселя, причем первый байт определяет 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.