Графические возможности 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 адаптеры (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:\TP\BGI');

. . .

Если тип адаптера ПК неизвестен или если программа рассчитана на работу с лю­бым адаптером, используется обращение к процедуре с требованием автоматического определения типа драйвера:

Driver := Detect;

InitGraph(Driver, Mode, 'C:\TP\BGI');

После такого обращения устанавливается графический режим работы экрана, а при выходе из процедуры переменные 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:\Pascal\Drivers');

Замечание. Во всех следующих примерах процедура 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)). При желании Вы сможете легко усложнить программу, связав ее пока­зания с системными часами и добавив секундную стрелку. Для выхода из программы нажмите на любую клавишу.

<>

Uses Graph, CRT;

Var d, r, rl,r2,rr,k,Xl,yl,x2,y2,x01,y01: Integer,

Xasp,Yasp : Word;

begin

{Инициируем графику}

d:= detect;

InitGraph(d, r, '');

k:= GraphResult;

if k <> grOK then

WriteLn(GraphErrorMSG(к))

else

begin

{Определяем отношение сторон и размеры экрана}

xl:= GetMaxX div 2;

yl:= GetMaxY div 2;

GetAspectRatio(Xasp, Yasp);

{Вычисляем радиусы:}

r:=round(3*GetMaxY*Yasp/8/Xasp);

rl:=round(0.9*r);{Часовые деления}

r2:=round(0.95*г); {Минутные деления}

{Изображаем циферблат}

Circle(xl,yl,г); {Первая внешняя окружность} Circle(xl,yl,round(1.02*г)); {Вторая окружность}

for к := 0 to 59 do {Деления циферблата}

begin

if к mod 5=0 then

rr:=rl {Часовые деления}

else

rr:=r2; {Минутные деления}

{Определяем координаты концов делений}

х01:= xl+Round(rr*sin(2*pi*k/60));

у01:= yl-Round(rr*Xasp*cos(2*pi*k/60)/Yasp);

x2 := xl+Round(r*sin(2*pi*k/60)) ;

y2 := yl-Round(r*Xasp*cos(2*pi*k/60)/Yasp);

Line(x01,y01,x2,y2) (Выводим деление} end;

{Готовим вывод стрелок}

SetWriteMode(XORPut);

SetLineStyle(SolidLn,0,ThickWidth);

r := 0; {Счетчик минут в одном часе}

{Цикл вывода стрелок}

repeat

for к := 0 to 59 do {k = минуты}

if not KeyPressed then begin

{Координаты часовой стрелки}

x2 := xl+Round(0.85*rl*sin(2*pi*r/60/12));

y2 := yl-Round(0.85*rl*Xasp*COs(2*pi*r/60/12)/Yasp);

{Координаты минутной стрелки}

х01 := xl+Round(r2*sin(2*pi*k/60));

yOl := yl-Round(r2*Xasp*cos(2*pi*k/60)/Yasp);

{Изображаем стрелки}

Line(xl,yl,x2,y2);

Line(xl,yl,x01,y01);

Delay(100); {Для имитации реального темпа

нужно установить задержку 60000}

{Для удаления стрелок выводим их еще раз!}

Line(xl,yl,х01,yOl);

Line(xl,yl,x2,y2) ;{Наращиваем и корректируем счетчик минут в часе};

Inc(r);

if r=12*60 then

r := О

end

until KeyPressed;

if ReadKey=#0 then k:=ord(ReadKey) ;

CloseGraph end

end.

5. Многоугольники

Процедура Rectangle. Вычерчивает прямоугольник с указанными координатами углов. Заголовок:

Procedure Rectangle(XI,Yl,Х2,Y2: Integer);

Здесь X1...Y2 - координаты левого верхнего (XI, Y1) и правого нижнего (Х2, Y2) углов прямоугольника. Прямоугольник вычерчивается с использованием текущего цвета и текущего стиля линий.

В следующем примере на экране вычерчиваются 10 вложенных друг в друга пря­моугольников.

Uses Graph, CRT;

Var d,r,e,xl,yl,x2,y2,dx,dy: Integer;

begin

{Инициируем графику}

d := Detect; InitGraph(d, r, '');

e := GraphResult;

if e <> grOK then

WriteLn(GraphErrorMsg(e)) else

begin

{Определяем приращения сторон}

dx := GetMaxX div 20;

dy := GetMaxY div 20;

{Чертим вложенные прямоугольники}

for d := 0 to 9 do

Rectangle(d*dx,d*dy,GetMaxX-d*dx,GetMaxY-d*dy);

if ReadKey=#0 then d:=ord(ReadKey);

CloseGraph end j

end.

Процедура DrawPoly. Вычерчивает произвольную ломаную линию, заданную координатами точек излома.

Procedure DrawPoly(N: Word; var Points)

Здесь N - количество точек излома, включая обе крайние точки; Points - перемен­ная типа PointType, содержащая координаты точек излома.

Координаты точек излома задаются парой значений типа Word: первое определяет горизонтальную, второе - вертикальную координаты. Для них можно использовать следующий определенный в модуле тип:

type

PointType = record

x,y:word

end;

При вычерчивании используется текущий цвет и текущий стиль линий. Вот как, например, можно с помощью этой процедуры вывести на экран график синуса:

Uses Graph;

Const N = 100; (Количество точек графика}

Var d, r, e: Integer;

m:array [0..N+1] of PointType;

k : Word;

begin

{Инициируем графику} d := Detect; InitGraph(d, r, '');

e := GraphResult;

if e <> grOk then,

WriteLn(GraphErrorMsg(e))

else begin

{Вычисляем координаты графика}

for k := 0 to N do with m[k] do begin

x := trunc(k*GetMaxX/N);

у := trunc(GetMaxY*(-sin(2*Pi*k/N)+l)/2) end;

{Замыкаем график прямой линией}

m[succ(N)].x := m[0] .x;

m[succ(n)].y := m[0] .у;

DrawPoly(N + 2, m); ReadLn; CloseGraph

end

end.

В этом примере для проведения горизонтальной прямой используется «замыкание» ломаной - первая и последняя координаты ее точек излома совпадают.

Замечу, что хотя количество точек излома N - выражение типа Word, на самом деле внутри процедуры на этот параметр накладываются ограничения, связанные с конеч­ным размером используемой буферной памяти. Вы можете убедиться в этом с помо­щью, например, изменения N в предыдущем примере: при N==678 график перестанет выводиться на экран, а функция GraphResult будет возвращать значение -6 (не хватает памяти для просмотра областей). Таким образом, для этой программы пороговое зна­чение количества точек излома составляет 679.

6. Дуги, окружности, эллипсы

Процедура Circle. Вычерчивает окружность. Заголовок:

Procedure Circle(X,Y: Integer; R: Word);

Здесь X, Y- координаты центра; R - радиус в пикселях.

Окружность выводится текущим цветом. Толщина линии устанавливается текущим стилем, вид линии всегда SolidLn (сплошная). Процедура вычерчивает правильную окружность с учетом изменения линейного размера радиуса в зависимости от его направления относительно сторон графического экрана, т.е. с учетом коэффициента GetAspectRatio. В связи с этим параметр R определяет количество пикселей в горизон­тальном направлении.

В следующем примере в центре экрана создается окно, постепенно заполняющееся случайными окружностями. Для выхода из программы нажмите на любую клавишу.

Uses Graph, CRT;

Var d,r,e,x,y: Integer;

begin

{Инициируем графику}

d := Detect;

InitGraph(d, r, ' ') ;

e := GraphResult;

if e <> grOK then WriteLn(GraphErrorMsg(e)) else begin

{Создаем окно в центре экрана}

х := GetMaxX div 4;

у := GetMaxY div 4;

Rectangle(x,у,3*х,3*у);

SetViewPort(x+l,y+l,3*x-l,3*y-l,ClipOn);

{Цикл вывода случайных окружностей}

repeat

SetColor(succ(Random(white))); {Случайный цвет}

SetLineStyle(0,0,2*Random(2)+1); {и стиль линии}

x := Random(GetMaxX); {Случайное положение}

у := Random(GetMaxY); {центра окружности}

Circle(x,у,Random(GetMaxY div 4)); until KeyPressed;

if ReadKey=#0 then x := ord(ReadKey); CloseGraph

end

end.

Процедура Arc. Чертит дугу окружности. Заголовок:

Procedure Arc(X,Y: Integer; BegA,EndA,R: Word);

Здесь X, Y - координаты центра; BegA, EndA - соответственно начальный и конеч­ный углы дуги;

R - радиус.

Углы отсчитываются против часовой стрелки и указываются в градусах. Нулевой угол соответствует горизонтальному направлению вектора слева направо. Если задать значения начального угла 0 и конечного - 359, то будет выведена полная окружность. При вычерчивании дуги окружности используются те же соглашения относительно линий и радиуса, что и в процедуре Circle.

Вот как выглядят две дуги: одна с углами 0 и 90, вторая 270 и 540 градусов (рис. 14.6):

<>

Процедура Ellipse. Вычерчивает эллипсную дугу. Заголовок:

Procedure Ellipse(X,Y: Integer; BegA,EndA,RX,RY: Word);

Здесь X, Y - координаты центра; BegA, EndA - соответственно начальный и конечный: углы дуги; RX, RY- горизонтальный и вертикальный радиусы эллипса в пикселях.

При вычерчивании дуги эллипса используются те же соглашения относительно лв-ний, что и в процедуре Circle, и те же соглашения относительно углов, что и в процедуре Arc. Если радиусы согласовать с учетом масштабного коэффициента GetAspectRatio, будет вычерчена правильная окружность.

В следующей программе вычерчиваются три эллипсных дуги (рис. 14.7) при разных отношениях радиусов. Замечу, что чем выше разрешение графического экрана, тем ближе к единице отношение сторон и тем меньше первый график отличается от третьего.

<>

Uses Graph, CRT;

Var d,r,e: Integer; xa,ya: Word;

begin

{Инициируем графику} d := Detect;

InitGraph(d, r, ' ') ;

e := GraphResult; if e <> grOK then

WriteLn(GraphErrorMsg(e))

else begin

{Первый график}

OutTextXY(50,40,'RX = RY'); {Надпись}

Line (0,100,160,100); {Ось X}

Line (80,55,80,145); {Ось У}

Ellipse (80,100,180,90,40,40);

{Второй график}

OutTextXY(260,40,'RX = 5*RY');

Line (190,100,410,100);

Line (300,55,300,145);

Ellipse (300,100,0,359,100,20);

{Третий график}

OutTextXY(465,40,'Aspect Ratio');

Line (440,100,600,100);

Line (520,55,520,145);

GetAspectRatio(xa, ya) ;

Ellipse (520,100,0,270,40,round(40*(xa/ya)));

if ReadKey=#0 then d := ord(ReadKey);

CloseGraph end end.

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

Процедура SetColor. Устанавливает текущий цвет для выводимых линий и симво­лов. Заголовок:

Procedure SetColor(Color: Word);

Здесь Color - текущий цвет.

В модуле Graph определены точно такие же константы для задания цвета, как и в модуле CRT .

Функция GetColor. Возвращает значение типа Word, содержащее код текущего цвета. Заголовок:

Function GetColor: Word;

Функция GetMaxColor. Возвращает значение типа Word, содержащее макси­мальный доступный код цвета, который можно использовать для обращения к SetColor. Заголовок:

Function GetMaxColor: Word;

Процедура SetBkColor. Устанавливает цвет фона. Заголовок: Procedure SetBkColor(Color: Word);

Здесь Color - цвет фона.

В отличие от текстового режима, в котором цвет фона может быть только темного оттенка, в графическом режиме он может быть любым. Установка нового цвета фона немедленно изменяет цвет графического экрана. Это означает, что нельзя создать изо­бражение, два участка которого имели бы разный цвет фона. Для CGA-адаптера в режиме высокого разрешения установка цвета фона изменяет цвет активных пикселей. Замечу, что после замены Цвета фона на любой, отличный от 0 (Black) цвет, Вы не сможете более использовать цвет 0 как черный, он будет заменяться на цвет фона, т.к. процедуры модуля Graph интерпретируют цвет с номером 0 как цвет фона. Это озна­чает, в частности, что Вы уже не сможете вернуть фону черный цвет!

Если Ваш ПК оснащен цветным экраном, следующая программа продемонстрирует работу процедуры SetBkColor. Программа выводит десять вложенных друг в друга прямоугольников, после чего циклически меняет цвет фона. Для выхода из программы достаточно нажать на любую клавишу.

Uses Graph, CRT;

Const NC: array [0..15] of String [12] =

('Black','Blue','Green','Cyan','Red','Magenta', 'Brown','LightGray','DarkGray','LightBlue', 'LightGreen','LightCyan','LightRed', 1LightMagenta','Yellow','White'); var

d, r, e, k, color, dx, dy: Integer;

begin

{Инициируем графику}

d := Detect; InitGraph(d, r, ");

e := GraphResult;

if e <> grOK then

WriteLn(GraphErrorMsg(e))

else

begin

{Выводим текст в центре экрана}

OutTextXY(200,GetMaxY div 2,'BACKGROUND COLOR');

dx -:= GetMaxX div 30; {Приращение длины}

dy := GetMaxY div 25; {Приращение высоты}

for k := 0 to 9 do {Выводим 10 прямоугольников}

Rectangle(k*dx,k*dy,GetMaxX-k*dx,GetMaxY-k*dy);

color := black; (Начальный цвет фона}

repeat {Цикл смены фона}

SetBkColor(color);

SetFillStyle(0,Color);

Bar(345,GetMaxY div 2,440,GetMaxY div 2+8);

OutTextXY(345,GetMaxY div 2,NC[color]);

delay(1000);

inc(color);

if color > White then color := Black until KeyPressed;

if ReadKey=#0 then к := ord(ReadKey); CloseGraph end end.

Функция GetBkColor. Возвращает значение типа Word, содержащее текущий цвет фона. Заголовок:

Function GetBkColor: Word;

Процедура SetPalette. Заменяет один из цветов палитры на новый цвет. Заго­ловок:

Procedure SetPalette(N: Word; Color: ShortInt);

Здесь N- номер цвета в палитре; Color - номер вновь устанавливаемого цвета.

Данная процедура может работать только с адаптерами EGA или VGA. Она не должна использоваться с IBM8514 или 256-цветным вариантом VGA - для этих адапте­ров предназначена особая процедура SetRGBPalette (см. ниже). Первоначальное раз­мещение цветов в палитрах EGA/VGA соответствует последовательности их описания константами Black,...,White, т.е. цвет с индексом 0 - черный, 1 - синий, 2 - зеленый и т.д. После обращения к процедуре все фрагменты изображения, выполненные цветом с индексом N из палитры цветов, получат цвет Color. Например, если выполнить опе­ратор

SetPalette(2,White) ;

то цвет с индексом 2 (первоначально это - бирюзовый цвет Cyan) будет заменен на белый. Замечу, что цвет с индексом 0 отождествляется с цветом фона и может изме­няться наряду с любым другим цветом.

Функция GetPaletteSize. Возвращает значение типа Integer, содержащее раз­мер палитры (максимальное количество доступных цветов). Заголовок:

Function GetPaletteSize: Integer;

Процедура GetDefaultPalette. Возвращает структуру палитры, устанавли­ваемую по умолчанию (в режиме автонастройки). Заголовок:

Procedure GetDefaultPalette(var Palette: PaletteType);

Здесь Palette - переменная типа PaletteType (см. процедуру GetPalette), в которой воз­вращаются размер и цвета палитры.

Процедура SetFillStyle. Устанавливает стиль (тип и цвет) заполнения. Заго­ловок:

Procedure SetFillStyle(Fill,Color: Word);

Здесь Fill - тип заполнения; Color - цвет заполнения.

С помощью заполнения можно покрывать какие-либо фрагменты изображения пе­риодически повторяющимся узором. Для указания типа заполнения используются следующие предварительно определенные константы:

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 - цвет гра­ничной линии.

Если фигура незамкнута, заполнение «разольется» по всему экрану.

Следует учесть, что реализованный в процедуре алгоритм просмотра границ замк­нутой фигуры не отличается совершенством. В частности, если выводятся подряд две пустые строки, заполнение прекращается. Такая ситуация обычно возникает при за­полнении небольших фигур с использованием типа LtSlashFill. В фирменном руково­дстве по Турбо Паскалю рекомендуется, по возможности, вместо процедуры FloodFill использовать FillPoly (заполнение прямоугольника).

Процедура Bar. Заполняет прямоугольную область экрана. Заголовок:

Procedure Bar(XI,Y1,X2,Y2: Integer);

Здесь X1...Y2 - координаты левого верхнего (XI, Y1) и правого нижнего (Х2, Y2) углов закрашиваемой области. т

Процедура закрашивает (но не обводит) прямоугольник текущим образцом узора и текущим цветом, которые устанавливаются процедурой SetFillStyle.

Следующая программа дает красивые цветовые эффекты (закраска случайных прямоугольников).

Uses Graph, CRT; var d, г, е : Integer;

begin

{Инициируем графику} d := Detect; InitGraph(d, r, '');

e := GraphResult;

if e <> grOk then

WriteLn(GraphErrorMsg(e)) else begin

{Создаем окно в центре экран}

d := GetMaxX div 4;

r := GetMaxY div 4;

Rectangle(d,r,3*d,3*r);

SetViewPort(d+1,r+1,3*d-l,3*r-l,ClipOn);

{Цикл вывода и закраски случайных многоугольников}

repeat

SetFillStyle(Random(12),Random(succ(GetMaxColor)));

Bar(Random(GetMaxX),Random(GetMaxY), Random(GetMaxX),Random(GetMaxY));

until KeyPressed;

if ReadKey=#0 then d := ord(ReadKey); CloseGraph

end end.

Процедура ВагЗР. Вычерчивает трехмерное изображение параллелепипеда и за­крашивает его переднюю грань . Заголовок:

Procedure Bar3D (XI,Y1,X2,Y2,Depth: Integer; Top: Boolean);

8. Примеры

Нарисовать эмблемы фирм: 1) LG; 2) SONY; 3) PHILIPS; 4) SAMSUNG (рис.1-4,).

Эмблемы известных фирм содержат много любопытной информации. Так два года шла работа над проектом новой эмблемы группы "Samsung". Её динамичный дизайн соответствует облику успешно прогрессирующего и растущего предприятия. Голубой цвет означает стабильность и надёж­ность. Эллипс символизирует движение мира через космос, несёт в себе идею постоянного изменения и обновления. Первая и последняя буквы в слове Samsung слегка выступают за рамку овала, что отражает связь внут­реннего и внешнего, показывает стремление фирмы быть единым со всем миром и служить обществу как единому целому.

Изучая эмблемы как геометрические объекты, можно найти немало интересного и в моделировании их на дисплее. Рассмотрим некоторые эмблемы в качестве упражнений по расчёту экранных координат.

1)

Uses Crt,Graph;

Var Gd,Gm,x,y: Integer;

BEGIN Gd:=Vga; Gm:=VgaHi; InitGraph(Gd,Gm,