ИСПОЛЬЗОВАНИЕ БИБЛИОТЕКИ GRAPH
Министерство образования и науки РФ
ГОУ ВПО МО «Коломенский государственный педагогический институт»
Курсовая работа по информатике на тему:
“Графические возможности TurboPascal 7.0 ”
выполнил: студент
группы Инф 41 Малышев А.А.
проверил: доц. Гуськова Е.Н.
Коломна 2008
СОДЕРЖАНИЕ
ВВЕДЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
- Использование библиотеки Graph. . . . . . . . . . . . . . . . . . . . . . 4
- Переход в графический режим и возврат в текстовый. . . . . . . . . . . . . . . . 4
- Краткая характеристика графических режимов работы
дисплейных адаптеров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
- Процедуры и функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
- Координаты, окна, страницы . . . . . . . . . . . . . . . . . . . . . . . . . 9
- Линии и точки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
- Многоугольники . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
- Дуги, окружности, эллипсы . . . . . . . . . . . . . . . . . . . . . . . . . 18
- Краски, палитры, заполнения . . . . . . . . . . . . . . . . . . . . . . . . 20
- Примеры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
ЗАКЛЮЧЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ. . . . . . . . . . . 28
Введение
В данной курсовой работе рассматриваются различные функции и процедуры предназначенные для изображения графических объектов в графическом режиме Турбо Паскаля.
Существует 2 вида работы монитора: текстовый и графический. Различие между текстовым и графическим режимами работы монитора заключается в возможностях управления выводом визуальной информации. В текстовом режиме минимальным объектом, отображаемым на экране, является символ, алфавитно-цифровой или какой-либо иной. В обычных условиях экран монитора, работающего в режиме алфавитно-цифрового дисплея, может содержать не более 80 символов по горизонтали и 25 символов по вертикали, то есть всего 2000 визуальных объектов. При этом имеются ограниченные возможности по управлению цветом символов. Конечно, в таком режиме можно выводить на экран не только обычный текст, но и некие графические изображения, однако понятно, что качество таких изображений будет вне всякой критики. Тем не менее, в «героическую» эпоху компьютерной эры этот метод был единственным и поэтому очень популярным способом вывода графиков и целых картин на экран (и на принтер). Программистам иногда удавалось создавать настоящие шедевры «компьютерной псевдографики». Но для серьезной работы с изображениями текстовый режим дисплея абсолютно не подходит. Поэтому целью данной работы является:
- Рассмотреть дополнительные графические возможности TurboPascal 7.0.
- Рассмотреть примеры по расчёту экранных координат.
- Использование библиотеки GRAPH
Начиная с версии 4.0, в состав Турбо Паскаля включена мощная библиотека графических подпрограмм Graph, остающаяся практически неизменной во всех последующих версиях. Библиотека содержит в общей сложности более 50 процедур и функций, предоставляющих программисту самые разнообразные возможности управления графическим экраном. Для облегчения знакомства с библиотекой все входящие в нее процедуры и функции сгруппированы по функциональному принципу.
1.1 ПЕРЕХОД В ГРАФИЧЕСКИЙ РЕЖИМ
И ВОЗВРАТ В ТЕКСТОВЫЙ
Стандартное состояние ПК после его включения, а также к моменту запуска программы из среды Турбо Паскаля соответствует работе экрана в текстовом режиме, поэтому любая программа, использующая графические средства компьютера, должна определенным образом инициировать графический режим работы дисплейного адаптера. После завершения работы программы ПК возвращается в текстовый режим.
1.2. ХАРАКТЕРИСТИКА ГРАФИЧЕСКИХ РЕЖИМОВ РАБОТЫ ДИСПЛЕЙНЫХ АДАПТЕРОВ
Настройка графических процедур на работу с конкретным адаптером достигается за счет подключения нужного графического драйвера. Драйвер - это специальная программа, осуществляющая управление теми или иными техническими средствами ПК. Графический драйвер управляет дисплейным адаптером в графическом режиме. Графические драйверы разработаны фирмой Borland практически для всех типов адаптеров. Обычно они располагаются на диске в отдельном подкаталоге BGI в виде файлов с расширением BGI (от англ.: Borland Graphics Interface - графический интерфейс фирмы Borland). Например, CGA.BGI - драйвер для СС4-адаптера, EGAVGA.BGI - драйвер для адаптеров EGA и VGA и т.п.
Выпускаемые в настоящее время ПК оснащаются адаптерами, разработанными фирмой IBM, или совместимыми с ними. Все они имеют возможность работы в графическом режиме. В этом режиме экран дисплея рассматривается как совокупность очень близко расположенных точек - пикселей, светимостью которых можно управлять с помощью программы.
В графическом режиме минимальным объектом, выводом которого может управлять программист, является так называемый пиксел (от английского Pixel, возникшего в результате объединения слов «рисунок» (picture) и «элемент» (element)). Пиксел имеет меньшие размеры по сравнению с символом (на один символ в текстовом режиме отводится площадка размером в несколько пикселов). Его геометрические размеры определяются разрешением монитора. Разрешение монитора обычно задается в виде rx * ry , где rx — количество пикселов на экране по горизонтали, а ry — количество пикселов по вертикали. На практике используются не произвольные, а некоторые определенные значения разрешения. Такими разрешениями являются, Например, 320х200, 640х480, 800х600, 1024х768, 1280х1024 и т.д.
Графические возможности конкретного адаптера определяются разрешением экрана, т.е. общим количеством пикселей, а также количеством цветов (оттенков), которыми может светиться любой из них. Кроме того, многие адаптеры могут работать с несколькими графическими страницами. Графической страницей называют область оперативной памяти, используемая для создания «карты» экрана, т.е. содержащая информацию о светимости (цвете) каждого пикселя. Ниже приводится краткая характеристика графических режимов работы наиболее распространенных адаптеров.
Адаптер CGA (Color Graphics Adapter - цветной графический адаптер) имеет 5 графических режимов. Четыре режима соответствуют низкой разрешающей способности экрана (320 пикселей по горизонтали и 200 по вертикали, т.е. 320x200) и отличаются только набором допустимых цветов - палитрой. Каждая палитра состоит из трех цветов, а с учетом черного цвета несветящегося пикселя - из четырех: палитра 0 (светло-зеленый, розовый, желтый), палитра 1 (светло-бирюзовый, малиновый, белый), палитра 2 (зеленый, красный, коричневый) и палитра 3 (бирюзовый, фиолетовый, светло-серый). Пятый режим соответствует высокому разрешению 640x200, но каждый пиксель в этом случае может светиться либо каким-то одним заранее выбранным и одинаковым для всех пикселей цветом, либо не светиться вовсе, т.е. палитра этого режима содержит два цвета. В графическом режиме адаптер CGA использует только одну страницу.
Адаптер EGA (Enhanced Graphics Adapter - улучшенный графический адаптер) может полностью эмулировать графические режимы адаптераCGA. Кроме того, в нем возможны режимы: низкого разрешения (640x200, 16 цветов, 4 страницы) и высокого разрешения (640x350, 16 цветов, 1 страница). В некоторых модификациях используется также монохромный режим (640x350, 1 страница, 2 цвета).
Адаптер MCGA (Multi-Color Graphics Adapter - многоцветный графический адаптер) совместим с CGA, и имеет еще один режим - 640x480, 2 цвета, 1 страница. Такими адаптерами оснащались младшие модели серии ПК PS/2 фирмы IBM. Старшие модели этой серии оснащаются более совершенными адаптерами VGA (Video Graphics Array - графический видеомассив). Адаптер VGA эмулирует режимы адаптеров CGA и EGA и дополняет их режимом высокого разрешения (640x480,16 цветов, 1 страница).
Не так давно появились так называемые cynep-KCL4 адаптеры (SVGA) c разрешением 800x600 и более, использующие 256 и более цветовых оттенков. В настоящее время эти адаптеры получили повсеместное распространение, однако в библиотеке Graph для них нет драйверов. ПосколькуSVGA совместимы с VGA, для управления современными графическими адаптерами приходится использовать драйвер EGAVGA.BGI и довольствоваться его относительно скромными возможностями.
Несколько особняком стоят достаточно популярные адаптеры фирмы Hercules. Адаптер HGC имеет разрешение 720x348, его пиксели могут светиться одним цветом (обычно светло-коричневым) или не светиться вовсе, т.е. это монохромный адаптер. Адаптер HGC+ отличается несущественными усовершенствованиями, а адаптер HICC (Hercules In Color Card) представляет собой 16-цветный вариант HGC+.
2. Процедуры и функции
Процедура InitGraph. Инициирует графический режим работы адаптера. Заголовок процедуры:
Procedure InitGraph(var Driver,Mode: Integer,- Path: String);
Здесь Driver - переменная типа Integer, определяет тип графического драйвера; Mode - переменная того же типа, задающая режим работы графического адаптера; Path - выражение типа String, содержащее имя файла драйвера и, возможно, маршрут его поиска.
К моменту вызова процедуры на одном из дисковых носителей информации должен находиться файл, содержащий нужный графический драйвер. Процедура загружает этот драйвер в оперативную память и переводит адаптерв графический режим работы. Тип драйвера должен соответствовать типу графического адаптера. Для указания типа драйвера в модуле предопределены следующие константы
Const
|
{Режим автоопределения типа}
|
Detect
|
= 0;
|
CGA
|
= 1;
|
MCGA
|
= 2;
|
EGA
|
= 3;
|
EGA64
|
= 4;
|
EGAMono
|
= 5;
|
IBM8514
|
= 6;
|
HercMono
|
= 7;
|
ATT400
|
= 8
|
VGA
|
= 9
|
PC3270
|
= 10
|
Большинство адаптеров могут работать в различных режимах. Для того, чтобы указать адаптеру требуемый режим работы, используется переменная Mode, значением которой в момент обращения к процедуре могут быть такие константы:
const
{Адаптер CGA:}
CGAC0 = 0;
|
{Низкое разрешение, палитра 0}
|
CGAC1 = 1;
|
{Низкое разрешение, палитра 1}
|
CGAC2 = 2;
|
{Низкое разрешение, палитра 2}
|
CGAC3 = 3;
|
{Низкое разрешение, палитра 3}
|
CGAHi = 4;
|
{Высокое разрешение}
|
{Адаптер MCGA:}
MCGAC0 = 0
|
{Эмуляция CGAC0}
|
MCGAC1 = 1
|
{Эмуляция CGAC1}
|
MCGAC2 = 2
|
{Эмуляция CGAC2}
|
MCGAC3 = 3
|
{Эмуляция CGAC3}
|
MCGAMed = 4
|
{Эмуляция CGAHi}
|
MCGAHi = 5
|
{640x480}
|
{Адаптер EGA:}
EGALo = 0
|
{640x200, 16 цветов}
|
EGAHi = 1
|
{640x350, 16 цветов}
|
EGAMonoHi = 3
|
{640x350, 2цвета}
|
{Адаптеры HGC и HGC+:}
HercMonoHi = 0
|
{720x348}
|
{Адаптер ATT400:}
ATT400C0 = 0
|
{Аналог режима CGAC0}
|
ATT400C1 = 1
|
{Аналог режима CGAC1}
|
ATT400C2 = 2
|
{Аналог режима CGAC2}
|
ATT400C3 = 3
|
{Аналог режима CGAC3}
|
ATT400Med = 4
|
{Аналог режима CGAHi}
|
ATT400Hi = 5
|
{640x400, 2 цвета}
|
{Адаптер VGA:}
VGALo = 0
|
{640x200}
|
VGAMed = 1
|
б40х350}:
|
VGAHi = 2
|
{64Qx480}
|
PC3270Hi = 0
|
(Аналог HercMonoHi}
|
{Адаптер IBM8514}
IBM8514Lo = 0
|
{640x480, 256 цветов}
|
IBM8514Hi = 1
|
{1024x768, 256 цветов}
|
Пусть, например, драйвер CGA.BGI находится в каталоге TF42GI на диске С и устанавливается режим работы 320x200 с палитрой 2. Тогда обращение к процедуре будет таким:
Uses Graph;
var Driver, Mode : Integer;
begin
Driver := CGA; {Драйвер}
Mode := CGAC2; {Режим работы}
InitGraph(Driver, Mode, 'C:TPBGI');
. . .
Если тип адаптера ПК неизвестен или если программа рассчитана на работу с любым адаптером, используется обращение к процедуре с требованием автоматического определения типа драйвера:
Driver := Detect;
InitGraph(Driver, Mode, 'C:TPBGI');
После такого обращения устанавливается графический режим работы экрана, а при выходе из процедуры переменные Driver и Mode содержат целочисленные значения, определяющие тип драйвера и режим его работы. При этом для адаптеров, способных работать в нескольких режимах, выбирается старший режим, т.е. тот, что закодирован максимальной цифрой. Так, при работе с CG^-адаптером обращение к процедуре со значением Driver = Detect вернет в переменной Driver значение 1 (CGA) и в Mode -значение 4 (CGAHi), а такое же обращение к адаптеру VGA вернетDriver = 9 flfGA) и Mode = 2 fPGAHi).
Функция GraphResult. Возвращает значение типа Integer, в котором закодирован результат последнего обращения к графическим процедурам. Если ошибка не обнаружена, значением функции будет ноль, в противном случае - отрицательное число, имеющее следующий смысл:
grOk
|
= 0
|
{Нет ошибок}
|
grlnitGraph
|
= -l
|
{He инициирован графический режим}
|
grNotDetected
|
= -2
|
{Не определен тип драйвера}-
|
grFileNotFind
|
= -3
|
{Не найден графический драйвер}
|
grlnvalidDriver
|
= -4
|
{Неправильный тип драйвера}
|
grNoLoadMem
|
= -5
|
{Нет памяти для размещения драйвера}
|
grNoScanMem
|
= -6
|
{Нет памяти для просмотра областей}
|
grNoFloodMem
|
= -7
|
{Нет памяти для закраски областей}
|
grFontNot Found
|
= -8;
|
{He найден файл со шрифтом}
|
grN0F0ntMem
|
= -9;
|
{Нет памяти для размещения шрифта}
|
grlnvalidMode
|
= -10
|
{Неправильный графический режим}
|
grError
|
= -ll
|
{Общая ошибка}
|
grIOError
|
= -12
|
{Ошибка ввода-вывода}
|
grlnvalidFont
|
= -13
|
{Неправильный формат шрифта}
|
grInvalidFontNum
|
=-14
|
{Неправильный номер шрифта
|
После обращения к функции GraphResult признак ошибки сбрасывается, поэтоыу повторное обращение к ней вернет ноль.
Функция GraphErrorMsq. Возвращает значение типа String, в котором по указанному коду ошибки дается соответствующее текстовое сообщение. Заголовок функции:
Function GraphErrorMsg(Code: Integer): String;
Здесь Code - код ошибки, возвращаемый функцией GraphResult.
Например, типичная последовательность операторов для инициации графического режима с автоматическим определением типа драйвера и установкой максимального разрешения имеет следующий вид:
Var Driver, Mode, Error : Integer;
begin
Driver := Detect; {Автоопределение драйвера}
InitGraph(Driver, Mode, ''); {Инициируемграфику}
Error := GraphResult; {Получаем результат}
if Error <> grOk then {Проверяем ошибку}
begin {Ошибка в процедуре инициации}
WriteLn(GraphErrorMsg(Error)); {Выводим сообщение}
end else {Нет ошибки}
Чаще всего причиной возникновения ошибки при обращении к процедуре InitGraph является неправильное указание местоположения файла с драйвером графического адаптера (например, файла CGA.BGI для адаптера CGA). Настройка на местоположение драйвера осуществляется заданием маршрута поиска нужного файла в имени драйвера при вызове процедуры InitGraph. Если, например, драйвер зарегистрирован в подкаталоге DRIVERS каталога PASCAL на диске D, то нужно использовать вызов:
InitGraph(Driver, Mode, 'd:PascalDrivers');
Замечание. Во всех следующих примерах процедура InitGraph вызывается с параметром Driver в виде пустой строки. Такая форма обращения будет корректна только в том случае, когда нужный файл графического драйвера находится в текущем каталоге. Для упрощения повторения примеров скопируйте файл, соответствующий адаптеру Вашего ПК, в текущий каталог.
Процедура CloseGraph. Завершает работу адаптера в графическом режиме и восстанавливает текстовый режим работы экрана. Заголовок:
Procedure CloseGraph;
Процедура RestoreCRTMode. Служит для кратковременного возврата в текстовый режим. В отличие от процедуры CloseGraph не сбрасываются установленные параметры графического режима и не освобождается память, выделенная для размещения графического драйвера. Заголовок:
Procedure RestoreCRTMode;
Функция GetGraphMode. Возвращает значение типа Integer, в котором содержится код установленного режима работы графического адаптера. Заголовок:
Function GetGraphMode: Integer;
Процедура SetGraphMode. Устанавливает новый графический режим работы адаптера. Заголовок:
Procedure SetGraphMode(Mode: Integer);
Здесь Mode - код устанавливаемого режима.
Следующая программа иллюстрирует переход из графического режима в текстовый и обратно:
Uses Graph;
Var Driver, Mode, Error : Integer;
begin
{Инициируем графический режим}
Driver := Detect;
InitGraph(Driver, Mode, '');
Error := GraphResult; {Запоминаем результат}
if Error <> grOk then {Проверяем ошибку}
WriteLn(GraphErrorMsg(Error)) {Есть ошибка}
else
begin {Нет ошибки}
WriteLn ('Это графический режим'); WriteLn ('Нажмите "Enter"...':20); ReadLn;
{Переходим в текстовый режим} RestoreCRTMode;
WriteLn (' А это текстовый...'); ReadLn;
{Возвращаемся в графический режим} SetGraphMode (GetGraphMode); WriteLn ('Опять графический режим...'); ReadLn; CloseGraph;
end end.
В этом примере для вывода сообщений как в графическом, так и в текстовом режиме используется стандартная процедура WriteLn. Если Ваш ПК оснащен нерусифицированным адаптером CGA, вывод кириллицы в графическом режиме таким способом невозможен, в этом случае замените соответствующие сообщения так, чтобы использовать только латинские буквы.
Процедура DetectGraph. Возвращает тип драйвера и режим его работы. Заголовок:
Procedure DetectGraph(var Driver,Mode: Integer);
Здесь Driver - тип драйвера; Mode - режим работы.
В отличие от функции GetGraphMode описываемая процедура возвращает в переменной Mode максимально возможный для данного адаптера номер графического режима.
Функция GetDriverName. Возвращает значение типа String, содержащее имя загруженного графического драйвера. Заголовок:
Function GetDriverName: String;
Функция GetMaxMode. Возвращает значение типа Integer, содержащее количество возможных режимов работы адаптера. Заголовок:
Function GetMaxMode: Integer;
Функция GetModeName. Возвращает значение типа String, содержащее разрешение экрана и имя режима работы адаптера по его номеру. Заголовок:
Function GetModName(ModNumber: Integer): String;
Здесь ModNumber - номер режима.
Следующая программа после инициации графического режима выводит на экран строку, содержащую имя загруженного драйвера, а также все возможные режимы его работы.
Uses Graph;
Var a,b: Integer;
begin
a:= Detect;
InitGraph(a, b, '');
WriteLn(GetDriverName);
for а:= 0 to GetMaxMode do WriteLn(GetModeName(a):10);
ReadLn;
CloseGraph; end.
3. Координаты, окна, страницы
Многие графические процедуры и функции используют указатель текущей позиции на экране, который в отличие от текстового курсора невидим. Положение этого указателя, как и вообще любая координата на графическом экране, задается относительно левого верхнего угла, который, в свою очередь, имеет координаты 0,0. Таким образом, горизонтальная координата экрана увеличивается слева направо, а вертикальная - сверху вниз.
Функции GetMaxX и GetMaxY. Возвращают значения типа Word, содержащие максимальные координаты экрана в текущем режиме работы соответственно по горизонтали и вертикали. Например:
Uses Graph;
Var a,b: Integer;
begin
a := Detect;
InitGraph(a, b, '');
WriteLn(GetMaxX, GetMaxY:5);
ReadLn;ClogeGraph end.
Функции GetX и GetY. Возвращают значения типа Integer, содержащие текущие координаты указателя соответственно по горизонтали и вертикали. Координаты определяются относительно левого верхнего угла окна или, если окно не установлено, экрана.
Процедура SetViewPort. Устанавливает прямоугольное окно на графическом экране. Заголовок:
Procedure SetViewPort(Xl,Yl,X2,Y2: Integer; ClipOn: Boolean);
Здесь Xl...Y2 - координаты левого верхнего (X1,Y1) и правого нижнего (X2,Y2) углов окна; ClipOn - выражение тип Вооlean, определяющее «отсечку» не умещающихся в окне элементов изображения.
Координаты окна всегда задаются относительно левого верхнего угла экрана. Если параметр ClipOn имеет значение True, элементы изображения, не умещающиеся в пределах окна, отсекаются, в противном случае границы окна игнорируются. Для управления этим параметром можно использовать такие определенные в модуле константы:
const
ClipOn = True; {Включить отсечку}
ClipOff = False; {He включать отсечку}
Следующий пример иллюстрирует действие параметра ClipOn. Программа строит два прямоугольных окна с разными значениями параметра и выводит в них несколько окружностей. Для большей наглядности окна обводятся рамками (см. рис.1).
<
>

Puc..1. Отсечка изображения в окне
Uses Graph,CRT;
Var x,y,e: Integer;
xll,yll,xl2,yl2, {Координаты 1-го окна}
x21,x22, {Левый верхний угол 2-ro}
R, {Начальный радиус}
k: Integer;
begin
DirectVideo := False;{Блокируем прямой доступ к видеопамяти в модуле CRT} {Инициируем графический режим}
x := Detect; InitGraph(x, у, ''); {Проверяем результат}
e := GraphResult; if e <> grOk then
WriteLn(GraphErrorMsg(e)) {Ошибка}
else
begin {Нет ошибки}
{Вычисляем координаты с учетом разрешения экрана}
Xll:=GetMaxX div 60;
xl2:=GetMaxX div 3;
yll:= GetMaxY div 4;
yl2:= 2*yll;
R:=(Xl2-Xll) div 4;
x21:= Xl2*2;
x22:=x21+xl2-Xll;
{Рисуем окна}
WriteLn('ClipOn:':10,'ClipOff:':40);
Rectangle(xll, yll, xl2, yl2);
Rectangle(x21, yll, x22, yl2) {Назначаем 1-е окно и рисуем четыре окружности} SetViewPort(xll, yll, xl2, yl2, ClipOn);
for к. := 1 to 4 do
Circle(0,yll,R*k);
{Назначаем 2-е окно и рисуем окружности}
SetViewPort(x21, yll, x22, yl2, ClipOff);
for к := 1 to 4 do
Circle(0,yll,R*k);
{Ждем нажатия любой клавиши}
if ReadKey=#0 then к :=ord(ReadKey);
CloseGraph
end
end.
Процедура GetViewSettings. Возвращает координаты и признак отсечки текущего графического окна. Заголовок:
Procedure GetViewSettings(var ViewInfo: ViewPortType);
Здесь ViewInfo - переменная типа ViewPoriType. Этот тип в модуле Graph определен следующим образом:
type
ViewPortType = record
xl,yl,x2,y2: Integer; {Координаты окна} Clip : Boolean {Признак отсечки}
end;
Процедура MoveTo. Устанавливает новое текущее положение указателя. Заголовок:
Procedure MoveTo(X,Y.- Integer);
Здесь X, Y - новые координаты указателя соответственно по горизонтали и вертикали.
Координаты определяются относительно левого верхнего угла окна или, если окно не установлено, экрана.
Процедура MoveRel. Устанавливает новое положение указателя в относительных координатах.
Procedure MoveRel(DX,DY: Integer);
Здесь DX,DY -приращение новых координат указателя соответственно по горизонтали и вертикали.
Приращения задаются относительно того положения, которое занимал указатель E моменту обращения к процедуре.
Процедура ClearDevice. Очищает графический экран. После обращения к процедуре указатель устанавливается в левый верхний угол экрана, а сам экран заполняется цветом фона, заданным процедурой SetBkColor. Заголовок:
Procedure ClearDevice;
Процедура ClearViewPort. Очищает графическое окно, а если окно не определено к этому моменту - весь экран. При очистке окно заполняется цветом с номером 0 из текущей палитры. Указатель перемещается в левый верхний угол окна. Заголовок:
Procedure ClearViewPort;
В следующей программе на экране создается окно, которое затем заполняется случайными окружностями рис.2). После нажатия на любую клавишу окно очищается. Для выхода из программы нажмите Enter.
Uses CRT,Graph; var
xl,yl,x2,y2,Err: Integer;
begin
{Инициируем графический режим}
xl := Detect; InitGraph(xl,x2,'');
Err := GraphResult;
if Err<>grOk then
WriteLn(GraphErrorMsg(Err))
else
begin {Определяем координаты окна с учетом разрешения экрана}
<
>

xl := GetMaxX div 4;
yl := GetMaxY div 4; x2 := 3*xl; y2 := 3*yl; {Создаем окно}
Rectangle(xl,yl,x2,y2);
SetViewPort(xl+l,yl+l,x2-l,y2-l,ClipOn);
{Заполняем окно случайными окружностями}
repeat
Circle(Random(GetMaxX),Random(GetMaxX), Random(GetMaxX div 5))
until KeyPressed; {Очищаем окно и ждем нажатия Enter}
ClearViewPort;
OutTextXY(0,0,'Press Enter...'); ReadLn; CloseGraph end
end.
4. Линии и точки
Процедура PutPixel. Выводит заданным цветом точку по указанным координатам. Заголовок:
Procedure PutPixel(X,Y: Integer; Color: Word);
Здесь X, Y - координаты точки; Color - цвет точки.
Координаты задаются относительно левого верхнего угла окнаили, если окно не установлено, относительно левого верхнего угла экрана.
Следующая программа периодически выводит на экран «звездное небо» и затем гасит его. Для выхода из программы нажмите любую клавишу.
Uses CRT, Graph;
type
PixelType = record x, у : Integer; end ;
const N = 5000; (Количество "звезд"}
var d,r,e,k: Integer;
xl,yl,x2,y2: Integer;
a: array [l..N] of PixelType; {Координаты}
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, '');
e := GraphResult; if e<>grOk then
WriteLn(GraphErrorMsg(e)) else begin
{Создаем окно в центре экрана}
xl := GetMaxX div 4;
yl := GetMaxY div 4;
x2 := 3*xl; y2 := 3*yl;
Rectangle(xl,yl,x2,y2);
SetViewPort(xl+l,yl+l,x2-l,y2-l,ClipOn);
{Создаем и запоминаем координаты всех "звезд"}
for k := 1 to N do with a[k] do begin
x := Random(x2-xl); у := Random(y2-yl) end;
{Цикл вывода}
repeat
for k := 1 to N do
with a[k] do {Зажигаем "звезду"}
PutPixel(x,y,white);
if not KeyPressed then for k := N downto 1 do
with a[k] do {Гасим "звезду"}
PutPixel(x,y,black)
until KeyPressed;
while KeyPressed do k := ord(ReadKey);
CloseGraph end ; end.
Функция GetPixel. Возвращает значение типа Word, содержащее цвет пикселя с указанными координатами. Заголовок:
Function GetPixel(X,Y: Integer): Word;
Здесь Х, Y - координаты пикселя.
Процедура Line. Вычерчивает линию с указанными координатами начала и конца. Заголовок:
Procedure Line(Xl,Yl,X2,Y2: Integer);
ЗдесьХ1...Y1 - координаты начала (X1, Yl) и конца(Xi2, Y2) линии.
Линия вычерчивается текущим стилем и текущим цветом. В следующей программе в центре экрана создается окно, которое затем расчерчивается случайными линиями. Для выхода из программы нажмите любую клавишу.
Uses CRT, Graph;
Var d,r,e : Integer,-xl,yl,x2,y2: Integer;
begin
{Инициируем графику}
d := Detect; InitGraph(d, r, ''); e := GraphResult;
if e <> grOk then
WriteLn(GraphErrorMsg(e))
else
begin
{Создаем окно в центре экрана}
xl := GetMaxX div 4; yl := GetMaxY div 4;
x2 := 3*xl; y2 := 3*yl;
Rectangle(xl,yl,x2,y2);
SetViewPort(xl+l,yl+l,x2-l,y2-l,ClipOn);
{Цикл вывода случайных линий}
Repeat
SetColor(succ(Random(16))); {Случайный цвет} Line(Random(x2-xl), Random(y2-yl), Random(x2-xl), Random(y2-yl)) until KeyPressed;
if ReadKey=#0 then d := ord(ReadKey);
CloseGraph end end.
Процедура LineTo. Вычерчивает линию от текущего положения указателя до по-дожения, заданного его новыми координатами. Заголовок:
Procedure LineTo(X,Y: Integer);
Здесь X, Y - координаты нового положения указателя, они же - координаты второго конца линии.
Процедура LineRel. Вычерчивает линию от текущего положения указателя до положения, заданного приращениями его координат. Заголовок:
Procedure LineRel (DX, DY: Integer);
Здесь DX, DY - приращения координат нового положения указателя. В процедурах LineTo и LineRel линия вычерчивается текущим стилем и текущим цветом.
Процедура SetLineStyle. Устанавливает новый стиль вычерчиваемых линий. Заголовок:
Procedure SetLineStyle(Type,Pattern,Thick: Word)
Здесь Type, Pattern, Thick - соответственно тип, образец и толщина линии. Тип линии может быть задан с помощью одной из следующих констант:
const
SolidLn = 0; {Сплошная линия}
DottedLn = 1; {Точечная линия}
CenterLn = 2; {Штрих-пунктирная линия}
DashedLn = 3; {Пунктирная линия}
UserBitLn = 4; {Узор линии определяет пользователь}
Параметр Pattern учитывается только для линий, вид которых определяется пользователем (т.е. в случае, когда Type = UserBitLn). При этом два байта параметра Pattern определяют образец линии: каждый установленный в единицу бит этого слова соответствует светящемуся пикселю в линии, нулевой бит - несветящемуся пикселю. Таким образом, параметр Pattern задает отрезок линии длиной в 16 пикселей. Этот образец периодически повторяется по всей длине линии.
Параметр Thick может принимать одно из двух значений:
const
NormWidth = 1; {Толщина в один пиксель}
ThickWidth = 3; {Толщина в три пикселя}
Процедура GetLineSettings. Возвращает текущий стиль линий. Заголовок:
Procedure GetLineSettings(var Stylelnfo: LineSettingsType)
Здесь Stylelnfo - переменная типа LineSettingsType, в которой возвращается текущий стиль линий.
Тип LineSettingsType определен в модуле Graph следующим образом:
type
LineSettingsType = record
LineStyle: Word; {Тип линии}
Pattern -. Word; {Образец}
Thickness: Word {Толщина} end;
Процедура SetWriteMode. Устанавливает способ взаимодействия вновь выводимых линий с уже существующим на экране изображением. Заголовок:
Procedure SetWriteMode(Mode);
Здесь Mode - выражение типа Integer, задающее способ взаимодействия выводимых линий с изображением.
Если параметр Mode имеет значение 0, выводимые линии накладываются на существующее изображение обычным образом (инструкциейMOV центрального процессора). Если значение 1, то это наложение осуществляется с применением логической операции XOR (исключительное ИЛИ): в точках пересечения выводимой линии с имеющимся на экране изображением светимость пикселей инвертируется на обратную, так что два следующих друг за другом вывода одной и той же линии на экран не изменяет его вид.
Режим, установленный процедурой SetWriteMode, распространяется на процедуры Drawpoly, Line, LineRel, LineTo и Rectangle. Для задания параметра Mode можно ис-юльзовать следующие определенные в модуле константы:
const
CopyPut = 0; {Наложение операцией MOV}
XORPut = 1; {Наложение операцией XOR}
В следующем примере на экране имитируется вид часового циферблата (рис. 14.3). Для наглядной демонстрации темп хода «часов» ускорен в 600 раз (см. оператор Delау (100)). При желании Вы сможете легко усложнить программу, связав ее показания с системными часами и добавив секундную стрелку. Для выхода из программы нажмите на любую клавишу.