Модуль Graph у програмі Turbo Pascal
Ім'я константи режиму та її значення
Роздільна здатність екрана (у точках)
Щоб повністю використати можливості встановленого в ПК адаптера, необхідно скористатися інструкцією по роботі з ним.
ПроцедураDetectGraph.Для тестування графічного адаптера в модулі Graph оголошено процедуру:
DetectGraph (VAR GraphDriver, GraphMode: Integer)
Ця процедура може бути викликана до ініціалізації графіки. Через формальний параметр GraphDriver повертається значення першого стовпця таблиці зазначеної вище таблиці, а через параметр GraphMode - зазвичай останнє значення з відповідного розділу другого стовпця. Ці значення і рекомендується підставляти як фактичні параметри в процедуру InitGraph. Після визначення GraphDriver автоматично стає доступним діапазон графічних режимів, реалізованих адаптером
Існує можливість маніпуляції режимами роботи графічного адаптера – за допомогою групи процедур та функцій, але вже після ініціалізації графіки. Але часто важливо спочатку визначити дозволені значення режимів.
Діапазони графічних режимів.Номер поточного графічного режиму для встановленого драйвера визначається функцією
повертає номер максимального режиму для графічного адаптера; таким чином кожен драйвер підтримує діапазон режимів 0. GetMaxMode . Зазвичай цей результат можна отримати з процедури
GetModeRange (GraphDriver: Integer; VAR LoMode, HiMode: Integer),
через параметриLoModeіHiMode,повертає відповідно нижню та верхню межу режимів для драйвера GraphDriver . Але з ряду технічних міркувань кращекористуватися функцією GetMaxMode, вважаючи мінімальний номер режиму рівним нулю.
GetModeName (GraphMode: Word): String.Функція повертає рядок, в якому міститься послідовно через пробіли роздільну здатність, ім'я константи і іноді назва палітри, наприклад, '640x200 CGA'. Поданий приклад допоможе визначити, у яких графічних режимах може працювати використовувана ПЕОМ.
for mode := 0 to GetMaxMode do
OutTextXY(10, 10+mode*10, GetModeName( mode ) );
ФункціяGetDriverName:Stringдозволяє отримати ім'я драйвера, що використовується. Її застосування обґрунтоване лише в тому випадку, якщо в процедурі InitGraph змінна GraphDriver визначена як Detect .
Очищення екрана та перемикання режимів
Очищення графічного екрана.Дві наступні процедури виконують майже однакові дії, тільки перша з них є як би підмножиною другої:
ClearDevice
Ця процедура очищає графічний екран і встановлює покажчик позиції (0, 0), а процедура
GraphDefaultsкрім очищення екрана встановлює ряд параметрів графічної системи:
графічне вікно стає рівним розміру екрана;
відновлюється системна палітра кольорів;
перепризначаються кольори основних ліній та фону екрану;
товщина та стиль ліній приймаються як за умовчанням;
колір і шаблон заливання геометричних фігур і замкнутих ламаних приймається як за замовчуванням;
встановлюється активний шрифт і його стиль.
Процедура GraphDefaults неявно викликається під час ініціалізації графіки і виконує, no -суті, всі стартові установки графічних параметрів.
Переключення режимів. Воно здійснюється процедуроюSetGraphMode(GraphMode:Integer)
Процедура перемикає систему у вказаний параметром GraphMode режим та очищає екран монітора. При цьому всі параметри встановлюються за замовчуванням. Такі перемикання можливі лише у межах поточного драйвера.
ПроцедураRestoreCRTMode.При написанні деяких пакетів, що використовують і графічні, і текстові режими роботи, може використовуватися процедура RestoreCRTMode , яка повертає систему в текстовий режим, що працював до ініціалізації графіки. Здавалося б, вже є процедура з подібною дією - CloseGraph. Однак після неї повернення в графічний режим має проводитися через процедуру InitGraph, що досить складно. Якщо ж скористатися процедурою RestoreCRTMode, то повернення в графіку буде досить простим
graph _ str = 'Це графічний режим';
text _ str = 'А це текстовий режим';
graph _ back = 'А це знову графічний режим';
Зворотне перемикання здійснюється за допомогою функції GetGraphMode, яка повертає номер поточного графічного режиму. Під час роботи RestoreCRTMode вивантаження графічного драйвера немає, тобто. він залишається у пам'яті активним.
Системи координат та «поточний покажчик»
Щоб отримати інформацію про поточний стиль ліній, можна скористатися процедурою
А щоб встановити новий стиль ліній, необхідно використовувати процедуруSetLineStyle(LineStyle,Pattern,Thickness:Word),підставивши до неї відповідні значення. Якщо параметрLineStyleне дорівнюєUserBitLn, то значення параметраPatternне відіграє ролі і зазвичай задається нулем.
Розглянемо докладно варіант, колиLineStyleдорівнюєUserBitLn. В цьомуУ разі визначення типу лінії керуються такими міркуваннями:
Лінія є сукупністю відрізків, кожен з яких має довжину 16 пікселів. Якщо довжина лінії не ділиться на 16 націло, останній відрізок обрізається.
Можна задати шаблон-комбінацію шістнадцяти пікселів, що світяться або погашені. Його представляють як безліч одиниць та нулів: 1 – світиться, 0 – ні. Наприклад, дрібний рівномірний пунктир задається як1100110011001100 - всього 16 розрядів.
Оскільки Турбо Паскаль не дозволяє працювати з числами, представленими в двійковій системі числення, необхідно перевести отримане число в десяткову (52428) або шістнадцяткову ($СССС) систему числення і підставити його фактичним параметром на місце Pattern при виклику SetLineStyle .
SetLineStyle (DottedLn, 0, NormWidth);
SetLineStyle (CenterLn, 0, NormWidth);
SetLineStyle(UserBitLn, $CCCC, NonriWidth);
SetLineStyle(UserBitLn, $B38F, NormWidth);
SetLineStyle(UserBitLn, $4C70, NormWidth);
SetLineStyle( DottedLn, 0, ThickWidth );
SetLineStyle(CenterLn, 0, ThickWidth);
SetLineStyle(UserBitLn, $СССС, ThickWidth);
SetLineStyle (UserBitLn, $ B38F, ThickWidth);
SetLineStylef UserBitLn, $4С70, ThickWidth);
У цьому прикладі на екрані монітора малюється п'ять горизонтальних ліній різної товщини: дві намальовані системним шаблоном, а три - шаблоном, заданим нами.
Призначення стилю ліній впливає на дію всіх процедур, що виводять на екран відрізки або фігури, що складаються з них. Процедури, що виводять на екран дуги, враховують товщину, задану в стилі.
Коефіцієнт стиснення зображення
Якщо намалювати квадрат відрізками, наприклад
LineRel(20, 0); LineRel (0, 20);
LineRel (-20, 0); LineRel (0, -20);
то на екрані, швидше за все, виникне стислий прямокутник. Схожа картина спостерігатиметься, якщо «вручну» намалювати коло за допомогою відрізків прямих чи точок: вийде еліпс. Це пов'язано з тим, що відношення висоти екрану до ширини не дорівнює відношенню його роздільної здатності по вертикалі до роздільної здатності по горизонталі. Для врахування цієї нерівності у графічному стандарті BGI вводиться спеціальний показник, званий коефіцієнтом стиснення зображення (aspect ratio). Його значення можуть мати широкий спектр. Наприклад, для ПК IBM PC/XT/AT стандартні монітори мають відношення висоти екрану до його ширини, що дорівнює 0,75. При цьому роздільна здатність адаптерів коливається від 640×200 для CGA до 1024×768 IBM 8514, і відношення GetMaxY до GetMaxX може змінюватися від 0,3125 (640×200) до 0,75 (640×480, 1024×7). Таким чином, на одиницю довжини осі екрана припадає різна кількість пікселів по горизонталі та вертикалі, а оскільки всі операції проводяться з пікселами, то в результаті замість кола може вийти еліпс, горизонтальна піввісь якого дорівнює радіусу, а вертикальна - радіусу, поділеному на коефіцієнт стиснення зображення .
У модулі Graph є дві процедури, які допомагають усунути незручність. Перша з них
повертає змінних A і B значення, відношення яких (А/В) відповідає коефіцієнту стиснення зображення. У модулі Graph немає жодного речовинного параметра (що підвищує швидкодію), тому всі цілі значення видаються як відношення двох цілих.
Дозволяє змінювати поточний коефіцієнт стиснення на коефіцієнт, що дорівнює (А/В). Перепризначення коефіцієнта стиснення впливає роботу всіх процедур, виводять кола,еліпси, дуги та значення параметрів, що повертаються при виклику процедури GetAspectRatio . Побудувати правильний квадрат можна, примножуючи його вертикальний розмір на вихідний (системний) коефіцієнт стиснення.