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

  • Вид работы:
    Другое
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
  • Опубликовано:
    2010-10-09
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Министерство образования и науки РФ

ГОУ ВПО МО «Коломенский государственный педагогический институт»

















Курсовая работа по информатике на тему:

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






                                 

                                        


     выполнил: студент

                                          группы Инф 41 Малышев А.А.

                                          проверил: доц. Гуськова Е.Н.








 



Коломна 2008



СОДЕРЖАНИЕ



ВВЕДЕНИЕ  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1. Использование библиотеки Graph. . . . . . . . . . . . . . . . . . . . . . 4

1.1   Переход в графический режим и возврат в текстовый. . . . . . . . . . . . . . . . 4

1.2   Краткая характеристика графических режимов работы

дисплейных адаптеров . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . 4

2. Процедуры и функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5

3. Координаты, окна, страницы . . . . . . . . . . . . . . . . . . . . . . . . . 9

4. Линии и точки  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

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

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

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

8. Примеры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .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;

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]);

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,■'); SetColor(Red);   SetFillStyle(1,Red);

FillEllipse(225,240,160,160);           {большой красный круг}

SetColor(White);   SetFillStyle(1,White); FillEllipse(175,180,20,20);         {внутренний белый кружок}

Bar(220,160,235,320);   Bar(230,320,265,305);         {буква L}

Arc(225,240,90,360,125);                                                  {дуга  1}

Arc(225,240,90,360,140);                                                  {дуга  2}

Line(225,100,225,115);                     {черта,соединяющая дуги)

Bar(265,235,365,250);                       {черта в букве G справа)

FloodFill(220,110,White);               {               заливка буквы G}

{                   надпись                 }

SetColor(LightGray);   SetTextStyle(3,0,1); SetUserCharSize(4,l,4,l); for  x:=420   to  430  do

for y:=150   to  160  do OutTextXY(x,y,’LG’); {           смена цвета фона       }

ReadLn;   SetBkColor(LightRed); 

 ReadLn;   SetBkColor(White);

 ReadLn;   CloseGraph 

 END.

Arc(x,y. Integer, StartAngle, EndAngle, r: Word) - процедура рисования дуги радиуса г из центра с координатами (х,у). StartAngle и EndAngle -градусные меры начала и конца дуги. Для заливки замкнутого контура (изображения буквы G) можно использовать универсальную процедуру FloodFill(x,y: Integer, Border: Word). Она заливает область вокруг точки (х,у), ограниченную линиями цвета Border.

2)

Uses Crt,Graph;

Const r: Byte=10;

      draw: Boolean=true;

Var  Gd,Gm,x,y,columns,row: Integer;

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

 SetBkColor(LightGray); SetColor(Blue); SetFillStyle(1,Blue);

for columns:=1 to 7 do begin

    for row:=l to 7 do begin

        if columns>5 then Case columns of

              6: draw:=Not(row in [2,3]   );

              7: draw:=Not(row in [1..4.7]);

                      end;

if draw then FillEllipse(170+columns*35,60+row*35,r,r) end;

if columns in [1,3,5] then Inc(r,2) end;

SetTextStyle(l,0,l); SetUserCharSize(3,1,2,1) ;

 for x:=200 to 203 do

for y:=320 to 323 do OutTextXY(x,y,"SONY1); ReadLn; SetBkColor (White) ;

 ReadLn,SetPalette(l,5) ;

SetBkColor(Cyan); ReadLn; CloseGraph

 END.

Приведенная программа содержит вложенные циклы, параметры кото­рых используются при расчёте координат центров кругов.

3)

Uses Crt,Graph;

Var Gd,Gm,x,y,y0,i,k: Integer;

BEGIN Gd:=Vga; Gm:=VgaHi; InitGraph(Gd,Gm,■');

SetBkColor(Blue); SetColor(White);

for k:=0 to 1 do begin

{  внешний контур  }

Line(220+k,90,220+k,250);

Line(420-k,90,420-k,250);

 Line(220,90-k,420,90-k);

Arc(320,250,180,360,100-k);

Circle(320,250,90+k);     { внутренний круг }

for i:=l to 3 do                          {   3 синусоиды   }

for x:=230 to 410 do PutPixel(x,232+Round(6*Sin(x/15-6))+i*10+k,15);

{ 2 большие звезды }

Х:=270+к*100; у:=205+к*90; MoveTo(х,у-30);

LineTo(x+2,y-2); LineTo(х+30,у);

 LineTo(x+2,y+2); LineTo(x,y+30);

LineTo(x-2,y+2); LineTo(x-30,у) ;

LineTo(х-2,у-2); LineTo(x,y-30);

FloodFill(x,y,White);

{ 2 меньшие звезды }

 x:=290+k*60;  y:=185+k*130; MoveTo(x,y-20);

LineTo(x+l,y-l);  LineTo(x+20,у);

LineTo(x+l,y+l);  LineTo(x,y+20);

 LineTo(x-l,y+l);  LineTo(x-20,y);

 LineTo (x-l,y-l) ; LineTo(x,y-20); FloodFill(x,y,White) end;  {for}

SetFillStylefl,White); SetTextStyle(6,0,4); for x:=238 to 243 do

for y:=100 to 102 do OutTextXY(x,y,'P H I L I P S'); ReadLn; SetBkColor(Cyan);  ReadLn; SetBkColor(Red); ReadLn; CloseGraph END.

Параметр цикла к в программе используется для рисования пар без применения процедур, а также двойных линий.

4)

Uses     Crt,Graph;

Const xl=160;   yl=270;   x2=480;   y2=214; Var      Gd,Gm    :   Integer; x,y,a,b:   Longlnt;

BEGIN Qd:=Vga;   Om:=VgaHi;   InitGraph(Gd,Gm,' ') ;

for x:=150   to  495  do begin

a:=Sgr(x-xl); b:=Sqr(x-x2); for y:=180   to  300  do ^f  Sqrt(a+Sqr(y-y1))+

Sqrt(b+Sqr(y-y2))<334   then PutPixel(x,y,1)

{  else PutPixel (x,y,7)   } end;

SetColor(White);   SetTextStyle (3,0,1); SetUserCharSize(1,1,1,1) ; for x:=202   to 205  do for y:=220   to   223   do  OutTextXY(x,y, 'S A M S  U N G');

ReadLn;   SetBkColor(Cyan);  ReadLn;   SetBkColor(Blue); SetPalette(Blue,White);   SetPalette(White,Blue); ReadLn;   CloseGraph;

END.


ЗАКЛЮЧЕНИЕ

В данной курсовой работе описываются различные процедуры и функции, предназначенные для создания графических объектов в Турбо Паскале.

Используя  выше перечисленные процедуры и функции, я научился изображать различные фигуры различных форм и размеров, так же смог показать движение фигуры.

Написав данные программу, я получил навык работы в графической среде Турбо Паскаль, научился правильно применять разные процедуры и функции, точно определять и задавать координаты  различных линий, эллипсов, окружностей, прямоугольников и т.д. 





СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1)  Информатика(Базовый курс) С. В. Симонович, СПб: Питер, 2001г.

2)  Основы языка Turbo Pascal(учебный курс), П. И. Рудаков, М. А. Федотов, Москва: Радио и Связь, 2000г.

3)  Основы программирования в задачах и примерах, А. В. Милов, Харьков: ФОЛИО, 2002г.

4)  Практикум программирования на Turbo Pascal. Задачи, алгоритмы и решения.-2-е изд.-СПб.:ООО»ДиаСофтЮп», 2002.

5)  Практика программирования, Ю. Кетков, А. Кетков, СПб: БХБ/ Петербург, 2002г.

6)  Фаронов В.В. Turbo Pascal 7.0  Начальный курс. Учебное пособие.-М: Издательство «ОМД Групп», 2003.-616 с.:ил.

7) Turbo Pascal: учитесь программировать, О. А. Меженный, Москва: изд.дом «Вильямс», 2001г

Похожие работы на - Графические возможности TurboPascal 7.0

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!