|
Горбачев Л.И. Основы программирования в среде Turbo Pascal.
[НАЗАД]
[ДАЛЕЕ]
6. Определение атрибутов графического изображения.
Модуль Graph располагает рядом процедур и функций, позволяющих
определять атрибуты выводимого на экран графического изображения. К числу таких
атрибутов следует отнести цвет, фон, стиль, шаблон и толщину линий, с помощью
которых на экране отображается любое графическое изображение, а также шаблон и
цвет заполнения высвечиваемых на экране различных геометрических фигур.
Вполне возможен следующий алгоритм построения какой-либо фигуры: -
установить цвет фона (SetBkColor) и цвет контура фигуры (SetColor); -
установить толщину линий контура (SetLineStyle) и ее шаблон; - установить
шаблон "заливки" фигуры (SetFillStyle); - вывести изображение фигуры на
экран; - "заливка" замкнутой области, ограниченной контуром фигуры
(FloodFill).
6.1. Управление цветом и фоном.
Для управления цветом и фоном используются следующие процедуры и
функции:
- GetDefaultPalette(var Pal: PaletteType); -
возвращает значение переменной типа запись (PaletteType), содержащей информацию
о палитре, установленной во время инициализации графического режима.
- GetPalette(var Palette: PaletteType); - возвращает
текущую палитру и ее размер в переменную типа PaletteType.
- SetAllpalette(var Palette); - изменяет все цвета
палитры на указанные в переменной Palette.
- SetBkColor(Color: word); - устанавливает текущий фоновый цвет, используя
текущую палитру.
- SetColor(Color: word); - устанавливает текущий цвет изображения, используя
заданную палитру.
- SetPalette(ColorNum: word; Color: shortint); - изменяет один из цветов
палитры с номером ColorNum на цвет Color.
- SetRGBPalette(ColorNum, RedValue, GreenValue, BlueValue: integer); -
позволяет модифицировать компоненты палитры (только для VGA). RedValue,
GreenValue, BlueValue - определяют составляющие цветов для заданной компоненты
палитры.
- GetBkColor: word; - возвращает значение текущего фонового цвета в
соответствии с текущей палитрой.
- GetColor: word; - возвращает значение текущего цвета в соответствии с
текущей палитрой.
- GetMaxColor: word; - возвращает значение максимального номера цвета, который
может быть использован в SetColor.
- GetPaletteSize: word; - возвращает размер палитры.
6.2. Выбор стиля, шаблона и толщины линии.
Для этого используются следующие процедуры и функции:
- GetLineSettings(var LinInfo: LineSettingsType); возвращает текущий стиль,
образец и толщину линии.
- LineStyle - стиль линии - определяется, исходя из следующего списка констант
модуля Graph:
const SolidLn = 0; {Сплошная линия} DotteLn = 1; {Линия из 3-х точек} CenterLn = 2; {Линия из точек и тире} DashedLn = 3; {Пунктирная линия} UserBitLn = 4; {Тип, определенный пользователем} Pattern имеет
значение, если LineStyle = 4. В этом параметре задается шаблон линии. Thickness
принимает одно из следующих значений из соответствующего списка
констант: const NormWidth = 1; {Нормальная толщина} ThickWidth = 3; {Увеличенная толщина}
- SetLineStyle(LineStyle, Pattern, Thickness:word); - устанавливает текущую
толщину и тип линии. Значения параметров LineStyle, Pattern, Thickness должны
соответствовать значениям одноименных элементов записи типа LineSettingsType.
Если LineStyle = UserBitLn, то тип линии задается шаблоном Pattern по следующему
принципу. Если отдельный бит шаблона равен 1, то соответствующий ему пиксель
будет высвечиваться на экране. Например, если Pattern = &AAAA и &AAAA =
1010101010101010, то такой шаблон соответствует сплошной линии нормальной
толщины (50%-ная яркость). По результатам SetLineStyle формируется GraphResult.
Параметры, сформированные SetLineStyle, определяют линию в процедурах Line,
LineRel, LineTo и Rectangle.
- SetWriteMode(WriteMode: integer); - устанавливает режим при вычерчивании
линий. В качестве возможных значений WriteMode используются соответствующие
константы или их значения, описанные в разделе интерфейса модуля Graph
как:
const CopyPut = 0; {MOV} XORPut = 1; {XOR}
Каждая из этих констант соответствует известной из Ассемблера
бинарной операции MOV (поместить) или XOR (исключающее ИЛИ). Если WriteMOde =
CopyPut, то рисуемая линия просто выводится на экран. Если WriteMode = XORPut,
то рисуемая линия накладывается на экран в соответствии с используемой бинарной
операцией XOR. Два последовательных оператора вывода линии на экран при
SetWriteMode(1) восстанавливают первоначальное изображение экрана (до вывода на
него этой линии). вычерчивании линий.
6.3. Выбор шаблона и цвета заполнения.
Для выбора шаблона и цвета заполнения используются следующие
процедуры:
- GetFillPattern(var FillPattern: FillPatternType); - возвращает в переменной
FillPattern образец заполнения.
- SetFillPattern(Pattern:FillPatternType; Color: word); - устанавливает
определенный пользователем шаблон и цвет заполнения.
- GetFillSettings(var FillInfo: FillSettingsType); - возвращает последний
образец заполнения и цвет, установленный предыдущим вызовом SetFillPattern или
SetFillStyle. Переменная FillInfo должна иметь структуру, описанную в разделе
интерфейса модуля Graph как:
type FillSettingsType =
record Pattern: word; Color: word; end; Поле Pattern содержит текущий выбранный образец
заполнения и соответствует одному из значений следующего списка
констант: const 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;{Заполнение, определяемое
пользователем} Поле Color содержит текущий цвет заполнения в
соответствии с используемой палитрой.
- SetFillStyle(Pattern, Color: word); - устанавливает шаблон и цвет
заполнения, используемые при выполнении процедур FillPoly, Bar, Bar3D. Значение
Pattern выбирается из соответствующего списка констант, приведенного в
GetFillSettings. Только в случае, если Pattern = UserFill, становится активным
шаблон, заданный в SetFillPattern.
6.4. Управление текущим указателем.
Текущий указатель в графическом режиме представляет собой невидимую
точку, имеющую координаты (X, Y). Координата X отображает местоположение
текущего указателя в горизонтальном направлении, а Y - его местоположение в
вертикальном направлении. Отсчет координат ведется от левого верхнего угла (0,
0) активного окна. Для управления текущим указателем в модуле Graph
предусмотрены следующие процедуры и функции:
- GetMaxX: integer; - возвращает максимальное значение координаты X. Например,
если определен графический режим VGA с разрешающей способностью 640х480, то
GetMaxX = 639.
- GetMaxY: integer; - возвращает максимальное значение координаты Y.
- GetX: integer; - возвращает X-координату текущего указателя (значение GetX
выдается относительно активного окна).
- GetY: integer; - возвращает Y-координату текущего указателя (значение GetY
выдается относительно активного окна).
- MoveRel(Dx, Dy: integer); - перемещает текущий указатель в точку, которая
находится на расстоянии (Dx, Dy) от текущей позиции.
- MoveTo(X, Y: integer); - перемещает текущий указатель в точку с координатами
(X, Y). Значения X и Y указываются относительно активного окна.
Кроме перечисленных процедур и функций полезно знать другие процедуры
и функции, которые изменяют местоположение текущего указателя. Это -
ClearDevice, ClearViewPort, GraphDefaults, InitGraph, LineRel, LineTo, PutPixel,
SetGraphMode, SetViewPort.
6.5. Вывод графической информации.
Модуль Graph позволяет выводить на экран изображение различных
геометрических фигур, а также получать информацию о них. Это осуществляется с
помощью следующих процедур и функций:
- Arc(X, Y: integer; StAngle, EndAngle, Radius: word); - рисует на экране дугу
с центром в точке (X, Y), радиусом Radius, от начального угла StAngle до
конечного угла EndAngle с использованием текущего цвета. Отсчет углов
осуществляется относительно горизонтальной оси в направлении против часовой
стрелки (3 часа - 0 градусов, 12 часов - 90 градусов и т.д.). Если StAngle = 0,
а EndAngle = 360 градусов, то будет нарисована окружность.
- Bar(X1, Y1, X2, Y2: integer); - выводит на экран закрашенный прямоугольник с
координатами верхнего левого угла (X1, Y1) и правого нижнего угла (X2, Y2). При
закраске прямоугольника используются шаблон и цвет, определенные процедурами
SetFillStyle и SetFillPattern.
- Bar3D(X1, Y1, X2, Y2: integer; Depth: word; Top: boolean); - выводит на
экран изображение закрашенного прямоугольного параллелепипеда текущим цветом и
стилем линий (SetColor, SetLineStyle). При закраске параллелепипеда используется
шаблон и цвет, определенные процедурами SetFillStyle и SetFillPattern.
Прямоугольный параллелепипед рисуется в изометрическом изображении с глубиной,
задаваемой в параметре Depth (обычно Depth = (X2 - X1 + 1) div 3). Параметр Top
определяет, рисовать ли верхнюю грань параллелепипеда (при изображении
нескольких параллелепипедов). Значение Top выбирается из соответствующего списка
констант раэдела интерфейса модуля Graph:
const
TopOn = True;
TopOff = False; Координаты X1, Y1, X2, Y2 определяют
ближнюю фронтальную плоскость параллелепипеда.
- Circle(X, Y: integer; Radius: word); - выводит на экран изображение
окружности с центром (X, Y) и радиусом Radius. Окружность рисуется цветом,
установленным SetColor.
- DrawPoly(NumPoints: word; var PolyPoins); - выводит на экран контур
многоугольника, используя текущий цвет (SetColor) и стиль линии (SetLineStyle).
Число вершин многоугольника задается в NumPoints. В параметре NumPoints задаются
координаты вершин многоугольника. Каждая координата состоит из двух слов: X и Y.
Например:
const T: array[1..4] of PointType = (X: 10,
Y: 50), (X: 100, Y: 50), (X: 10, Y: 100), (X: 100, Y:
100); .............. begin .............. DrawPoly($,
T); .............. end.
- Ellipse(X, Y: integer; StAngle, EndAngle: word; XRadius, YRadius: word); -
выводит на экран изображение эллиптической с центром в точке (X, Y) от
начального угла StAngle до конечного угла EndAngle с горизонтальной полуосью
XRadius и вертикальной полуосью YRadius. Эллиптическая дуга высвечивается на
экране текущим цветом (SetColor). Если StAngle = 0 и EndAngle = 360 градусам, то
будет выведено изображение полного эллипса.
- FillEllipse(X, Y: integer; XRadius, YRadius: word); - выводит на экран
изображение полного закрашенного эллипса с центром (X, Y) с горизонтальной и
вертикальной полуосями XRadius и YRadius. Эллипс высвечивается текущим цветом
(SetColor) и закрашивается текущим цветом и стилем заполнения (SetFillStyle,
SetFillPattern).
- FillPoly(X, Y: integer; Border: word); - аналогична процедуре DrawPoly.
Отличие состоит в том, что изображение многоугольника закрашивается текущим
цветом и стилем заполнения (SetFillStyle, SetFillPattern).
- FloodFill(X, Y: integer; Border: boolean); - заполняет (закрашивает)
ограниченную область текущим цветом и стилем заполнения (SetFillStyle,
SetFillPattern). Граница закрашиваемой области высвечивается цветом, задаваемым
в Border. Если точка (X, Y) находится внутри области, то эта область
закрашивается, если же она находится вне области, то заполняется внешняя часть
области.
- GetArcCoords(var ArcCords: ArcCordsType); - возвращает переменную типа
ArcCordsType. Этот тип определен в разделе интерфейса модуля Graph как:
type ArcCordsType = record X, Y:
integer; XStart, YStart: integer; Xend, Yend: integer; end; где X, Y - центр дуги, выведенной на экран процедурой
Arc или Ellipse, а XStart, YStart, Xend, Yend - координаты начала и конца этой
дуги. Эта процедура является весьма полезной, если необходимо соединить прямой
линией начало и конец выведенного на экран изображения дуги.
- Line(X1, Y1, X2, Y2: integer); - выводит на экран линию, соединяющую точки с
координатами (X1, Y1) и (X2, Y2). Толщина, цвет и тип линии задается с помощью
SetLineStyle и SetColor.
- LineRel(Dx, Dy: integer); - выводит изображение прямой линии, соединяющей
точку, где расположен текущий указатель, и точку, удаленную от нее на расстояние
(Dx, Dy). Для изображения линии используется текущий стиль, цвет и шаблон,
установленные процедурами SetColor и SetLineStyle.
- LineTo(X, Y: integer); - выводит изображение линии, соединяющей точку, в
которой находится текущий указатель, и точку с координатами (X, Y). При
изображении линии используются цвет, стиль и шаблон, установленные процедурами
SetColor и SetLineStyle.
- PieSlice(X, Y: integer; StAngle, EndAngle, Radius: word); - выводит на экран
изображение закрашенного сектора круга, используя в качестве центра круга точку
(X, Y), начального угла StAngle, конечного угла EndAngle и радиуса Radius.
Контур сектора высвечивается текущим цветом (SetColor). При заполнении сектора
используется шаблон и цвет, определенные процедурами SetFillStyle и
SetFillPattern. Если StAngle=0, а EndAngle = 360 градусам, то PieSlice выводит
на экран закрашенную окружность.
- PutPixel(X, Y: integer; Pixel: word); - высвечивает в точке с координатами
(X, Y) пиксел цвета Pixel. Pixel задается исходя из соответствующего списка
констант.
- GetPixel(X, Y: integer): word; - возвращает значение цвета пиксела с
координатами (X, Y).
- Rectangle(X1, Y1, X2, Y2: integer); - выводит на экран изображение
прямоугольника, используя при этом текущий цвет (SetColor) и тип линии
(SetLineStyle). X1, Y1 - задает левый верхний угол, а X2, Y2 - правый нижний
угол прямоугольника.
- Sector(X, Y: integer; StAngle, EndAngle, XRadius, YRadius: word); - выводит
на экран изображение эллиптического сектора от начального угла StAngle до
конечного угла EndAngle, используя в качестве центра точку с координатами X, Y,
а в качестве горизонтальной и вертикальной полуосей - XRadius и YRadius. Сектор
выводится на экран с использованием текущего цвета (SetColor) и заполняется с
использованием шаблона и цвета, определенных в SetFillStyle и SetFillPattern.
Если StAngle=0, а EndAngle = 360 градусам, то на экран будет выведено
изображение полного эллипса.
Пример: Вывод на экран окрашенных линий,
используя процедуру LineTo. Пример построения линий, окрашенных в различные
цвета. [program
DemoLineTo]
Пример: Построение прямоугольника с окраской его
внутренней области. [program
DemoRectangle]
Пример: Программа, использующая различные шаблоны и
цвет заполнения. [program
DemoBar]
Пример: Программа, демонстрирующая построение различных
геометрических фигур. [program DemoFigure]
[НАЗАД]
[ДАЛЕЕ]
|
|