Учебные материалы


5 Модуль graph



Карта сайта raluce.ru

5.2. Модуль GRAPH

Начиная с версии 4.0 в состав Турбо Паскаля включена мощная библиотека графических подпрограмм Graph, остающаяся практически неизмененной во всех остальных версиях. Библиотека содержит в общей сложности более 50 процедур и функций, предоставляющих программисту самые разнообразные возможности управления графическим экраном.

5.2.1. Переход в графический режим и возврат в текстовый.

Стандартное состояние ПК после его включения, а также к моменту запуска программы из среды Турбо Паскаль, соответствует работе экрана в текстовом режиме, поэтому любая программа, использующая графические средства компьютера, должна инициировать графический режим работы дисплейного адаптера. После завершения работы программы ПК возвращается в текстовый режим. Перед работой с графикой нужно установить наиболее подходящий для имеющегося монитора режим. Настройка графических процедур на работу с конкретным адаптером достигается за счет подключения нужного графического драйвера. Драйвер -это специальная программа, осуществляющая управление техническими средствами ПК. Графические драйверы, разработанные фирмой Borland, существуют для всех типов адаптеров и обычно располагаются на диске в отдельном подкаталоге BGI в виде файлов с расширением BGI. Турбо Паскаль имеет фиксированное число драйверов, каждый из которых поддерживает от одного до трех видеорежимов. Графические возможности конкретного адаптера определяются разрешением экрана, т.е. общим количеством пикселей, а также количеством цветов (оттенков), которыми может светиться каждый из них. Кроме того, многие адаптеры могут работать с несколькими графическими страницами. Графической страницей называют область оперативной памяти, используемую для создания «карты» экрана, т.е. содержащую информацию о светимости (цвете) каждого пиксела. Инициализация графического режима Процедура InitGraph. Процедура InitGraph инициирует графический режим работы адаптера. Формат вызова процедуры в программе: InitGraph (Driver, Mode, Path); Здесь Driver - переменная типа Integer, определяет тип графического драйвера; Mode - переменная того же типа, задающая режим работы графического адаптера; Path - выражение типа String, задает маршрут поиска файла драйвера; если он (драйвер) расположен в активном директории, то вместо маршрута ставят два апострофа. К моменту вызова процедуры на одном из дисковых носителей информации должен находиться файл, содержащий нужный графический драйвер. Процедура загружает этот драйвер в оперативную память и переводит адаптер в графический режим работы. Константы, определяющие видеорежим, приведены в таблице 1.2 вместе с информацией о выбираемом режиме и типе видеоадаптера, который может такой режим поддерживать. Таблица 1.2 Драйвер Режим Разрешение Файл CGA(1) EGA(3) VGA(9) SVGA CGACo, CGAHi EGALo, EGAHi VGALo, VGAHi 320200, (640200) 640200, (640350) 640200, (640350) 800600 и более CGA.BGI EGAVGA.BGI EGAVGA.BGI EGAVGA.BGI Если тип адаптера ПК неизвестен или программа рассчитана на работу с любым адаптером, используется обращение к процедуре InitGraph с требованием автоматического определения типа драйвера: Driver:= Detect; InitGraph (Driver, Mode, Path); После такого обращения устанавливается графический режим работы экрана, а при выходе из процедуры переменные Driver и Mode содержат целочисленные значения, определяющие тип драйвера и режим его работы. При этом для адаптеров, способных работать в нескольких режимах, выбирается старший режим, т.е. тот, что закодирован максимальной цифрой. Например, при работе с CGA-адаптером, обращение к процедуре со значением Driver=Detect вернет переменной Driver значение 1 (CGA) и переменной Mode – значение 4 (CGAHi), а такое же обращение к адаптеру VGA вернет переменной Driver значение 9 (VGA) и переменной Mode –значение 2 (VGAHi). Графическая программа, как и любая другая, может содержать ошибки. Для своевременного обнаружения и нейтрализации их предусмотрены две функции GraphResult и GraphErrorMsg. Функция GraphResult. Функция GraphResult возвращает значение типа Integer (0), если последняя графическая операция выполнялась без ошибок, или число в диапазоне -14, ... , -1, если ошибка была. Коды ошибок, допущенных при обращении к графическим процедурам, приведены в таблице 1.3. Таблица 1.3 Константа Значение Описание grOK grNolnitGraph grNotDetected grFileNotFound grInvalidDriver grNoLoadMem grNoScanMem grNoFloodMem grFontNotFound grNoFontMem grInvalidMode grError grIOerror grInvalidFont grInvalidFontNum 0 –1 –2 –3 –4 –5 –6 –7 –8 –9 –10 –11 –12 –13 –14 Нет ошибок Графика не инициализирована Графическое устройство не обнаружено Файл драйвера устройства не найден Неправильный файл драйвера устройства Не хватает памяти для загрузки драйвера Выход за пределы памяти при заполнении (scan fill) Выход за пределы памяти при заполнении (flood fill) Файл шрифта не найден Недостаточно памяти для загрузки шрифта Неверный графический режим драйвера Графическая ошибка Ошибка графического ввода-вывода Неверный файл шрифта Неверный номер шрифта Функция GraphErrorMsg. Функция GraphErrorMsg возвращает значение типа String, в котором по указанному коду ошибки дается соответствующее текстовое сообщение. Формат обращения к функции в программе: T:= GraphErrorMsg (<код ошибки>); T – переменная типа string. Фрагмент программы, в которой инициализируется графический режим и выполняется проверка, допущены ли при этой инициализации ошибки (и какого характера ) или нет : . . . . . . . uses Crt, Graph; var Driver, Mode, ErrorCode: integer; begin ClrScr; Driver:=Detect; InitGraph (Driver, Mode, ' '); ErrorCode:=GraphResult; If ErrorCode 0 then begin Writeln (' Графическая системная ошибка: '); Writeln (GraphErrorMsg (ErrorCode)); Halt (1) end end. Процедура CloseGraph. Процедура CloseGraph завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы экрана. Формат вызова процедуры в программе: CloseGraph ; Процедура RestoreCRTMode. Процедура RestoreCRTMode служит для кратковременного возврата в текстовый режим. В отличие от процедуры CloseGraph установленные параметры графического режима не сбрасываются. Формат вызова процедуры в программе: RestoreCRTMode; Функция GetGraphMode. Функция GetGraphMode возвращает значение типа Integer, в котором содержится код установленного режима работы графического адаптера. Формат обращения к функции в программе: T:= GetGraphMode ; Переменная T типа integer. Процедура SetGraphMode. Процедура SetGraphMode устанавливает новый графический режим работы адаптера. Формат обращения к процедуре в программе: SetGraphMode (< Mode>); Переменная Mode - код устанавливаемого режима. Процедура DetectGraph. Процедура DetectGraph возвращает тип драйвера и режим его работы. Формат обращения к процедуре в программе: DetectGraph(Driver, Mode); В отличие от функции GetGraphMode, описываемая процедура возвращает переменной Mode максимально возможный для данного адаптера номер графического режима. Функция GetDriverName. Функция GetDriverName возвращает значение типа String, содержащее имя загруженного графического драйвера. Формат обращения к функции в программе: S:= GetDriverName; Переменная S типа string.

5.2.3. Экран и окно в графическом режиме

Многие графические процедуры и функции используют указатель текущей позиции на экране, который, в отличие от текстового курсора, невидим. Положение этого указателя, как и вообще любой координаты на графическом экране, задается относительно левого верхнего угла, который, в свою очередь, имеет координаты (0,0). Таким образом, горизонтальная координата экрана увеличивается слева направо, а вертикальная – сверху вниз. Функция GetMaxX и GetMaxY. Функции GetMaxX и GetMaxY возвращают значения типа Word, содержащие максимальные координаты экрана в текущем режиме работы по горизонтали и вертикали соответственно. Формат обращения к функции в программе: X:= GetMaxX; Y:=GetMaxY; Переменные X, Y типа Word. Функция GetX и GetY. Функции GetX и GetY возвращают значения типа Integer, содержащие текущие координаты указателя по горизонтали и вертикали соответственно. Координаты определяются относительно левого верхнего угла окна или экрана. Формат обращения к функции в программе: X:= GetX; Y:=GetY; Переменные X, Y типа Integer. Процедура SetViewPort. Процедура SetViewPort устанавливает прямоугольное окно на графическом экране. Формат вызова процедуры в программе: SetViewPort (X1, Y1, X2, Y2, ClipOn); Переменные X1, Y1, X2, Y2 типа integer - координаты левого верхнего и правого нижнего углов окна. ClipOn - выражение типа Boolean, определяющее отсечку не умещающихся в окне символов. Координаты окна задаются относительно левого верхнего угла экрана. Если параметр ClipOn имеет значение True, то элементы изображения, не умещающиеся в пределах окна, отсекаются, в противном случае границы окна игнорируются. Процедура MoveTo. Процедура MoveTo перемещает текущий указатель в точку с координатами X, Y. Формат вызова процедуры в программе: MoveTo (X, Y); Переменные X, Y типа integer. Например, процедура MoveTo (45, 150); переместит текущий указатель в точку экрана с координатами (45, 150). Координаты определяются относительно левого верхнего угла экрана. Процедура MoveRel. Процедура MoveRel перемещает текущий указатель на dX точек по горизонтали и на dY точек по вертикали. Формат вызова процедуры в программе: MoveRel (dX, dY); Переменные dX, dY типа integer. Например, если текущий указатель находился в точке с координатами (45, 150), то процедура MoveRel (15, 10); переместит текущий указатель в точку экрана с координатами (60, 160). Процедура ClearDevise. Процедура ClearDevise очищает графический экран и заполняет его цветом фона, заданным процедурой SetBkColor. Формат вызова процедуры в программе: ClearDevise; Процедура ClearViewPort. Процедура ClearViewPort очищает графическое окно и устанавливает указатель в левую верхнюю точку окна. Формат вызова процедуры в программе: ClearViewPort; Процедура GetAspectRatio. Процедура GetAspectRatio возвращает два числа, позволяющие определить соотношение сторон экрана. Формат вызова процедуры в программе: GetAspectRatio (X, Y) ; Переменные X,Y типа Word. Процедура SetAspectRatio. Процедура SetAspectRatio устанавливает масштабный коэффициент отношения сторон графического экрана. Формат вызова процедуры в программе: SetAspectRatio (X, Y) ; Переменные X,Y типа Word.

5.2.4. Рисование линий и точек.

Процедура PutPixel. Процедура PutPixel выводит заданным цветом точку по указанным координатам. Формат вызова процедуры в программе: PutPixel (X, Y, Color); Переменные X, Y типа integer - координаты точки, переменная Color типа Word - цвет точки. Функция GetPixel. Функция GetPixel возвращает значение типа Word, содержащее цвет пикселя с указанными координатами. Формат обращения к функции в программе: G:= GetPixel(X,Y); Переменная G типа Word, переменные X, Y типа integer. Пример 1. Программа периодически выводит на экран «звездное небо» и затем гасит его. Для выхода из программы нажмите клавишу ввода. program Ris_1; uses Crt, Graph; const n=1000;{количество звезд} type Pixel_type=record x,y:integer end; var Driver,Mode,e,k: integer; color: word; x1,y1,x2,y2: integer; a: array[1..n] of Pixel_type; begin Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); e:=GraphResult; if e0 then writeln('ошибка инициализации – ',e) else begin {создаем окно в центре экрана} x1:=GetMaxX div 4; y1:=GetMaxY div 4; x2:=3*x1; y2:=3*y1; Rectangle(x1, y1, x2, y2); SetViewPort(x1 + 1, y1 + 1, x2 – 2, y2 – 2, ClipOn); {создаем и запоминаем звезды} for k:=1 to n do with a[k] do begin x:=Random(x2 – x1); y:=Random(y2 – y1) end; {Зажигаем и гасим звезды} color:=0; repeat for k:=1 to n do begin inc(color); if color=GetMaxColor then color:=0; with a[k] do PutPixel(x,y,color); delay(100) end; if not KeyPressed then for k:=n downto 1 do with a[k] do PutPixel(x,y,black); until KeyPressed; CloseGraph end end. Процедура Line. Процедура Line вычерчивает отрезок прямой с указанными координатами начала и конца. Формат вызова процедуры в программе: Line (X1, Y1, X2, Y2); Переменные X1, Y1, X2, Y2 типа integer – координаты концов отрезка. Процедура LineTo. Процедура LineTo вычерчивает отрезок прямой от текущего положения указателя до положения, заданного его новыми координатами. Формат вызова процедуры в программе: LineTo (X, Y); Переменные X, Y типа integer определяют новые координаты указателя (конца отрезка) относительно левого верхнего угла экрана. Процедура LineRel. Процедура LineRel вычерчивает отрезок прямой от текущего положения указателя до положения, заданного его новыми координатами. Формат вызова процедуры в программе: LineRel (dX, dY); Переменные dX, dY типа integer определяют координаты указателя относительно его текущего положения (см. работу процедуры MoveRel). Процедура SetLineStyle. Процедура SetLineStyle устанавливает новый стиль вычерчивания линий. Формат вызова процедуры в программе: SetLineStyle (Type, Pattern, Thick); Переменные Type, Pattern, Thick типа Word - тип, образец и толщина линии соответственно. Тип линии может быть задан одной из следующих констант: SolidLn =0; {сплошная линия} DottedLn =1; {точечная линия} CenterLn =2; {штрих-пунктирная линия} DashedLn =3; {пунктирная линия} UserBitLn =4; {узор линии определяет пользователь} Параметр Pattern учитывается только для линий, вид которых определяется пользователем. При этом два байта параметра Pattern определяют образец линии: каждый, установленный в единицу, бит этого слова соответствует светящемуся пикселю в линии, нулевой бит - несветящемуся пикселю. Таким образом параметр Pattern задает отрезок линии длиной в шестнадцать пикселей. Этот образец периодически повторяется по всей длине линии. Параметр Thick может принимать одно из двух значений: NormWidth =1; {толщина в один пиксель} ThickWidth =3; {толщина в три пикселя} Процедура GetLineSettings. Процедура GetLineSettings возвращает текущий стиль линии. Формат вызова процедуры в программе: GetLineSettings (StyleInfo); Переменной StyleInfo типа LineSettingsType возвращается текущий стиль линии. Тип LineSettingsType определен в модуле Graph следующим образом: type LineSettingsType = record LineStyle: Word; {тип линии} Pattern: Word; {образец} Thickness: Word; {толщина} end; Процедура SetWriteMode. Процедура SetWriteMode устанавливает способ взаимодействия вновь выводимых линий с уже существующем на экране изображением. Формат вызова процедуры в программе: SetWriteMode( Mode); Параметр Mode – выражение типа Integer. Если параметр Mode имеет значение 0, выводимые линии накладываются на существующее изображение обычным образом. Если значение 1, то это наложение осуществляется с применением логической операции XOR (исключающее ИЛИ): в точках пересечения выводимой линии с имеющимся на экране изображением светимость пикселей инвертируется на обратную, так что два, следующих друг за другом, вывода одной и той же линии на экран не изменят его вид. Режим, установленный процедурой SetWriteMode, распространяется на процедуры Drawpoly, Line, LineRel, LineTo и Rectangle. Для задания параметра Mode можно использовать следующие, определенные в модуле, константы: CopyPut = 0; {наложение операцией MOV} XoRPut = 1; {наложение операцией XoR} Пример 2. Программа выводит на экран разноцветные линии, выходящие из середины нижней границы экрана (веер). program Ris_2; uses Crt, Graph; var Driver, Mode: integer; color: word; x, y: integer; begin Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); Randomize; color:=0; repeat x:=random(GetMaxX); y:=random(GetMaxY); setcolor(color); line(320,480,x,y); inc(color); if color=GetMaxColor then color:=0; until keypressed; closegraph end.

5.2.5. Рисование многоугольников

Процедура Rectangle. Процедура Rectangle вычерчивает прямоугольник с указанными координатами . Формат вызова процедуры в программе: Rectangle (X1, Y1, X2, Y2); Переменные X1, Y1, X2, Y2 типа integer определяют координаты левого верхнего и правого нижнего концов диагонали прямоугольника. Прямоугольник вычерчивается с использованием текущего цвета и текущего стиля линий. Пример 2. Программа выводит на экран разноцветные линии, выходящие из середины нижней границы экрана (веер). program Ris_2_2; uses Crt, Graph; var Driver, Mode, e: integer; i, x1, y1, x2, y2, dx, dy: integer; begin Driver:= Detect; InitGraph(Driver,Mode,''); e:= GraphResult; if e grOk then Writeln(GraphErrorMsg(e)) else begin {определяем приращения сторон} dx:=GetMaxX div 20; dy:=GetMaxY div 20; {рисование 10 вложенных прямоугольников} for i:=0 to 9 do Rectangle (i*dx, i*dy, GetMaxX – i*dx, GetMaxY – i*dy); if ReadKey $0 then i:=ord(ReadKey); CloseGraph end end. Процедура DrawPoly. Процедура DrawPoly вычерчивает произвольную ломаную линию, заданную координатами точек излома. Формат вызова процедуры в программе: DrawPoly (N, Points); Переменная N типа Word определяет количество точек излома, включая обе крайние точки; переменная Points типа PointType, содержит координаты точек излома. Координаты точек излома задаются парой значений типа Word: первое определяет горизонтальную, второе - вертикальную координаты. Для них можно использовать следующий, определенный в модуле тип: type PointType = record x, y: Word end; При вычерчивании используется текущий цвет и текущий стиль линий.

5.2.6. Рисование дуг, окружностей, эллипсов

Процедура Circle. Процедура Circle вычерчивает окружность. Формат вызова процедуры в программе: Circle (X, Y, R); Переменные X, Y типа integer – координаты центра; переменная R типа Word – радиус в пикселях. Окружность выводится текущим цветом. Толщина линии устанавливается текущим стилем, вид линии всегда SolidLn. Процедура вычерчивает правильную окружность с учетом изменения линейного размера радиуса в зависимости от его направления относительно сторон графического экрана, т. е. с учетом коэффициента GetAspectRatio. В связи с этим параметр R определяет количество пикселей в горизонтальном направлении. Процедура Arc. Процедура Arc чертит дугу окружности. Формат вызова процедуры в программе: Arc (X, Y, BegA, EndA, R); Переменные X и Y типа integer – координаты центра; переменная R типа Word – радиус в пикселях; переменные BegA, EndA типа Word определяют начальный и конечный углы дуги. Углы отсчитываются против часовой стрелки и указываются в градусах. При вычерчивании дуги окружности используются те же соглашения относительно линий и радиуса, что и для процедуры Circle. Например, дуга 0 – 90, дуга 270 – 450. Процедура GetArcCoords. Процедура GetArcCoords возвращает координаты центра, начала и конца дуги. Формат вызова процедуры в программе: GetArcCoords(Coords); Переменная Coords типа ArcCoordsType, которая определяется следующим образом: type ArcCoordsType = record x,y:integer; {координаты центра} Xstart, Ystart: integer; {коорд. начала дуги} Xend, Yend: integer { коорд. конца дуги } end; Замечание. Совместное использование процедур Arc и GetArcCoords позволяет вычерчивать сопряжения двух прямых с помощью дуг (например, n – угольник со скругленными углами). Процедура Ellipse. Процедура Ellipse вычерчивает эллипсную дугу. Формат вызова процедуры в программе: Ellipse(X, Y, BegA, EndA, RX, RY); Переменные X и Y типа integer – координаты центра; переменные BegA, EndA типа Word определяют начальный и конечный углы дуги; переменные RX, RY типа Word - горизонтальные и вертикальные радиусы эллипса в пикселях. Углы отсчитываются против часовой стрелки и указываются в градусах. При вычерчивании дуги эллипса используются те же соглашения относительно линий и радиуса, что и для процедуры Circle. Если радиусы согласовать с учетом масштабного коэффициента GetAspectRatio, будет вычерчена правильная окружность. Rx = Ry Rx = 5 Ry AspectRatio Чем выше разрешение экрана, тем ближе к единице отношение сторон, тем меньше первы й график отличается от третьего.

5.2.7. Краски, палитры, заполнения

Процедура SetColor. Процедура SetColor устанавливает текущий цвет для выводимых линий и символов. Формат вызова процедуры в программе: SetColor(Color); Переменная Color типа Word - код цвета символов и линий из цветовой шкалы на стр.76 или установленной палитры. Функция GetMaxColor. Функция GetMaxColor возвращает значение типа Word, содержащее максимальный доступный код цвета, который можно использовать для обращения к SetColor. Формат обращения к функции в программе: G:=GetMaxColor; Переменная G типа Word. Процедура SetBkColor. Процедура SetBkColor устанавливает цвет фона. Формат вызова процедуры в программе: SetBkColor (Color); Переменная Color типа Word - код цвета фона из цветовой шкалы на стр.76 или установленной палитры. Замечание. После замены цвета фона на любой, отличный от 0 (Black) цвет, больше нельзя использовать цвет с кодом 0 как черный, он будет заменяться на цвет фона, так как процедуры модуля Graph интепретируют цвет с номером 0 как цвет фона. Это означает, в частности, что уже нельзя вернуть фону черный цвет. Функция GetBkColor. Функция GetBkColor возвращает значение типа Word, содержащее код текущего цвета фона. Формат обращения к функции в программе: G:=GetBkColor; Переменная G типа Word. Процедура SetPalette. Процедура SetPalette заменяет один из цветов палитры на новый цвет. Формат вызова процедуры в программе: SetPalette(N, Color); Здесь переменная N типа Word - номер цвета в палитре; переменная Color типа ShortInt - номер вновь устанавливаемого цвета. Данная процедура может работать только с адаптерами типа VGA, EGA. Процедура GetPalette. Процедура GetPalette возвращает размер и цвета текущей палитры. Формат вызова процедуры в программе: GetPalette(PaletteInfo); Здесь PaletteInfo - переменная типа PaletteType, возвращающая размер и цвета палитры. В модуле Graph определена константа Const MaxCollors=15; и тип Type PaletteType = Record Size : Word; {количество цветов в палитре} Colors : Array [0..MaxCollors] of ShortInt End; Процедура SetAllPalette. Процедура SetAllPalette изменяет одновременно несколько цветов палитры. Формат вызова процедуры в программе: SetAllPalette(Palette); Параметр Palette в заголовке процедуры описан как нетипизированный параметр. Первый байт этого параметра должен содержать длину палитры, остальные байты - номера вновь устанавливаемых цветов в диапазоне от -1 до MaxColors. Код -1 означает, что соответствующий цвет исходной палитры не меняется. Функция GetPaletteSize. Функция GetPaletteSize возвращает значение типа Integer, содержащее размер палитры. Формат обращения к функции в программе: P:= GetPaletteSize; Переменная P типа Integer. Процедура GetDefaultPalette. Процедура GetDefaltPalette возвращает структуру палитры, устанавливаемую по умолчанию. Формат вызова процедуры в программе: GetDefaltPalette (Palette); Здесь Palette переменная типа PaletteType, которой возвращаются размеры и цвета палитры. Процедура SetFillStyle. Процедура SetFillStyle устанавливает стиль (тип и цвет) заполнения. Формат вызова процедуры в программе: SetFillStyle (Fill, Color); Здесь переменная Fill - тип заполнения, переменная Color - цвет заполнения. Переменные Fill и Color типа Word. С помощью выбранного стиля заполнения можно покрывать какие - либо фрагменты изображения периодически повторяющимся узором. Для указания типа заполнения используются следующие предварительно определенные константы: const EmptyFill = 0; {Заполнение фоном (узор отсутствует)} SolidFill = 1; {Сплошное заполнение} LineFill = 2; {Заполнение ------------} LtSlashFill = 3; {Заполнние ///////////////////} SlashFill = 4; {Заполнение утолщенными ////} BkSlashFill = 5; {Заполнение утолщенными \\\\} LtBkSlashFill = 6; {Заполнение \\\\\\\\\\\\\\\\\\} HatchFill = 7; {Заполнение + + + + + +} XHatchFill = 8; {Заполнение xxxxxxxxxx} InterleaveFill = 9; {Заполнение в прямоугольную клеточку} WideDotFill =10; {Заполнение редкими точками} CloseDotFill =11; {Заполнение частыми точками} UserFill =12; {Узор определяется пользователем} Процедура SetFillPattern. Процедура SetFillPattern устанавливает образец рисунка и цвет штриховки. Формат вызова процедуры в программе: SetFillPattern(Pattern, Color); Переменная Pattern типа FillPatternType, переменная Color типа Word - код цвета штриховки. Образец рисунка задается в виде матрицы из 8 на 8 пикселей и может быть представлен массивом из 8 байт следующего типа: Type FillPatternType = array [1..8] of Byte; Каждый разряд любого из этих байтов управляет светимостью пикселя. Процедура GetFillPattern. Процедура GetFillPattern возвращает образец заполнения, установленный процедурой, описанной выше. Формат вызова процедуры в программе: GetFillPattern(Pattern); Переменная Pattern типа FillPatternType. Процедура GetFillSettings. Процедура GetFillSettings возвращает текущий стиль заполнения. Формат вызова процедуры в программе: GetFillSettings(PattInfo); Переменная PattInfo типа FillSettingsType. В модуле Graph определен тип: Type FillSettingsType = record Pattern: Word; Color: Word end; Поля Pattern и Color в этой записи имеют то же назначение, что и аналогичные параметры при обращении к процедуре SetFillStyle. Процедура FloodFill. Процедура FloodFill заполняет произвольную замкнутую фигуру, используя текущий стиль заполнения. Формат вызова процедуры в программе: FloodFill(X, Y, Border); Переменные X, Y типа Integer - координаты любой точки внутри замкнутой фигуры; переменная Border типа Word - цвет граничной линии. Если фигура не замкнута, заполнение разольется по всему экрану. Процедура Bar. Процедура Bar заполняет прямоугольную область экрана текущим стилем и цветом. Формат вызова процедуры в программе: Bar(X1, Y1, X2, Y2); Переменные X1, Y1, X2, Y2 типа Integer - координаты концов диагонали прямоугольника. Процедура Bar3D. Процедура Bar3D вычерчивает трехмерное изображение параллелепипеда и закрашивает его переднюю грань текущим стилем и цветом. Формат вызова процедуры в программе: Bar3D(X1, Y1, X2, Y2, Depth, Top); Переменные X1, Y1, X2, Y2 типа Integer - координаты концов диагонали прямоугольника. Переменная Depth типа Integer - третье измерение трехмерного изображения в пикселях; переменная Top типа Boolean - способ изображения верхней грани. Если параметр Top имеет значение True, верхняя грань параллелепипеда вычерчивается, в противном случае не вычерчивается. Процедура FillPoly. Процедура FillPoly обводит линией и закрашивает замкнутый многоугольник. Формат вызова процедуры в программе: FillPoly(N, Coords); Переменная N типа Word - количество вершин замкнутого мноугольника; переменная Coords типа PointType содержит координаты вершин. Координаты вершин задаются парой значений типа Integer: первое определяет горизонтальную, второе - вертикальную координаты. Для них можно использовать следующий, определенный в модуле тип: type PointType = record X, Y: Integer; end; Стиль и цвет линии контура задаются процедурами SetLineStyle и SetColor, тип и цвет заливки - процедурой SetFillStyle. Пример 3. Программа выводит на экран пятиугольник и закрашивает его голубым цветом (при нажатии клавиши ввода), красным в полоску. program Ris_3;{мноугольник} uses Crt, Graph; type point = record x, y: integer end; const points: array[1..6] of point = ((x: 120; y: 20), (x: 220; y: 20), (x: 320; y: 120), (x: 220; y: 320), (x: 120; y: 200), (x: 120; y: 20)); var Driver, Mode: integer; color: word; begin Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); SetColor(4); DrawPoly(6,points); readln; SetFillStyle(1,11); FloodFill(130,25,4); readln; SetFillStyle(3,12); FillPoly(6,points); readln; CloseGraph end. Пример 4. Программа выводит на экран рисунок – паровозик. program Ris_4; uses Graph, crt; var Driver, Mode, e: integer; color: word; procedure paravoz; begin {паравозик} SetBkColor(7); SetFillStyle(1,4); Rectangle(80,240,420,360); FloodFill(90,245,15); SetFillStyle(1,2); Bar(420,120,560,360); SetFillStyle(1,15);Bar(450,150,530,230); SetFillStyle(1,4); Bar(130,240,180,180); end; procedure kolesa; var x: integer; begin {колеса} x:=180; SetFillStyle(1,1); While x<= 520 do begin circle(x,390,30); FloodFill(x,390,15); x:=x+70 end; end; procedure dim; var x,y,r:integer; begin {дым} y:=120; x:=160; r:=25; SetColor(15); while y>=10 do begin circle(x,y,r); x:=x+20; y:=y-20; r:=r-4; end end; begin Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); e:=GraphResult; if e0 then writeln('ошибка инициализации -', e); Color:=15; paravoz; kolesa;dim; delay(30000){задержка изображения на экране} end. Процедура FillEllipse. Процедура FillEllipse обводит линией и заполняет эллипс. Формат вызова процедуры в программе: FillEllipse(X, Y, RX, RY); Переменные X,Y типа Integer - координаты центра эллипса, переменные RX, RY типа Word - горизонтальный и вертикальный радиусы эллипса в пикселях. Стиль и цвет линии контура эллипса задаются процедурами SetLineStyle и SetColor, тип и цвет заливки - процедурой SetFillStyle. Процедура Sector. Процедура Sector вычерчивает и заполняет эллипсный сектор. Формат вызова процедуры в программе: Sector(X, Y, BegA, EndA, RX, RY); Переменные X,Y типа Integer - координаты центра эллипса, переменные BegA, EndA типа Word определяют начальный и конечный углы дуги, переменные RX, RY типа Word - горизонтальный и вертикальный радиусы эллипса в пикселях. Процедура PieSlice. Процедура PieSlice вычерчивает и заполняет сектор окружности. Формат вызова процедуры в программе: PieSlice(X, Y, BegA, EndA, R); В отличие от процедуры Sector указывается всего один горизонтальный радиус R, остальные параметры аналогичны параметрам процедуры Sector. Пример 5. Программа выводит на экран окружность, эллипс, дугу и сектор. program Ris_5; uses Crt, Graph; var Driver, Mode: integer; color: word; x, y: integer; xr,yr,r: word; angl1,angl2: word; begin Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); SetColor(4); x:=100; y:=200; r:=50; SetFillStyle(1,11); Circle(x,y,r); FloodFill(100,200,4); readln; x:=250; xr:=50; yr:=100; r:=100; SetFillStyle(1,12); Ellipse(x,y,0,360,xr,yr); FloodFill(250,200,4); readln; SetFillStyle(3,12); FillEllipse(530,140,60,90); readln; Arc(500,300,0,100,50); readln; SetColor(10); SetFillStyle(1,10); PieSlice(430,400,10,100,70); readln; CloseGraph end.

5.2.8 Вывод текста

Специально для графического режима разработаны процедуры и функции, обеспечивающие вывод текстовых сообщений различными шрифтами в горизонтальном и вертикальном направлениях. Процедура OutText. Процедура OutText выводит текстовую строку, начиная с текущего положения указателя. Формат вызова процедуры в программе: OutText(Txt); Переменная Txt типа string - выводимая строка. При горизонтальном направлении вывода указатель смещается в конец выведенного текста, при вертикальном - не меняет своего положения. Если текст выходит за границы экрана, то при использовании штриховых шрифтов он отсекается, а в случае стандартного шрифта не выводится. Процедура OutTextXY. Процедура OutTextXY выводит строку с заданного места. Формат вызова процедуры в программе: OutTextXY(X, Y ,Txt); Переменные X,Y типа Integer - координаты точки начала вывода текста, Txt - переменная или костанта типа string (выводимая строка). Замечание. В модуле Graph нет процедур, предназначенных для вывода численных данных. Для вывода данных такого типа нужно сначала преобразовать число в строку с помощью процедуры Str, а затем посредством операции конкатенации подключить ее к выводимой строке Txt в процедуре OutTextXY. Процедура SetTextStyle. Процедура SetTextStyle устанавливает стиль текстового вывода на графический экран. Формат вызова процедуры в программе: SetTextStyle(Font, Direct, Size); Переменные Font, Direct, Size типа Word. Font - код шрифта; Direct - код направления; Size - код размера шрифта. Для указания кода шрифта можно использовать следующие, предварительно определенные константы: const DefaultFont =0; {Точечный шрифт 8 на 8} TriplexFont =1; {Утроенный шрифт TRIP.CHR} SmallFont =2; {Уменьшенный шрифт LITT.CHR} SansSerifFont =3; {Прямой шрифт SANS.CHR} GothicFont =4; {Готический шрифт GOTH.CHR} Шрифт DefaultFont создается графическим драйвером в момент инициации графики. Для задания направления выдачи текста можно использовать константы: const HorizDir =0; {Слева направо} VertDir =1; {Снизу вверх} Процедура SetTextJustify. Процедура SetTextJustify задает вырав-нивание выводимого текста по отношению к текущему положению указателя или к заданным координатам. Формат вызова процедуры в программе: SetTextJustify(Horiz, Vert); Переменные Horiz, Vert типа Word. Horiz горизонтальное , Vert - вертикальное выравнивание. Выравнивание определяет как будет располагаться текст - левее или правее указанного места, выше, ниже или по центру. Здесь можно использовать следующие константы: const LeftText =0; {Указатель слева от текста} CenterText =1; {Симметрично слева и справа, сверху и снизу} RightText =2; {Указатель справа от текста} BottomText =0; {Указатель снизу от текста} TopText =2; {Указатель сверху от текста} Процедура SetUserCharSize. Процедура SetUserCharSize изменяет размер выводимых символов в соответствии с заданными пропорциями. Формат вызова процедуры в программе: SetUserCharSize(X1, X2, Y1, Y2); Переменные X1..Y2 - выражения типа Word, определяющие пропорции по горизонтали и вертикали. Функция TextWidth. Функция TextWidth возвращает длину выводимой текстовой строки в пикселях. Формат обращения к функции в программе: N:=TextWidth(Txt); Переменная N типа Word, переменная Txt типа string. Функция TextHeight. Функция TextHeight возвращает высоту шрифта в пикселях. Формат обращения к функции в программе: N:=TextHeight(Txt); Переменная N типа Word, переменная Txt типа string. Пример 6. Программа выводит на экран пирамиду. program Ris_6;{пирамида} uses Crt, Graph; var Driver, Mode: integer; color: word; x,y: integer; z: string; begin Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); Color:=15; z:='PIRAMIDA'; SetTextStyle(0, 0, 3); OutTextXY(100, 10, z); SetLineStyle(3, 0, 1); Line(320, 40, 320, 335); {SO} Line(200, 300, 450, 300); {AB} SetLineStyle(0, 0, 1); Line(320, 40, 200, 300); {SA} Line(320, 40, 450, 300); {SB} Line(320, 40, 360, 400); {SC} Line(200, 300, 360, 400); {AC} Line(360, 400, 450, 300); {BC} SetTextStyle(1, 0, 2); OutTextXY(325, 20, 'S'); OutTextXY(460, 300, 'B'); OutTextXY(360, 410, 'C'); OutTextXY(190, 300, 'A'); OutTextXY(300, 320, 'O'); Delay(50000) end. Пример 7. Программа выводит на экран график функции. program Ris_7; uses Crt, Graph; var Driver, Mode: integer; color: word; i,xg,yg: integer; x: real; begin Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); SetColor(15); SetBkColor(0); Line(10,90,250,90); Line(10,20,10,160); x:=0; SetLineStyle(0,0,3); for i:=0 to 190 do begin xg:=10+round(95/pi*x); yg:=90-round(50*sin(x)); PutPixel(xg,yg,11); x:=x+pi/95 end; OutTextXY(15,25,'Y'); OutTextXY(255,90,'X'); OutTextXY(100,40,'y=sinx'); Readln; CloseGraph end. Пример 8. Программа выводит следующее изображение: на рисунке большая окружность окружена четырьмя поменьше, каждая из которых в свою очередь окружена четырьмя окружностями с ещё меньшими радиусами. program Ris_8; uses Crt, Graph; var Driver, Mode: integer; color: word; x,y,n,r,r1: integer; k1,k2:real; procedure Picture(x,y,r,r1,n:integer); var x1,y1:integer; i:integer; begin if n>0 then begin circle(x,y,r);r1:=trunc(r*k2); for i:=1 to 4 do begin x1:=trunc(x+r1*cos(pi/2*i)); y1:=trunc(y+r1*sin(pi/2*i)); picture(x1,y1,trunc(r*k1),r1,n-1); end; end; end; begin Write('Введите количество уровней n – '); Readln(n); Write('Введите радиус первой окружности r – '); Readln(r); x:=600 div 2; y:=400 div 2; k1:=0.3; k2:=2; Driver:= Detect; InitGraph(Driver,Mode,'c:\bp\bgi'); Picture(x,y,r,r1,n); readln; CloseGraph end.


edu 2018 год. Все права принадлежат их авторам! Главная