Министерство общего и профессионального образования Российской Федерации Воронежская государственная лесотехническая ака...
7 downloads
183 Views
214KB 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
Министерство общего и профессионального образования Российской Федерации Воронежская государственная лесотехническая академия
ИНФОРМАТИКА Основы программирования на языке Паскаль Тексты лекций Часть 3
Воронеж − 1999
УДК 519.682.1 Стариков А.В. ИНФОРМАТИКА. Основы программирования на языке Паскаль : Тексты лекций в 3-х частях. Часть 3. Воронеж, 1999. − 22 с.
Третья часть текстов лекций содержит информацию о графических возможностях, реализованных в языке Турбо-Паскаль версии 6.0. Тексты лекций по основам программирования на языке Паскаль предназначены для студентов специальности 060800 − “Экономика и управление на предприятиях лесного комплекса”. Ил. 5. Печатается по решению редакционно-издательского совета ВГЛТА
Рецензенты:
кафедра прикладной математики и экономико-математических методов ВГТА, д-р техн. наук, проф. ВГТУ Кравец О.Я.
УДК 519.682.1 Стариков А.В., 1999 Оформление. Воронежская государственная лесотехническая академия, 1999
3 Лекция 12. Элементы компьютерной графики. Графические средства ТурбоПаскаля. Инициализация графического режима. Проверка ошибок инициализации. Выход из графического режима. Графический экран. Работа с пикселями графического экрана. Вопросы и упражнения для самопроверки. Элементы компьютерной графики Для представления графической информации большинство компьютеров (включая и IBM PC-совместимые) используют растровый способ, когда изображение представляется в виде двумерной матрицы точек (пикселей). Каждый пиксель растра может иметь свой цвет, выбираемый из заданного набора цветов, называемого палитрой. Компьютер имеет видеоадаптер (называемый также видеоконтроллером или видеокартой), который, во-первых, хранит изображение в своей памяти (называемой видеопамятью) и, во-вторых, обеспечивает регулярное (50-70 раз в секунду) сканирование и отображение содержимого видеопамяти на экран монитора. Для IBM PC-совместимых компьютеров существует несколько различных типов видеоадаптеров, различающихся своими возможностями, устройством и принципами работы. Основными типами видеоадаптеров для этих компьютеров являются CGA, EGA, VGA и Hercules. Существует также множество видеоадаптеров, совместимых с EGA/VGA, но обеспечивающих ряд дополнительных возможностей. Каждый видеоадаптер может работать в одном из нескольких режимов. Эти режимы различаются размерами матрицы пикселей (разрешением) и размером палитры (количеством цветов одновременно отображаемых на экране). Большинство видеоадаптеров построено по принципу совместимости “снизувверх”, т.е. более совершенный адаптер поддерживает режимы работы более простых адаптеров. Например, EGA-адаптер поддерживает все режимы CGAадаптера и при этом обеспечивает ряд собственных режимов; аналогично VGAадаптер поддерживает все режимы EGA-адаптера и обеспечивает ряд дополнительных режимов. Любая графическая операция сводится к работе с отдельными пикселями – отобразить пиксель заданного цвета и получить информацию о цвете пикселя. Однако большинство графических библиотек позволяют выполнять операции с более сложными объектами. Эти объекты можно классифицировать следующим образом: • линейные изображения (растровые образы линий); • сплошные объекты (растровые образы двумерных областей); • шрифты; • изображения (прямоугольные матрицы пикселей).
4
Графические возможности Турбо-Паскаля Как правило, каждый из компиляторов, которыми оснащаются IBM PCсовместимые компьютеры, имеет собственную графическую библиотеку, обеспечивающую работу с основными группами объектов. Графические возможности языка Турбо-Паскаля версии 6.0 реализованы с помощью ряда графических подпрограмм (их более 50), содержащихся в модуле Graph (файл GRAPH.TPU). Кроме того, существует ряд графических драйверов, обеспечивающих работу программы с тем или иным видеоадаптером. Для реализации графических драйверов (BGI-файлов) выделяется некоторый небольшой набор базовых графических операций и именно эти операции “привязываются” к конкретному драйверу устройства. Для каждого драйвера обеспечивается стандартный интерфейс, а все остальные операции реализуются библиотечными подпрограммами на основе набора базовых операций. Таким образом удается обеспечить почти полную независимость программ от типа установленного видеоадаптера. С компилятором языка Турбо-Паскаль версии 6.0 поставляются следующие графические драйверы: CGA.BGI – драйвер для адаптеров CGA, MCGA; EGAVGA.BGI – драйвер для адаптеров EGA, VGA; HERC.BGI – драйвер для монохромного адаптера Hercules; ATT.BGI – драйвер для адаптера AT&T 6300; PC3270.BGI – драйвер для адаптера 3270PC; IBM8514.BGI – драйвер для адаптера IBM-8514. Каждый из перечисленных выше драйверов обеспечивают работу в нескольких различных графических режимов. Например, драйвер EGAVGA.BGI позволяет работать с VGA-графикой в одном из следующих режимов: 0 (VGALo) – разрешение 640×200, 16 цветов; 1 (VGAMed) – разрешение 640×350, 16 цветов; 2 (VGAHi) – разрешение 640×480, 16 цветов. Инициализация графического режима Для работы в графическом режиме программа должна выполнить его инициализацию. Инициализация графического режима выполняется с помощью вызова библиотечной процедуры InitGraph(var GraphDriver, GraphMode : integer; PathToDriver : string), которая отыскивает на диске указанный в вызове драйвер, загружает его в память и подготавливает экран к работе в графическом режиме. Например, если компьютер оснащен VGA-адаптером, то можно использовать следующий фрагмент кода для инициализации графики: uses Graph; const
5 PathToDriver = ‘c:\tp\bgi’; { Маршрут к каталогу с BGI-файлами } var Gd, Gm : integer; begin Gd :=EGAVGA; { Драйвер EGAVGA.BGI } Gm := VGAHI; { 640 x 480 точек, 16 цветов } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } . . . end. Графическая библиотека содержит процедуру DetectGraph(var GraphDriver, GraphMode : integer), которая проверяет тип установленного видеоадаптера и определяет графический драйвер, соответствующий этому видеоадаптеру. Таким образом, фрагмент кода для инициализации графического режима может иметь следующий вид: uses Graph; const PathToDriver = ‘c:\tp\bgi’; { Маршрут к каталогу с BGI-файлами } var Gd, Gm : integer; begin DetectGraph(Gd, Gm); { Определить тип видеадаптера } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } . . . end. Можно поручить процедуре InitGraph автоматически выполнить поиск соответствующего графического драйвера, если в качестве значения целой переменной GraphDriver указать константу Detect. Например: uses Graph; const PathToDriver = ‘c:\tp\bgi’; { Маршрут к каталогу с BGI-файлами} var Gd, Gm : integer; begin Gd :=Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } . . . end. Проверка ошибок инициализации При инициализации графического режима возможно возникновение ошибочных ситуаций. Для идентификации таких случаев после вызова процедуры InitGraph следует использовать функцию GraphResult : integer, которая воз-
6 вращает одно из следующих значений (перечислены наиболее важные коды возврата): 0 (grOk) – инициализация выполнена успешно; -2 (grNotDetected) – видеоконтроллер не поддерживает работу в графическом режиме; -3 (grFileNotFound) – не найден файл графического драйвера; -4 (grInvalidDriver) – неверный графический драйвер; -5 (grNoLoadMem) – для инициализации заданного графического режима недостаточно памяти. В скобках указаны соответствующие символические константы, определенные в модуле Graph. Справочную информацию об ошибках инициализации графического режима можно получить, выбрав пункты Help{Index{CONSTANTS(GRAPHICS-MODE)}} соответствующих меню интерактивной среды разработки (ИСР) Турбо-Паскаль 6.0. Ниже приведен фрагмент программы, проверяющий результат инициализации графического режима. uses Graph; const PathToDriver = ‘c:\tp\bgi’; { Маршрут к каталогу с BGI-файлами } var Gd, Gm : integer; ErrorCode : integer; begin Gd :=Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘ Ошибка инициализации графики: ‘, ErrorCode); exit end; . . . end. Выход из графического режима После окончания работы программы в графическом режиме необходимо использовать процедуру CloseGraph, которая осуществляет выход из графического режима и освобождает память, занятую при инициализации. Пример использования процедуры CloseGraph приведен ниже. uses Graph; label 10; const
7 PathToDriver = ‘c:\tp\bgi’; { Маршрут к каталогу с BGI-файлами } var Gd, Gm : integer; ErrorCode : integer; begin . . . { Работа в текстовом режиме } Gd :=Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘ Ошибка инициализации графики: ‘, ErrorCode); goto 10; end; . . . { Работа в графическом режиме } CloseGraph; { Выход из графического режима } 10: . . . { Работа в текстовом режиме } end. Графический экран Графический экран рассматривается как прямоугольная матрица пикселей. Верхний левый угол графического экрана имеет координаты (0,0). Значение координаты x увеличивается слева направо, а значение координаты y – сверху вниз (рис. 6). (GetMaxX, 0)
(0, 0)
x
(GetMaxX div 2, GetMaxY div 2)
y (0, GetMaxY)
(GetMaxX, GetMaxY)
Рис. 6. Разметка графического экрана
8 Функции GetMaxX : integer и GetMaxY : integer возвращают максимальную координату X и максимальную координату Y соответственно. Таким образом, координаты правого верхнего угла графического экрана будут (GetMaxX,0), левого нижнего угла – (0,GetMaxY), правого нижнего угла – (GetMaxX, GetMaxY). Очевидно, что пиксель, расположенный в центре экрана, имеет координаты (GetMaxX div 2, GetMaxY div 2). Графическая библиотека содержит также функции GetX : integer и GetY : integer, которые возвращают текущую координату X и текущую координату Y соответственно. Работа с пикселями графического экрана Процедура PutPixel(X, Y : integer; Color : word) выводит пиксель с цветом, определяемым параметром Color, в области графического экрана с координатами, определяемыми параметрами X и Y. Например, вызов процедуры PutPixel(GetMaxX div 2, GetMaxY div 2, Red) приводит к выводу пикселя красного цвета в центре экрана. Справочную информацию о символических константах для кодов цвета можно получить, если выбрать пункты Help{Index{CONSTANTS(COLOR,SETTINGS)}} соответствующих меню ИСР Турбо-Паскаль 6.0. Функция GetPixel(X, Y : integer) : word возвращает код цвета пикселя, расположенного в области графического экрана с координатами, определяемыми координатами X и Y. Например: uses Graph; const PathToDriver = ‘c:\tp\bgi’; { Маршрут к каталогу с BGI-файлами } var Gd, Gm : integer; ErrorCode : integer; begin Gd :=Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘ Ошибка инициализации графики: ‘, ErrorCode); exit end; . . . Color := GetPixel(GetMaxX div 2, GetMaxY div 2); . . . CloseGraph; { Выход из графического режима } end.
9 Очевидно, что представленные выше графические подпрограммы PutPixel и GetPixel являются простейшими инструментальными средствами для построения различных графических изображений. Однако, для реализации сложной графики лучше воспользоваться менее универсальными и более производительными средствами, обеспечиваемыми графической библиотекой Турбо-Паскаля. Ниже представлен пример завершенной программы, которая выводит прямоугольник белого цвета со сторонами, равными размеру графического экрана. program RectAngle; uses Crt, Graph; const PathToDriver = ‘c:\tp\bgi’; { Маршрут к каталогу с BGI-файлами } var Gd, Gm : integer; { Код графических драйвера и режима} ErrorCode : integer; { Код ошибки} Limit1, Limit2 : integer; {Максимальные координаты по X и по Y} i : integer; {Управляющая переменная цикла} begin Gd :=Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); { Инициализация графики } ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘ Ошибка инициализации графики: ‘, ErrorCode); exit end; Limit1 := GetMaxX; Limit2 := GetMaxY; for i := 0 to Limit1 do PutPixel(i, 0, White); for i := 0 to Limit2 do PutPixel(Limit1, i, White); for i := Limit1 downto 0 do PutPixel(i, Limit2, White); for i := Limit2 downto 0 do PutPixel(0, i, White); repeat until KeyPressed; { Ждать нажатия любой клавиши } CloseGraph; { Выход из графического режима } end.
10 Вопросы и упражнения для самопроверки 1. Дополнить текст приведенной выше программы операторами, обеспечивающими вывод диагоналей прямоугольника. Использовать для этой цели многократный (в цикле) вызов процедуры PutPixel. 2. Написать программу для вывода на экран осей декартовой (прямоугольной) системы координат так, как это показано на рис. 7.
Рис. 7. Оси декартовой системы координат 3. Написать программу для вывода на экран астроиды, описываемой параметрическими уравнениями x = b× cos3(t); у = b× sin3( t ), где b = 100, а t изменяется в диапазоне от 0 до 2π с шагом 0,01. Точку пересечения осей координат x и y разместить в центре графического экрана. 4. Модифицировать текст программы (см. Упражнение 3) так, чтобы на экран выводилось множество астроид. Для каждой астроиды задать свое значение параметра b; значения этого параметра менять от 10 до 200 с шагом 5. Лекция 13. Отображение линейных объектов. Вывод прямолинейного отрезка. Вывод прямоугольника. Вывод окружности. Вывод дуг окружности и эллипса. Отображение сплошных объектов. Вывод заполненного прямоугольника. Вывод заполненного эллипса. Вывод заполненного сектора. Вывод параллелепипеда. Вопросы и упражнения для самопроверки. Отображение линейных объектов При отображении линейных объектов (прямолинейных отрезков, прямоугольников, окружностей, дуг окружностей и др.) основным инструментом является “перо”, с помощью которого объекты рисуются. Перо имеет следующие характеристики: • цвет (по умолчанию белый); • толщина (по умолчанию 1); • шаблон (по умолчанию сплошной). Для задания характеристик пера используются следующие процедуры:
11 • SetColor(Color : word) – устанавливает текущий цвет рисования. Например: SetColor(Red); • SetLineStyle(LineStyle : word; Pattern : word; Thickness : word) – устанавливает атрибуты линии. LineStyle определяет вид линии (Solid_Ln – сплошная линия, Dotted_Ln пунктирная линия, Center_Ln – штрихпунктирная линия, Dashed_Ln – штриховая линия, UserBit_Ln – тип линии, заданный пользователем). Значение UserBit_Ln означает, что шаблон задается вторым параметром (Pattern). Шаблон определяется 16 битами, где единичное значение бита означает, что в соответствующем месте будет выведена точка, а нулевое значение означает, что точка выводиться не будет. Третий параметр (Thickness) задает толщину линии в пикселях. Возможные значения параметра – Norm_Width (1) и Thick_Width (3). Процедура SetBkColor(Color : word) используется для установки текущего цвета фона. Например: SetBkColor(Blue). Вывод прямолинейного отрезка Для вывода прямолинейного отрезка используется процедура Line(x1, y1, x2, y2 : integer). Например: ... Line(0,0,GetMaxX,0); Line(GetMaxX,0,GetMaxX,GetMaxY); Line(GetMaxX,GetMaxY,0,GetMaxY); Line(0,GetMaxY,0,0); Line(0,0,GetMaxX,GetMaxY); Line(0,GetMaxY,GetMaxY,0); ... Вопрос. К какому эффекту приведет выполнение указанного выше фрагмента программы? Вывод прямоугольника Для вывода прямоугольника используется процедура Rectangle(x1, y1, x2, y2 : integer), где (x1,y1) – координаты левого верхнего угла прямоугольника, a (x2,y2) – координаты нижнего правого угла прямоугольника. Например: ... Rectangle(0,0,GetMaxX,GetMaxY); Line(0,0,GetMaxX,GetMaxY); Line(0,GetMaxY,GetMaxX,0); ...
12 Вывод окружности Для вывода окружности используется процедура Circle(X, Y : integer; Radius : word), где (X,Y) – координаты центра окружности с радиусом Radius. Например: Circle(GetMaxX div 2, GetMaxY div 2, 50). Вывод дуги окружности Для вывода дуги окружности используется процедура Arc(X, Y : integer; StartAngle, EndAngle, Radius : word), где (X,Y) – центр окружности, а StartAngle и EndAngle – начальный и конечный угол соответственно (см. рис. 8). Углы задаются в градусах, отсчитываемых в направлении против хода часовой стрелки. Вывод дуги эллипса Для вывода дуги эллипса используется процедура Ellipse(X,Y : integer; StartAngle, EndAngle : word; XRadius, YRadius : word), где (X,Y) – координаты центра эллипса, StartAngle и EndAngle начальный и конечный угол (см. рис. 8), XRadius и YRadius – горизонтальная и вертикальная полуоси эллипса соответственно. Например: Ellipse(GetMaxX div 2, GetMaxY div 2, 0, 90, 100, 50).
EndA ngle x
S tartA ngle y Рис. 8. Отсчет углов для процедур Arc и Ellipse Отображение сплошных объектов Под сплошным объектом понимается закрашенный объект. С закрашиванием связано понятие “кисти”. Кисть определяется цветом и шаблоном – матрицей 8×8 бит (точек), где бит, равный 1, означает, что нужно ставить точку цвета кисти, а 0 – точку черного цвета. Для задания характеристик кисти используются следующие процедуры:
13 • SetFillStyle(Pattern : word, Color : word) – позволяет установить текущий цвет (цвет кисти) и текущий стиль (шаблон кисти) заполнения. Шаблон кисти (Pattern) может принимать следующие значения, определенные в модуле Graph и задающие вид шриховки: EmptyFill (0) – заполнение цветом фона, SolidFill (1) – сплошное заполнение заданным цветом, LineFill (2) – заполнение жирными горизонтальными линиями, LtSlashFill (3) – заполнение тонкими наклонными линиями (///), SlashFill (4) – заполнение жирными наклонными линиями (///), BkSlashFill (5) – заполнение жирными обратными наклонными линиями (\\\), LtBkSlashFill (6) – заполнение тонкими обратными наклонными линиями (\\\), HatchFill (7) – заполнение клеткой, XHatchFill (8) – заполнение косой клеткой (XXX), InterLeaveFill (9) – заполнение частой наклонной штриховкой, WideDotFill (10) – заполнение редкими точками, CloseDotFill (11) – заполнение частыми точками, UserFill (12) – штриховка, определенная пользователем. • SetFillPattern(Pattern : FillPatternType; Color : word) – позволяет установить пользовательскую структуру заполнения, которая затем может быть использована процедурой SetFillStyle. Процедура GetFillSettings(var FillInfo : FillSettingsType) – позволяет получить информацию об используемых цвете и шаблоне заполнения. Тип FillSettingsType определяется в модуле Graph следующим образом: type FillSettingsType = record Pattern : word; Color : word end; Поле Pattern содержит номер шаблона заполнения, выбранного с помощью процедуры SetFillStyle (0..1) или SetFillPattern (12). Поле Color содержит номер цвета (0..15). Процедура GetFillPattern(var Pattern : FillPatternType) позволяет получить шаблон заполнения, спроектированный пользователем. Шаблон заносится в переменную с типом FillPatternType, который определяется в модуле Graph следующим образом: type FillPatternType = array [1..8] of byte; Если до вызова процедуры GetFillPattern не была выполнена процедура SetFillPattern, то каждому элементу массива Pattern будет присвоено значение $FF. Вывод заполненного прямоугольника
14 Процедура Bar(x1, y1, x2, y2 : integer) выводит прямоугольник с левым верхним углом (x1,y1) и правым нижним углом (x2,y2) и заполняет его, используя цвет и шаблон кисти. Например: uses Crt, Graph; const PathToDriver = ‘c:\tp\bgi’; var Gd, Gm : integer; ErrorCode : integer; begin Gd := Detect; InitGraph(Gd,Gm,PathToDriver); ErrorCode := GraphResult; if ErrorCode <> grOk then begin writeln(‘Ошибка инициализации графики: ‘, ErrorCode); exit end; SetFillStyle(SolidFill, Blue); Bar(0, 0, GetMaхX div 2, GetMaxY div 2); SetFillStyle(SolidFill, Red); Bar(GetMaхX div 2, 0, GetMaxX, GetMaxY div 2); SetFillStyle(SolidFill, Yellow); Bar(0, GetMaхY div 2, GetMaxX div 2, GetMaxY); SetFillStyle(SolidFill, Green); Bar(GetMaxX div 2, GetMaхY div 2, GetMaxX , GetMaxY); readln; { Ждать нажатия клавиши ENTER } CloseGraph end. Вопрос. К какому эффекту приведет выполнение данной программы? Ниже приведен пример программы, использующей процедуры GetFillPattern и SetFillPattern для получения текущего шаблона заполнения и установки пользовательского шаблона соответственно. В качестве шаблона заполнения используем несложный рисунок (сердечко), показанный на рис. 9.
15 $00 $6C $92 $92 $82 $44 $28 $10
Рис. 9. Пользовательский шаблон заполнения program UserFillPattern; uses Graph; const PathToDriver=‘с:\tp\bgi’; Heart: FillPatternType = ($00, $6C, $92, $92, $82, $44, $28, $10); var Gd, Gm : Integer; OldPattern : FillPatternType; begin Gd := Detect; InitGraph(Gd, Gm,PathToDriver); if GraphResult <> grOk then begin writeln('Ошибка инициализации графики'); Exit end; GetFillPattern(OldPattern); SetFillPattern(Heart, White); { Рисуем прямоугольник, используя новый шаблон заполнения (в виде сердечка) } Bar(0, 0, GetMaxX, GetMaxY); ReadLn; SetFillPattern(OldPattern,White); { Рисуем прямоугольник, используя старый } { шаблон заполнения (обычно белого цвета) } Bar(0, 0, GetMaxX, GetMaxY); ReadLn; CloseGraph end.
16
Вывод заполненного эллипса Процедура FillEllipse(X, Y : integer; XRadius, YRadius : word) выводит эллипс с центром в точке (X,Y) с горизонтальной полуосью XRadius и вертикальной полуосью YRadius. Например: FillEllipse(GetMaxX div 2, GetMaxY div 2, 100, 200). Вывод заполненного сектора Процедура Sector(X, Y : integer; StAngle, EndAngle : word; XRadius, YRadius : word) выводит эллиптический сектор с центром в точке (X,Y) от угла StAngle до EndAngle. Например: Sector(GetMaxX div 2, GetMaxY div 2, 0, 90, 200, 100). Вывод параллелипипеда Процедура Bar3D(x1,y1,x2,y2 : integer; Depth : word; Top : boolean) выводит параллелипипед, используя текущие цвет и шаблон заполнения. Переменная Depth определяет глубину параллелипипеда. Переменная Top указывает на наличие верхней и правой граней (значение True) или их отсутствие (значение False). Например: Bar3D(100,100,150,300,True). Вопросы и упражнения для самопроверки 1. Написать программу для вывода на экран эмблемы Всемирных олимпийских игр – пяти переплетенных колец, каждое из которых имеет свой цвет и представляет один из континентов. 2. Как известно из школьного курса географии, наша планета имеет форму эллипсоида вращения. Используя описанные выше процедуры вывести схематическое изображение земного шара в виде эллипса голубого цвета с тремя меридианами и тремя параллелями желтого цвета. 3. Написать программу для ввода с клавиатуры ряда из десяти различных числовых значений и вывода на экран гистограммы (столбиковой диаграммы), соответствующей этому ряду значений. Каждый столбец гистограммы должен быть окрашен в свой цвет, отличный от цвета соседних столбцов. 4. Написать программу для ввода с клавиатуры ряда из десяти различных числовых значений и вывода на экран круговой диаграммы, соответствующей этому ряду значений. Каждый сегмент круговой диаграммы должен быть окрашен в свой цвет, отличный от цвета соседних сегментов. 5. Модифицировать программу для вывода гистограммы (см. Упражнение 4) так, чтобы столбцы гистограммы были трехмерными. Каждый столбец гисто-
17 граммы по-прежнему должен быть окрашен в свой цвет, отличный от цвета соседних столбцов. Лекция 14. Вывод текста в графическом режиме. Работа с прямоугольными областями графического экрана. Вопросы и упражнения для самопроверки. Вывод текста в графическом режиме В графическом режиме для вывода текста можно использовать несколько различных шрифтов. Один из этих шрифтов – растровый, т.е. каждый символ шрифта задается матрицей точек. Этот шрифт указывается в программе с помощью константы DefaultFont (0). Только этот шрифт позволяет осуществлять вывод текста на русском языке. Другие шрифты, обеспечиваемые системой Turbo Pascal 6.0, являются векторными, т.е. каждый символ таких шрифтов представляется рядом отрезков (векторов). Векторные шрифты указываются в программе с помощью следующих констант: TriplexFont (1), SmallFont (2), SansSerifFont (3) и GothicFont (4). Файлы шрифтов имеют расширение .CHR и хранятся либо в каталоге с BGI-файлами, либо в текущем каталоге. Для выбора и масштабирования шрифта, а также указания направления вывода текста используется процедура SetTextStyle(шрифт, направление, размер : word). Размер шрифта не может превышать 10. При увеличении размера растрового шрифта ухудшается качество выводимых символов, так как увеличиваются составляющие каждый символ точки; при увеличении размера векторного шрифта качество символов не меняется и определяется только разрешающей способностью экрана. Для растрового шрифта нормальный размер символов достигается при размере, равном 1, а для векторных – при размере, равном 4. Направление вывода текста задается с помощью второго параметра процедуры SetTextStyle – направление. Этот параметр может принимать следующие два значения: HorizDir (0) – вывод текста по горизонтали (слева направо) и VertDir (1) – вывод текста по вертикали (снизу вверх). Для вывода текста в графическом режиме используются процедуры OutText(текст : string) и OutTextXY(X,Y : integer; текст : string). Процедура OutText выводит заданный текст с текущей позиции. Процедура OutTextXY выводит текст, начиная с точки с координатами (X,Y). Выводимую строку можно выровнять, т.е. задать ее положение относительно координат точки вывода, с помощью процедуры SetTextJustify(горизонт, вертикаль : word). Параметр горизонт, определяющий выравнивание по горизонтали, может принимать значения, задаваемые следующими константами: LeftText (0) – для выравнивания слева, СenterText (1) – для выравнивания по центру (центрирования) и RightText (2) – для выравнива-
18 ния справа. Параметр вертикаль, определяющий выравнивание по вертикали, может принимать значения, задаваемые следующими константами: BottomText (0) – для выравнивания снизу, CenterText (1) – для выравнивания по центру (центрирования) и TopText (2) – для выравнивания сверху. Пример программы, использующей процедуры SetTextJustify, SetTextStyle и OutTextXY, приведен ниже. Эта программа выводит одну и ту же строку текста ‘TURBO PASCAL’ несколько раз с небольшим смещением и различными цветами. program Graf_Text; uses Graph; const PathToDriver = ‘c:\tp\bgi’; var Gd, Gm, ErrCode : integer; begin Gd := Detect; { Автоматическое определение драйвера } InitGraph(Gd, Gm, PathToDriver); ErrCode := GraphResult; if ErrCode <> grOk then begin writeln(‘Ошибка инициализации графики: ‘, ErrCode); Exit end; SetTextJustify(CenterText, CenterText); SetTextStyle(TriplexFont, HorizDir, 8); SetColor(White); OutTextXY(GetMaxX div 2, GetMaxY div 2, ‘TURBO PASCAL’); SetColor(LightBlue); OutTextXY(GetMaxX div 2 + 2, GetMaxY div 2, ‘TURBO PASCAL’); SetColor(LightRed); OutTextXY(GetMaxX div 2 + 3, GetMaxY div 2, ‘TURBO PASCAL’); SetColor(Yellow); OutTextXY(GetMaxX div 2 + 4, GetMaxY div 2, ‘TURBO PASCAL’); SetColor(White); ReadLn; CloseGraph end. При работе с текстом в графическом режиме могут использоваться следующие подпрограммы:
19 • процедура GetTextSettings(var информ_текст : TextSettingsType), определяющая текущий шрифт, направление вывода и способ выравнивания. Тип TextSettingsType определен в модуле GRAPH.TPU следующим образом: type TextSettingsType = record Font : word; { Шрифт } Direction : word; { Направление вывода } CharSize : word; { Размер шрифта } Horiz : word; { Выравнивание по горизонтали } Vert : word { Выравнивание по вертикали } end; • функция TextHeight(текст : string) : word, возвращающая высоту символа, измеряемую в пикселях; • Процедура SetUserCharSize(умн_X, дел_X, умн_Y, дел_Y : word), определяющая коэффициенты растяжения векторных шрифтов вдоль оси x (по горизонтали) и вдоль оси y (по вертикали), равные умн_X/дел_X и умн_Y/дел_Y соответственно. Работа с прямоугольными областями графического экрана Графическая библиотека Турбо-Паскаля содержит ряд подпрограмм для работы с прямоугольными областями экрана, а именно: • функция ImageSize(x1,y1,x2,y2 : integer) : word , которая возвращает объем памяти (в байтах), необходимой для сохранения изображения, заключенного в прямоугольнике с координатами (x1,y1) и (x2,y2) для левого верхнего угла и правого нижнего угла соответственно; • процедура GetImage(x1,y1,x2,y2 : integer; var указ_буфер : pointer), которая копирует изображение из области графического экрана, указанной координатами (x1,y1) и (x2,y2), в буфер, заданный параметром указ_буфер. Для сохранения области экрана предоставляется не более 64К байт; • процедура PutImage(x,y : integer; var указ_буфер : pointer; режим : word), которая копирует изображение из буфера, заданного параметром указ_буфер, в область графического экрана, левый верхний угол которой имеет координаты (x,y). Параметр режим определяет режим вывода изображения на экран: простое замещение существующего в этой области изображения – NormalPut (0), наложение изображений с использованием операций логическое исключающее ИЛИ – XorPut (1), логическое ИЛИ – OrPut (2), логическое И – AndPut (3) и логическое НЕ – NotPut (4). Результат наложения изображений в каждой точке графического экрана зависит от цвета точек исходных изображений и приме-
20 няемой логической операции. При этом каждый бит двоичного представления цвета налагаемой точки взаимодействует с соответствующим битом цвета точки, на которую происходит наложение, по соответствующему логическому закону. Ниже приведен пример программы, демонстрирующей различные эффекты, вызванные использованием различных режимов наложения изображений. program VisualEffects; uses Сrt, Graph; const PathToDriver = ‘c:\tp\bgi’; var Gd, Gm,ErrCode : integer; Ptr : pointer; i, Size : integer; begin Gd := Detect; InitGraph(Gd,Gm,PathToDriver); { Проверка выполнения инициализации графического режима } ErrCode := GraphResult; if ErrCode <> grOk then begin writeln(‘Ошибка инициализации графики: ‘, ErrCode); exit end; SetFillStyle(DottedLn,Yellow); Bar(0,0,GetMaxX,GetMaxY); SetColor(Blue); { Вывод некоторого графического образа в прямоугольнике координатами (0,0,40,40) } for i := 0 to 10 do RectAngle(20-2*i, 20-2*i,20+2*i,20+2*i); OutTextXY(80,20, ‘This is the image’); { Определение размера памяти, необходимого для запоминания прямоугольной области (0,0,40,40) } Size := ImageSize(0,0,40,40); { Выделение требуемой области памяти и занесение ее начального адреса в указатель } GetMem(Ptr,Size); { Копирование изображения в выделенную область памяти } GetImage(0,0,40,40,Ptr^); { Вывод изображения в режиме NormalPut } for i := 1 to 10 do
21 PutImage(i*20,60,Ptr^,NormalPut); OutTextXY(250,80,’NormalPut’); { Вывод изображения в режиме XorPut } for i := 1 to 10 do PutImage(i*20,100,Ptr^,XorPut); OutTextXY(250,120,’XorPut’); { Вывод изображения в режиме OrPut } for i := 1 to 10 do PutImage(i*20,140,Ptr^,OrPut); OutTextXY(250,160,’OrPut’); { Вывод изображения в режиме AndPut } for i := 1 to 10 do PutImage(i*20,180,Ptr^,AndPut); OutTextXY(250,200,’AndPut’); ReadLn; CloseGraph end. Результат выполнения программы VisualEffects показан рис. 10, представленном ниже. Следует отметить, что использование режимов наложения NormalPut и NotPut приводит к одинаковому результату.
Рис. 10. Визуальные эффекты при использовании различных режимов наложения изображения
22
Содержание Лекция 12. Элементы компьютерной графики. Графические средства Турбо-Паскаля. Инициализация графического режима. Проверка ошибок инициализации. Выход из графического режима. Графический экран. Работа с пикселями графического экрана. Вопросы и упражнения для самопроверки. Лекция 13. Отображение линейных объектов. Вывод прямолинейного отрезка. Вывод прямоугольника. Вывод окружности. Вывод дуг окружности и эллипса. Отображение сплошных объектов. Вывод заполненного прямоугольника. Вывод заполненного эллипса. Вывод заполненного сектора. Вывод параллелепипеда. Вопросы и упражнения для самопроверки. Лекция 14. Вывод текста в графическом режиме. Работа с прямоугольными областями графического экрана. Вопросы и упражнения для самопроверки.
Стр. 3
10
16
Стариков Александр Вениаминович
ИНФОРМАТИКА. Основы программирования на языке Паскаль. Тексты лекций в 3-х частях. Часть 3
Редактор А.В. Гладких
Подписано в печать Форм. бум. 297×420, 1/16. Бум. ZOOM. Усл. п. л. Уч.-изд. л. Тираж Заказ № РИО ВГЛТА. УОП ВГЛТА. 394613, г. Воронеж, ул. Тимирязева, 8.