Графические возможности TurboPascal 7.0

ИСПОЛЬЗОВАНИЕ БИБЛИОТЕКИ GRAPH 
Министерство образования и науки РФ
ГОУ ВПО МО «Коломенский государственный педагогический институт»
Курсовая работа по информатике на тему:
“Графические возможности TurboPascal 7.0 ”
выполнил: студент
группы Инф 41 Малышев А.А.
проверил: доц. Гуськова Е.Н.
Коломна 2008
СОДЕРЖАНИЕ
ВВЕДЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
  1. Использование библиотеки Graph. . . . . . . . . . . . . . . . . . . . . . 4
    1. Переход в графический режим и возврат в текстовый. . . . . . . . . . . . . . . . 4
    2. Краткая характеристика графических режимов работы
дисплейных адаптеров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
  1. Процедуры и функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
  2. Координаты, окна, страницы . . . . . . . . . . . . . . . . . . . . . . . . . 9
  3. Линии и точки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
  4. Многоугольники . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
  5. Дуги, окружности, эллипсы . . . . . . . . . . . . . . . . . . . . . . . . . 18
  6. Краски, палитры, заполнения . . . . . . . . . . . . . . . . . . . . . . . . 20
  7. Примеры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
ЗАКЛЮЧЕНИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ. . . . . . . . . . . 28
Введение
В данной курсовой работе рассматриваются различные функции и процедуры предназначенные для изображения графических объектов в графическом режиме Турбо Паскаля.
Существует 2 вида работы монитора: текстовый и графический. Различие между текстовым и графическим режимами работы монитора заключается в возможностях управления выводом визуальной информации. В текстовом режиме минимальным объектом, отображаемым на экране, является символ, алфавитно-цифровой или какой-либо иной. В обычных условиях экран монитора, работающего в режиме алфавитно-цифрового дисплея, может содержать не более 80 символов по горизонтали и 25 символов по вертикали, то есть всего 2000 визуальных объектов. При этом имеются ограниченные возможности по управлению цветом символов. Конечно, в таком режиме можно выводить на экран не только обычный текст, но и некие графические изображения, однако понятно, что качество таких изображений будет вне всякой критики. Тем не менее, в «героическую» эпоху компьютерной эры этот метод был единственным и поэтому очень популярным способом вывода графиков и целых картин на экран (и на принтер). Программистам иногда удавалось создавать настоящие шедевры «компьютерной псевдографики». Но для серьезной работы с изображениями текстовый режим дисплея абсолютно не подходит. Поэтому целью данной работы является:
  1. Рассмотреть дополнительные графические возможности TurboPascal 7.0.
  2. Рассмотреть примеры по расчёту экранных координат.

  1. Использование библиотеки 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 адаптеры (SVGAc разрешени­ем 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}
CGAC= 1;
{Низкое разрешение, палитра 1}
CGAC= 2;
{Низкое разрешение, палитра 2}
CGAC= 3;
{Низкое разрешение, палитра 3}
CGAHi = 4;
{Высокое разрешение}
{Адаптер MCGA:}
MCGAC0 = 0
{Эмуляция CGAC0}
MCGAC1 = 1
{Эмуляция CGAC1}
MCGAC2 = 2
{Эмуляция CGAC2}
MCGAC= 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 = 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 GetGraphModeInteger;
Процедура SetGraphMode. Устанавливает новый графический режим работы адаптера. Заголовок:
Procedure SetGraphMode(ModeInteger);
Здесь 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 ('Опять графический режим...'); ReadLnCloseGraph;
end end.
В этом примере для вывода сообщений как в графическом, так и в текстовом ре­жиме используется стандартная процедура WriteLnЕсли Ваш ПК оснащен нерусифицированным адаптером CGAвывод кириллицы в графическом режиме таким спосо­бом невозможен, в этом случае замените соответствующие сообщения так, чтобы использовать только латинские буквы.
Процедура DetectGraph. Возвращает тип драйвера и режим его работы. Заголовок:
Procedure DetectGraph(var Driver,Mode: Integer);
Здесь Driver тип драйвераMode - режим работы.
В отличие от функции GetGraphMode описываемая процедура возвращает в пере­менной Mode максимально возможный для данного адаптера номер графического режима.
Функция GetDriverName. Возвращает значение типа Stringсодержащее имя загруженного графического драйвера. Заголовок:
Function GetDriverNameString;
Функция GetMaxMode. Возвращает значение типа Integerсодержащее количест­во возможных режимов работы адаптера. Заголовок:
Function GetMaxModeInteger;
Функция 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
:= 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).
<0x01 graphic>
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);
Здесь XY - новые координаты указателя соответственно по горизонтали и вертика­ли.
Координаты определяются относительно левого верхнего угла окна или, если окно не установлено, экрана.
Процедура MoveRel. Устанавливает новое положение указателя в относительных координатах.
Procedure MoveRel(DX,DY: Integer);
Здесь DX,DY -приращение новых координат указателя соответственно по горизон­тали и вертикали.
Приращения задаются относительно того положения, которое занимал указатель E моменту обращения к процедуре.
Процедура ClearDevice. Очищает графический экран. После обращения к про­цедуре указатель устанавливается в левый верхний угол экрана, а сам экран заполня­ется цветом фона, заданным процедурой SetBkColorЗаголовок:
Procedure ClearDevice;
Процедура ClearViewPort. Очищает графическое окно, а если окно не опреде­лено к этому моменту - весь экран. При очистке окно заполняется цветом с номером 0 из текущей палитры. Указатель перемещается в левый верхний угол окна. Заголовок:
Procedure ClearViewPort;
В следующей программе на экране создается окно, которое затем заполняется слу­чайными окружностями рис.2). После нажатия на любую клавишу окно очищает­ся. Для выхода из программы нажмите Enter.
Uses CRT,Graphvar
xl,yl,x2,y2,ErrInteger;
begin
{Инициируем графический режим}
xl := DetectInitGraph(xl,x2,'');
Err := GraphResult;
if Err<>grOk then
WriteLn(GraphErrorMsg(Err))
else
begin {Определяем координаты окна с учетом разрешения экрана}
<0x01 graphic>
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);
Здесь XY - координаты точки; Color - цвет точки.
Координаты задаются относительно левого верхнего угла окнаили, если окно не установлено, относительно левого верхнего угла экрана.
Следующая программа периодически выводит на экран «звездное небо» и затем гасит его. Для выхода из программы нажмите любую клавишу.
Uses CRTGraph;
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 do
with a[k] do {Зажигаем "звезду"}
PutPixel(x,y,white);
if not KeyPressed then for k := N downto 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);
Здесь XY - координаты нового положения указателя, они же - координаты второго конца линии.
Процедура LineRel. Вычерчивает линию от текущего положения указателя до положения, заданного приращениями его координат. Заголовок:
Procedure LineRel (DX, DY: Integer);
Здесь DXDY - приращения координат нового положения указателя. В процедурах LineTo и LineRel линия вычерчивается текущим стилем и текущим цветом.
Процедура SetLineStyle. Устанавливает новый стиль вычерчиваемых линий. Заголовок:
Procedure SetLineStyle(Type,Pattern,Thick: Word)
Здесь TypePatternThick - соответственно тип, образец и толщина линии. Тип линии может быть задан с помощью одной из следующих констант:
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распространяется на процедуры DrawpolyLineLineRelLineTo и RectangleДля задания параметра Mode можно ис-юльзовать следующие определенные в модуле константы:
const
CopyPut = 0; {Наложение операцией MOV}
XORPut = 1; {Наложение операцией XOR}
В следующем примере на экране имитируется вид часового циферблата (рис. 14.3). Для наглядной демонстрации темп хода «часов» ускорен в 600 раз (см. оператор Delау (100)). При желании Вы сможете легко усложнить программу, связав ее пока­зания с системными часами и добавив секундную стрелку. Для выхода из программы нажмите на любую клавишу.

<