Министерство образования Российской Федерации Ростовский ордена Трудового Красного Знамени государственный университет
...
5 downloads
274 Views
513KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования Российской Федерации Ростовский ордена Трудового Красного Знамени государственный университет
И.Г. Спивак Методические указания по курсу "Основы программирования" для студентов вечернего отделения механико-математического факультета
Модуль Graph
Ростов - на - Дону 2000
Печатается по решению заседания кафедры прикладной математики и программирования от 10 февраля 2000 г.
© И.Г. Спивак, 2000
3 Содержание Модуль Graph........................................................................................................... 4 Процедуры и функции включения и выключения графического режима работы экрана ....................................................................................................... 4 Процедуры и функции, связанные с определением окон и страниц вывода, а также координатами указателя ......................................................................... 10 Процедуры и функции, устанавливающие краски палитры и заполнения .. 13 Процедуры и функции рисования точек, линий и фигур............................... 17 Графический вывод текста ................................................................................ 20 Примеры практического применения возможностей модуля Graph ............ 22 Литература .......................................................................................................... 29
4 Модуль Graph
Модуль Graph реализует библиотеку подпрограмм, состоящую из графических процедур и функций самого широкого профиля. Он позволяет включать в оформление вашего продукта несколько видов заполнения и типов линий, использовать различные шрифты, изменяя их начертание и расположение на экране. Все стандартные средства модуля Graph становятся доступны пользователю после его подключения к программе в разделе Uses: Uses Graph; При компилировании программы, которая использует модуль Graph, нет необходимости использовать внешние файлы ( при условии, что есть исходный текст программы, компилятор и возможность доступа к стандартным модулям в TURBO.TPL). Для запуска программы, которая использует модуль Graph, в дополнение к созданному .exe-файлу необходимо иметь один или несколько графических драйверов (.bgi-файлы). Если программ использует какие-либо штриховые шрифты, то потребуются также файлы, их содержащие (.chr-файлы). Графические драйверы обеспечивают работу с соответствующими им графическими адаптерами. Каждый драйвер находится в отдельном файле на диске и содержит код и данные.
Процедуры и функции включения и выключения графического режима работы экрана
Во время выполнения программы процедура InitGraph определяет графическое аппаратное обеспечение, загружает и
инициализирует
соответствующий графический драйвер, переводит систему в графический
5 режим и передаёт контроль вызванной программе. Заголовок этой процедуры выглядит следующим образом Procedure InitGraph (var
Driver, Mode : Integer; Path : String);,
где переменные Driver определяет тип графического драйвера, Mode задаёт режим работы графического адаптера, а Path содержит имя файла драйвера и маршрут его поиска. Пусть, например, драйвер CGA.BGI находится в каталоге TP\BGI на диске C и устанавливается режим работы 320х200 с палитрой 2. Тогда обращение к процедуре будет таким: Uses Graph; Var Driver, Mode : Integer; Begin Driver := CGA; Mode
:= CGAC2;
InitGraph (Driver, Mode, 'C:\TP\BGI'); ………………………………………… End.
Если тип адаптера ПК неизвестен или если программа рассчитана на работу с любым адаптером, используется обращение к процедуре с автоматическим определением типа драйвера: Driver := Detect; InitGraph (Driver, Mode, 'C:\TP\BGI');
После такого обращения устанавливается графический режим работы экрана, а переменным Driver и Mode содержат целочисленные значения, определяющие тип драйвера и режим его работы. Процедура, имеющая заголовок Procedure CloseGraph; освобождает
память
от
предыдущий видеорежим.
графического
драйвера
и
восстанавливает
6 Функция GraphResult возвращает значение типа Integer, в котором закодирован результат последнего обращения к графическим процедурам. Если ошибка не обнаружена, значением функции будет ноль, в противном случае - отрицательное число, смысл которого представлен в таблице 1. После обращения к этой функции признак ошибки сбрасывается, поэтому повторное обращение к ней вернёт ноль, поэтому результат работы функции следует сохранять во вспомогательной переменной. Таблица 1. Значения результатов работы функции GraphResult Константа
Значение
Смысл
GrOk
= 0
Нет ошибок
GrInitGraph
= -1
Не инициирован графический режим
GrNotDetect
= -2
Не определён тип драйвера
GrFileNotFind
= -3
Не найден графический драйвер
GrInvalidDriver
= -4
Неправильный тип драйвера
GrNoLoadMem
= -5
Нет памяти для размещения драйвера
GrNoScanMem
= -6
Нет памяти для просмотра областей
GrNoFloodMem
= -7
Нет памяти для закраски областей
GrFontNotFound
= -8
Не найден файл со шрифтом
GrNoFontMem
= -9
Нет памяти для размещения шрифта.
GrInvalidMode
= -10
Неправильный графический режим
GrError
= -11
Общая ошибка
GrIOError
= -12
Ошибка ввода-вывода
GrInvalidFont
= -13
Неправильный формат шрифта
GrInvalidFontNum
= -14
Неправильный номер шрифта
7 Функция GraphErrorMsg возвращает значение типа String, в котором по указанному коду ошибки даётся соответствующее текстовое сообщение. Заголовок функции выгдядит следующим образом: Function GraphErrorMsg (Code: Integer): String; где Code - код ошибки, возвращаемый функцией GraphResult. Чаще всего причиной возникновения ошибки при обращении к процедуре InitGraph является неправильное указание местоположения файла с драйвером графического адаптера. Эта настройка осуществляется заданием маршрута поиска нужного файла в имени драйвера при вызове процедуры
InitGraph.
Для
упрощения
вышей
работы
скопируйте
используемые файлы графических драйверов в ваш рабочий каталог. В этом случае возможно обращение к процедуре InitGraph с параметром Path в виде пустой строки (InitGraph (Driver, Mode, '');). Процедура RestoreCRTMode (процедура не имеет параметров) служит для кратковременного возврата в текстовый режим. В отличие от процедуры CloseGraph не сбрасываются установленные параметры графического режима
и
не
освобождается
память,
выделенная
для
размещения
графического драйвера. Функция GetGraphMode (без параметров) возвращает значение типа Integer, в котором содержится код установленного режима работы графического адаптера. Процедура SetGraphMode устанавливает новый графический режим работы адаптера. Заголовок процедуры имеет вид: Procedure SetGraphMode (Mode: Integer); где Mode - код устанавливаемого режима. Следующая программа иллюстрирует переход из графического режима в текстовый и обратно:
8 Uses Graph; Var Driver, Mode, Error : Integer; Begin (* Инициируем графический режим *) Driver := Detect; InitGraph(Driver, Mode, ''); Error := Graph Result; (* Запоминаем результат инициации *) If Error grOk
(*
Проверяем наличие ошибки
then Writeln(GraphErrorMsg(Error)(*
Есть ошибка
*) *)
Else Begin Writeln('Это графический режим'); Writeln('Нажмите "Enter"…':20); Readln; (* Возврат в текстовый режим *) RestoreCrtMode; Writeln(' Это текстовый режим'); Readln; (* Возврат в графический режим *) SetGraphMode(GetGraphMode); Writeln('Это опять графический режим'); Readln; CloseGraph End End.
Процедура DetectGraph возвращает тип драйвера и режим его работы. Заголовок процедуры имеет вид: Procedure DetectGraph (var Driver, Mode: Integer); здесь Driver - тип драйвера; Mode - режим работы. В отличие от функции GetGraphMode описываемая процедура возвращает в переменной Mode максимально возможный для данного адаптера номер графического режима.
9 Функция GetDriverName (без параметров) возвращает значение типа String, содержащее имя загруженного графического драйвера. Заголовок: Функция GetMaxMode (без параметров) возвращает значение типа Integer, содержащее количество возможных режимов работы адаптера. Функция GetModeName Возвращает значение типа String, содержащее разрешение экрана и имя режима работы адаптера по его номеру. Заголовок функции выглядит следующим образом: Function GetModName (ModNumber: Integer): String; где ModNumber - номер режима. Процедура GetModeRange возвращает диапазон возможных режимов работы заданного графического адаптера. Заголовок процедуры: Procedure GetModeRange (Drv: Integer; var Min, Max: Integer); где Drv - тип адаптера; Min - переменная типа Integer, в которой возвращается нижнее возможное значение номера режима; Max - переменная того же типа, верхнее значение номера. Если задано неправильное значение параметра Drv, процедура вернёт в обеих переменных значение - 1. Перед обращением к процедуре можно не устанавливать графический режим работы экрана. Следующая программа выводит на экран названия всех адаптеров и диапазоны возможных номеров режимов их работы. Uses Graph; Var D, L, H : Integer; Const N : array[1..11] of String[8] = ( 'CGA
', 'MCGA
'IBM8514 ', 'Ошибка
', 'EGA
'HercMono', 'ATT400
', ',
'EGA64 'VGA
', 'EGAMono', ', 'PC3270
');
Begin Writeln('Адаптер For D := 1 to 11 do Begin
Мин.
Макс.');
',
10 GetModeRange(D,L,H); Writeln(N[D], L:7, H:10) End; End.
Процедуры и функции, связанные с определением окон и страниц вывода, а также координатами указателя
Многие графические процедуры и функции используют указатель текущей позиции на экране, который в отличие от текстового курсора невидим. Верхний левый угол графического экрана имеет координаты (0,0). Значение X (номера столбца) увеличивается слева направо. Значение Y (номера строки) - сверху вниз. Графические адаптеры поддерживают размещение различного количества точек на экране. Например, для адаптера CGA в режиме 320х200 координаты экрана для каждого из четырёх углов приведены в следующей таблице. Таблица 2. Координаты углов экрана (0,0)
левый верхний угол
(319,0) правый верхний угол
(0,199)
левый нижний угол
(319,199)
правый нижний угол
Многие графические системы поддерживают текущий указатель CP. В них указатель имеет те же свойства, что и курсор в текстовом режиме, но является невидимым. Функции GetMaxX и GetMaxY возвращают значения типа Word, содержащие максимальные координаты экрана в текущем режиме работы соответственно по горизонтали и вертикали. Функции GetX и GetY возвращают значения типа Integer, содержащие текущие координаты указателя соответственно по горизонтали и вертикали.
11 Координаты определяются относительно левого верхнего угла окна или экрана. Процедура
SetViewPort
устанавливает
прямоугольное
окно
на
графическом экране. Её заголовок имеет вид: Procedure SetViewPort (X1,Y1,X2,Y2 : Integer; ClipOn: Boolean); где X1…Y2 - координаты левого верхнего (X1,Y1) и правого нижнего (X2,Y2) углов окна; ClipOn - выражение типа Boolean, определяющее "отсечку" не умещающихся в окне элементов изображения. Координаты окна всегда задаются относительно левого верхнего угла экрана. Если параметр ClipOn имеет значение True, элементы изображения, не умещающиеся в пределах окна, отсекаются, в противном случае границы окна игнорируются. Для управления этим параметром можно использовать такие определённые в модуле константы: const ClipOn = True;
{Включить отсечку}
ClipOff = False;
{Не включать отсечку}
Процедура GetViewSettings возвращает координаты и признак отсечки текущего графического окна. Она имеет следующий заголовок: Procedure GetViewSettings (var ViewInfo: ViewPortType); где ViewInfo - переменная типа ViewPortType. Этот тип в модуле Graph определён как запись: type ViewPortType = record x1,y1,x2,y2: Clip
:
Integer; (*Координаты окна*) Boolean (*Признак отсечки *)
end;
Процедура MoveTo с заголовком Procedure MoveTo ( X,Y: Integer);
12 устанавливает новое текущее положение указателя. Парметры X,Y - новые координаты
указателя
соответственно
по
горизонтали
и
вертикали.
Координаты определяются относительно левого верхнего угла окна или, если окно не установлено, экрана. Процедура MoveRel устанавливает новое положение указателя в относительных координатах. Procedure MoveRel (DX,DY: Integer); где DX,DY - приращения новых координат указателя соответственно по горизонтали
и
вертикали.
Приращения
задаются
относительно
того
положения, которое занимал указатель к моменту обращения к процедуре. Процедура ClearDevice (не имеет параметров) очищает графический экран. После обращения к процедуре указатель устанавливается в левый верхний угол экрана, а сам экран заполняется цветом фона, заданным процедурой SetBkColor. Процедура ClearViewPort (без параметров) очищает графическое окно, а если окно не определено к этому моменту - весь экран. При очистке окно заполняется цветом с номером 0 из текущей палитры. Указатель перемещается в левый верхний угол окна. Процедура GetAspectRatio (заголовок: Procedure GetAspectRatio (var X,Y: Word);) возвращает два числа, позволяющие оценить соотношение сторон графического экрана в пикселах. Найденный с их помощью коэффициент
может
использоваться
при
построении
правильных
геометрических фигур, таких как окружности, квадраты и т.п. Например, если Вы хотите построить квадрат со стороной L пиксел по вертикали, Вы должны использовать операторы GetAspectRatio (Xasp,Yasp); Rectangle (x1,y1,x1+L*Round (Yasp/Xasp),y1+L); а если L определяет длину квадрата по горизонтали, то используется оператор
13 Rectangle (x1,y1,x1+L, y1+L*Round (Xasp/Yasp)); Процедура SetAspectRatio устанавливает масштабный коэффициент отношения сторон графического экрана. Её заголовок выглядит так: Procedure SetAspectRatio (X,Y: Word); где X,Y - устанавливаемые соотношения сторон. Процедура
SetActivePage
(заголовок:
Procedure
SetActivePage
(PageNum: Word);) делает активной указанную как передаваемый параметр страницу видеопамяти. Эта процедура может использоваться только с адаптерами, поддерживающими многостраничную работу (EGA, VGA и т.п.)Фактически процедура просто переадресует графический вывод в другую область видеопамяти, однако вывод текстов с помощью операторов Write или WriteLn всегда осуществляется только на страницу, которая является видимой в данный момент (активная страница может быть невидимой). Нумерация страниц начинается с нуля. Процедура SetVisualPage делает видимой страницу с указанным номером. Заголовок процедуры выглядит следующим образом: Procedure SetVisualPage (PageNum: Word); где PageNum - номер страницы. Эта процедура также может использоваться только с адаптерами, поддерживающими многостраничную работу (EGA, VGA и т. п.). Причём нумерация страниц начинается с нуля.
Процедуры и функции, устанавливающие краски палитры и заполнения
При установке графического режима параметры выводимых цветов, т.е. доступную цветовую гамму, называемую палитрой. Цвета палитры пронумерованы. Чтобы определить размер и цвета текущей палитры используют процедуру Procedure GetPallette (var Palette : PaletterType);.
14 Тип PaletterType определяется в модуле Graph следующим образом Const MaxColors = 15; Type PaletteType = record Size
: Word; {Количество цветов в палитре}
Color : array [0..MaxColors] of ShortInt {Номера входящих в палитру цветов} end;
Первоначальное
размещение
цветов
в
палитре
соответствует
последовательности их описания константами Black, … ,White. В процессе работы программа может изменять текущую палитру. Например, следующая процедура заменяет цветов палитры под номером N на новый цвет Color. Procedure SetPalette (N : Word; Color : ShortInt); После обращения к процедуре все фрагменты изображения, выполненные цветом N, изменят его на Color. Цвет с индексом 0 соответствует цвету фона и также может изменяться с помощью данной процедуры. Аналогичные действия выполняет следующая процедура, позволяющая одновременно изменять несколько цветов палитры. Procedure SetAllPalette (var Palette); Для корректной работы процедуры ей следует передать нетипизированный параметр, первый байт которого должен содержать длину палитры N, а остальные N байт - номера устанавливаемых цветов. Для определения текущего размера палитры используют результат, возвращаемый функцией Function GetPaletterSize : Integer; Для
того,
чтобы
получить
структуру
палитры,
устанавливаемую
автоматически, используйте процедуру, возвращающую размер и цвета палитры Procedure GetDefaultPalette (var Palette : PaletteType);.
15 Чтобы установить текущий цвет выводимых линий ( константы модуля Graph соответствуют константам, определяющим цвет, модуля CRT) нужно воспользоваться процедурой Procedure SetColor (Color : Word); Максимальное значение, которое можно использовать при обращении к этой процедуре возвращает функция Function GetMaxColor : Word; Для того, чтобы определить, каким цветом выводятся линии на экране, нужно активизировать функцию Function GetColor : Word; возвращающую необходимое значение. Существует установить цвет
также Color
аналогичная
группа
команд,
и определить текущий цвет
позволяющих
фона, на котором
выводятся символы. Это процедура Procedure SetBkColor (Color : Word); и функция Function GetBkColor : Word; Процедура
SetFillStyle
устанавливает
тип
и
цвет
заполнения
фрагментов изображения периодически повторяющимся узором Procedure SetFillStyle (Fill, Color : Word); где Fill - тип заполнения, а Color - его цвет. Для указания типа заполнения можно использовать константы приведённые в таблице 3. Процедура
GetFillPattern
возвращает
образец
заполнения,
установленный ранее процедурой SetFillPatern. Заголовок этой процедуры описывается следующим образом Procedure GetFillPattern (var Pattern : FillPatternType); Здесь Pattern - переменная типа FillPatternType, в которой возвращается образец заполнения.
16 Таблица 3. Значения констант, используемых для указания типа заполнения 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; {Узор определяется пользователем}
Процедура FloodFill заполняет произвоольную замкнутую фигуру, используя текущий стиль заполнения (узор и цвет) Procedure FloodFill (X,Y : Integer; Border : Word); где X,Y - координаты любой точки внутри замкнутой линии, а Border - цвет граничной линии. Если фигура незамкнута, заполнение "разольётся" по всему экрану. Процедура Bar заполняет прямоугольную область экрана с заданными координатами левого верхнего и правого нижнего угла. Её заголовок: Procedure Bar (X1,Y1,X2,Y2 : Integer); Процедура закрашивает прямоугольник текущим образцом и текущим цветом, которые устанавливается процедурой SetFillStyle. Процедура Bar не обводит закрашиваемый прямоугольник.
17 Следующая
процедура
вычерчивает
трехмерное
изображение
параллелепипеда и закрашивает его переднюю грань: Procedure Bar3D (X1,Y1,X2,Y2, Depth : Integer; Top : Boolean); где X1,…,Y2 - координаты левого верхнего и правого нижнего углов передней грани, Depth - глубина параллелепипеда в пикселах. Если Top равен true, то верхняя грань параллелепипеда вычерчивается, в противном случае не вычерчивается. В качестве значения этого параметра можно использовать значение одной из констант модуля Graph: const TopOn = True; TopOff = False; Описанная процедура обычно применяется при построении столбиковых диаграмм. Следует учесть, что за не закрашенными гранями параллелепипеда могут быть видны другие элементы изображения.
Процедуры и функции рисования точек, линий и фигур
Процедура PutPixel (заголовок Procedure PutPixel (X,Y:
Integer;
Color: Word);) выводит заданным цветом точку по указанным координатам. Параметрами процедуры являются X,Y - координаты точки; Color - её цвет. Координаты точки задаются относительно левого верхнего угла окна или, если окно не установлено, относительно левого верхнего угла экрана. Функция GetPixel возвращает значение типа Word, содержащее цвет пиксела с указанными координатами. Данная функция описана следующим образом: Function GetPixel (X,Y: Integer): Word; где X,Y - координаты пиксела. Процедура Line с заголовком Procedure Line (X1,Y1,X2,Y2: Integer); вычерчивает линию с указанными координатами начала (X1,Y1) и конца (X2,Y2).
18 Процедура LineTo вычерчивает линию от текущего положения указателя
до
положения,
заданного
его
новыми
координатами,
передаваемыми в качестве параметров. Заголовок функции описан ниже: Procedure LineTo (X,Y : Integer);. Процедура LineRel (заголовок Procedure LineRel (DX, DY : Integer);) также вычерчивает линию от текущего положения указателя до положения, задаваемого переданными в качестве параметров приращениями координат. С помощью трёх последних процедур для вычерчивания линии используются текущие цвет и стиль. Для установки нового стиля линий (он применяется и при рисовании кривых и контуров фигур) используется процедура с заголовком Procedure SetLineStyle (Type, Pattern, Thick : Word); где Type - тип , Pattern - образец, Thick - толщина линии. Для установки типа линии используется значение одной из следующих констант: SolidLn
= 0; Сплошная линия
DotteLn
= 1; Точечная линия
CenterLn
= 2; Штрих-пунктирная линия
DashedLn
= 3; Пунктирная линия
UserBitLn
= 4; Узор
линии
определяет
пользователь
Параметр Pattern учитывается только для линий, вид которых определяет пользователь. При этом два байта этого параметра определяют образец линии: бит, равный единице, соответствует светящемуся пикселу, а нолю несветящемуся. Заданный таким образом отрезок линии длиной в 16 пиксел повторяется по всей длине. Параметр Thik принимает одно из значений: NormWidth = 1 - толщина в один пиксел или ThickWidth = 3 - толщина в три пиксела. Для того, чтобы определить текущие установки стиля линий воспользуйтесь процедурой Procedure GetLineSettings (var StyleInfo : LineSettingsType);,
19 через параметр которой возвращается текущий стиль линии. Тип этого параметра определяется в модуле Graph так: type LineSettingsType = record LineStyle : Word; (*Тип линии*) Pattern
: Word; (* Образец *)
Thickness: Word; (* Толщина
*)
end;
Для вычерчивания прямоугольника текущем цветом и стилем линий используется процедура, использующая в качестве параметров координаты левого верхнего и правого нижнего углов прямоугольника: Procedure Rectangle (X1, Y1, X2, Y2 : Integer); Для вычерчивания окружности с центром в точке с координатами X,Y заданного радиуса R используется процедура, заголовок которой выглядит следующим образом Procedure Circle (X,Y : Integer; R : Word); Процедура вычерчивает правильную окружность с учётом изменения линейного размера радиуса в зависимости от его направления относительно сторон графического экрана. В связи с этим параметр R определяет количество пиксел в горизонтальном направлении. Процедура с заголовком Procedure Arc (X,Y : Integer; Bega, EndA, R : Word); вычерчивает дугу окружности с центром в точке (X,Y) радиуса R, где BegA, EndA - начальный и конечный углы дуги. Углы отсчитываются против часовой стрелки и указываются в градусах. Нулевой угол соответствует горизонтальному направлению вектора слева направо. Если задать значения начального угла 0 и конечного - 359, то будет выведена полная окружность. Для вычерчивания эллипсной дуги, имеющей центр в точке с координатами (X,Y), начиная с угла BegA, а кончая - EndA, с
20 горизонтальным и вертикальным радиусом Rx и
Ry соответственно,
используется процедура со следующим форматом заголовка: Procedure Ellipse (X,Y : Integer; BegA, EndA, Rx, Ry : Word); При вычерчивании дуги используются текущие цвет и стиль линий, углы также отсчитываются против часовой стрелки в градусах. В графическом режиме для вывода текста используется растровый шрифт размером 8х8 и несколько штриховых шрифтов. Символ в растровом шрифте определяется матрицей, имеющей 8х8 элементов растра. Штриховой шрифт определяется серией векторов, которые сообщают графической системе, как рисуется шрифт. Графический вывод текста
Специально для графического режима разработаны специальные процедуры, обеспечивающие вывод сообщений различными шрифтами в горизонтальном или вертикальном направлении с изменением размера символов. Рассмотрим некоторые из них. Процедура Outtext выводит текстовую строку Txt, начиная с текущего положения указателя. Заголовок этой процедуры описывается следующим образом: Procedure OutText (Txt : String); Процедура OuttextXY выводит текстовую строку Txt, начиная с заданного координатами X и Y места: Procedure OutTextXY(X,Y : Integer; Txt : String);. Процедура SetTextstyle устанавливает стиль текущего вывода на графический экран. Процедуре передаются в качестве параметров Font - код шрифта, Direct - код направления, Size - код размера шрифта. Procedure SetTextStyle (Font, Direct, Size ; Word);
21 Для указания кода шрифта можно использовать определённые в модуле Graph константы: DefaultFont
= 0; {Точечный шрифт 8х8}
TriplexFont
= 1; {Утроенный шрифт}
SmallFont
= 2; {Уменьшенный шрифт}
SansSerifFont = 3; {Прямой шрифт} GothicFont
Для
задания
= 4; {Готический шрифт}
направления
выдачи
текста
можно
использовать
константы: HorizDir
= 0; {Слева направо}
VertDir
= 1; {Снизу вверх}
Каждый шрифт способен десятикратно изменять свои размеры. Размер выводимых символов кодируется параметром Size, который поэтому может иметь значение от 1 до 10. Минимальный размер шрифта, при котором отчётливо различаются все его детали, равен 4. Процедура с заголовком Procedure SetTextJustify (Horiz, vert : Word); задаёт выравнивание (Horiz - горизонтальное, Vert - вертикальное) выводимого текста по отношению к текущему положению указателя или к заданным
координатам.
выравнивание
определяет
будет
ли
текст
размещаться левее, правее, выше или ниже указанного места. в качестве значений параметров описываемой процедуры можно использовать такие константы модуля Graph const LeftText
= 0;
{Указатель слева от текста}
CenterText
= 1;
{Симметрично слева и справа, вверху и снизу}
RightText
= 2;
{Указатель справа от текста}
BottomText
= 0;
{Указатель снизу от текста}
TopText
= 2;
{Указатель сверху от текста}
22 Функции TextWidth и TextHeight с заголовками соответственно Function TextWidth (Txt : String): Word; Function TextHeight(Txt : String): Word; возвращают длину и ширину в пикселях передаваемой в качестве параметра строки с учётом текущего стиля вывода. Для того, чтобы выяснить текущий стиль и выравнивание текста, используется процедура GetTextSettings Procedure GetTextSettings (var TextInfo : TextSettingsType); Тип TextSettingsType определён в модуле Graph следующим образом: type TextSettingsType = record Font
: Word; {Номер шрифта}
Direction : Word; {Направление } CharSize
: Word; {Код размера }
Horiz
: Word; {Горизонтальное выравнивание}
Vert
: Word; {Вертикальное выравнивание} end;
Примеры практического применения возможностей модуля Graph
Для того, чтобы продемонстрировать возможности, предоставляемые модулем Graph, приведём описание нескольких процедур, которые могут быть использованы при решении разнообразных практических задач. Для того, чтобы не происходило аварийного прерывания работы программы в случае некорректной инициализации графики следует в текст программы включать следующую процедуру: procedure initgraph1 ( s : string; var ini : boolean); var gm,gd, err : integer; {s:string;} begin
23 ini := true; detectgraph(gd,gm); initgraph(gd, gm, s); err := GraphResult; if err grOk then begin writeln(GraphErrorMsg(err)); ini := false; end; end;
Она возвращает истину в параметре ini, если инициализация графики прошла успешно, в противном случае выдаёт сообщение об ошибке и возвращает ложь. Действия, выполняемые программой после инициализации графики, должны производиться только если ini = true. Для того, чтобы нарисовать окно, задаваемое координатами и обведённое двойной рамкой, можно описать процедуру: procedure drawwin(x1,y1,x2,y2:integer); begin setcolor(white); rectangle(x1-2,y1-2,x2+2,y2+2); rectangle(x1,y1,x2,y2); end;
При решении численных задач часто возникает необходимость предоставить пользователю возможность ввода чисел с клавиатуры. При этом переход в текстовый режим и возврат по окончании ввода в графический не всегда желателен. Чтобы решить эту проблему можно воспользоваться
следующей
процедурой,
позволяющей
вводить
вещественные числа в обычном формате или в виде числа с мантиссой. procedure readtexta(q1,w1 : integer; au : real; var ax : real); {q1, w1 : координаты места ввода, ax {au - значение по умолчанию var setc :set of char;
считываемое число} }
24 p
: char;
s
: string;
v, n, q, w, j : integer; begin v:=0; q:=q1;
w:=w1;
s:=''; n:=0;
p:='w';
setc:=['-','.','e','0'..'9'];{множество допустимых} { while p#13 do
символов
{пока не нажато
}
Enter}
begin outtextXY(q,w,'_'); delay(80); setcolor(0); outtextXY(q,w,'_'); delay(80); setcolor(red); if keypressed then begin if n=0 then setc:=setc+['-']; {если считывается первый символ,} { то к setc добавляется "-" как } {
знак вводимого числа
}
p:=readkey; if p in setc then begin {допустимые символы считываются и} {добавляются к строке s
}
s:=s+p; n:=n+1; q:=q+textwidth(p); outtextXY(q1,w1,s); end; if (p='-') or (n>1) then setc:=setc-['-'];
25 if p='.' then setc:=setc-['.'] ; if p=#8 then
{если нажато BackSpace}
begin setcolor(black); outtextXY(q1,w1,s); setcolor(red); if n>0 then begin q:=q-textwidth(s[n]); delete(s,n,1); if s[n]='.' then setc:=setc+['.']; outtextXY(q1,w1,s); n:=n-1; end; end; end; end; val(s,ax,j); {строка s представляется в виде числа} if j0 then ax := au;
{ при ошибке присвоить
}
{ значение по умолчанию
}
end;
Результаты численных экспериментов также приходится выдавать на экран, не переходя при этом в текстовый режим. При этом вы можете воспользоваться процедурой, которая несколько расширяет возможности стандартной процедуры outtextxy тем, что в качестве параметра берёт не строку, а вещественное число, и добавляет перед ним некоторое сообщение. procedure drawtextr (xl, yl : integer; x : real; st : string); {x - выводимое число, st - текст сообщения} var s : string; begin str(x:12:10,s); s:= st + s;
26 outtextXY(xl, yl, s); end;
Решение
многих
задач
следует
сопровождать
графическим
представлением полученных результатов. Ниже приводится процедура, позволяющая строить график любой функции в окне заданного размера. procedure drawgraf (xl, yl, xr, yr : integer; {координаты окна} a,b: f
real; :
{интервал
изменения
func;
аргумента}
{параметр-функция}
ox, oy : integer; {отступ в пикселях от границ окна для соответствующих осей} var x2,y2: integer; {координаты точки пересечения осей} var
dx,
dy
:
real
{шаг по соответствующим осям}); var ymax, h, ymin, xmax, xmin : real; xy : array [1..100,1..2] of real; i : byte; w1,w2,v1,v2,x1, x3, y1, y3 :integer; begin drawwin (xl,yl,xr,yr); x1 := xl + ox; x3 := xr - ox; y1 := yr - oy; y3 := yl + oy; x2 := 0; y2 := 0; ymin:=f(a); ymax:=ymin; xmax:=b+0.01; xmin:=a-0.01; xy[1,1]:=a; xy[1,2]:=ymin; h:=(b-a)/100; for i:=2 to 100 do
{рисование окна(см. выше)}
27 begin xy[i,1]:=xy[i-1,1]+h; {вычисление значений } xy[i,2]:=f(xy[i,1]);
{функции на (a,b)
}
if xy[i,2]>ymax then ymax:=xy[i,2]; if xy[i,2] 0 {если на заданном интервале не then y2:=-1;
}
{происходит знакоперемены аргумента,} {то ось ординат не прорисовывается
}
if ymax * ymin > 0 {если на заданном интервале не
}
then x2:=-1;
{происходит знакоперемены функции,
}
{то ось абсцисс не прорисовывается
}
{рисование оси абсцисс
}
if x2 > -1 then begin
{x:=x1+round((0-xmin)*dx);} y2:=y3+round((ymax-0)*dy); line(x1,y2,x3,y2); line(x3-3,y2-3,x3,y2); line(x3-3,y2+3,x3,y2); outtextxy(x3+2,y2,'x'); end; if y2>-1 then begin
{рисование оси ординат
x2:=round(x3-(abs(xmax)*dx)); {y:=y3+round((ymax-0)*dy);} line(x2,y3,x2,y1); line(x2-3,y3+3,x2,y3); line(x2+3,y3+3,x2,y3); outtextxy(x2+4,y3-2,'y'); end;
}
28 setcolor(red); w1:=round(x3-(abs(xmax-xy[1,1])*dx)); v1:=y3+round((ymax-xy[1,2])*dy); for i := 2 to 100 do begin {вычисление координат в пикселах, соответствующих} {очередной точке на графике и рисование графика
}
w2:=round(x3-(abs(xmax-xy[i,1])*dx)); v2:=y3+round((ymax-xy[i,2])*dy); line(w1,v1,w2,v2); w1 := w2; v1 := v2; end; setcolor(white); end;
Использование
описанных
процедур
поможет
вам
выполнить
индивидуальные задания по программированию и численным методам.
29 Литература
1. Бородич Ю.С. и др. Паскаль для персональных компьютеров: Справ. пособие/ Ю.С. Бородич, А.Н. Вальвачёв, А.И. Кузьмич. - Мн.: Выш. шк.: БФ ГИТМП "НИКА", 1991. 2. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие. М.:"Нолидж", 1997. 3. Фаронов В.В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие. - М.:"Нолидж", 1997. 4. Белецкий Я. Турбо паскаль с графикой для персональных компьютеров/ Пер. с польск. Д. И. Юренкова. - М.: Машиностроение, 1991..