Для використання графічних можливостей Турбо Паскаля необхідно в блоці опису uses підключити графічний модуль Graph. Модуль містить набір графічних функцій і процедур, основні з яких розглянуто нижче.
Графічні процедури
Arc (x, y: integer; St, En, R: word); {малювання дуги, де x, y - коорд. центру дуги, R - радіус, St, En - поч. і кінцевий кути. }
ClearDevice; {очищення екрана}
Circle (x, y: integer; R: word); {коло радіуса R
cцентром в точці (x, y)}
CloseGraph; {закриття графіки}
InitGraph (gd, gm: integer; Path: string); {ініціалізація графіки, де
gd - графічний драйвер,
gm - графічний режим,
Path - шлях розміщення файлу
з розширенням. bgi. }
Line (x1, y1, x2, y2: integer); {малювання лінії, що проходить через дві точки:
з координатами (x1, y1) та (x2, y2)}
LineRel (dx, dy: integer); {малювання лінії: dx, dy - прирости
координат до координат поточної
позиції курсору}
LineTo (x, y: integer); {малювання лінії, що проходить через поточну
позицію курсору і точку з координатами (x, y)}
Moveto (x, y: integer); {завдання координат поточної точки}
OutText (T: string); {виведення в поточну точку}
OutTextXY (x, y: integer; T: string); {висновок тексту в точку з координатами х, у}
Rectangle (x1, y1, x2, y2: integer); {малювання прямокутника: (x1, y1) та (x2, y2) - координати протилежних вершин}
PutPixel (x, y: integer; c: word); {виводить точку з координатами (х, у) кольором з}
Графічні функції
GetMaxX - визначає максимальний розмір екрану по осі x.
GetMaxY - визначає максимальний розмір екрану по осі y.
GetX - координата поточної позиції курсору по осі x.
GetY - координата поточної позиції курсору по осі y.
Машинні координати.
Початок машинної системи координат, напрямок осей, а також максимальні значення координат монітора показані на малюнку
На малюнку приведена також машинна (x m, y m) і фізична (x, y) системи координат. Для зображення на екрані точки з фізичними координатами (x, y) необхідно визначити її машинні координати (x m, y m). Розрахункові формули мають такий вигляд (спробуйте самостійно отримати ці формули):
x m = x 0 + x * M x,
y m = y 0-y * M y,
де M x, M y-масштаби відповідно по осях x і y, які показують кількість пікселів в одному фізичному одиниці,
x, y - фізичні координати точки,
x m, y m - машинні координати точки,
x 0, y 0 - машинні координати початку фізичної системи координат.
Приклад. Намалювати через весь екран горизонтальну і вертикальну лінії, що перетинаються в центрі монітора.
Етапи розробки програми зведені в таблицю.
Таблиця
N | Етапи програмування | Виконання |
1. | Постановка завдання | Намалювати через весь екран горизонтальну і вертикальну лінії, що перетинаються в центрі монітора. |
2. | Математичний опис | Зобразимо вид екрану з зазначенням координат необхідних ліній
|
3. | Розробка структограмми |
|
4. | Написання програми | Program P5; Uses graph; {підключення граф. модуля} Var gd, gm: integer; Begin gd: = detect; {визначення граф. драйвера} InitGraph (gd, gm, ''); {ініціалізація графіки} Line (0, round (GetMaxY / 2), GetMaxX, Round (GetMaxY / 2)); {гориз. Лін. } Line (round (GetMaxX / 2), 0, Round (GetMaxX / 2), GetMaxY); {Вертик. Лін. } Readln; {порожній введення} CloseGraph; {закриття графіки} End. |
5. | Налагодження і отримання результатів | Виконати самостійно |
Приклад. Написати програму побудови графіка функції y = x 2 для x ∈ [-1; 1].
Етапи розробки програми зведені в таблицю.
Таблиця
N | Етапи програмування | Виконання |
1. | Постановка завдання | Побудувати графік функції y = x 2 для x ∈ [-1; 1]. |
2. | Математичний опис | Зобразимо вид екрану, який ми хотіли б отримати після виконання програми.
|
3. | Розробка структограмми |
|
4. | Написання програми | Program P6; Uses graph; Var gd, gm: integer; x, y: real; x0, y0, xm, ym, Mx, My: integer; begin gd: = detect; InitGraph (gd, gm, ''); Mx: = 300; x0: = 320; My: = 440; y0: = 460; {Обрані для монітора 640 × 480 пікс.} For xm: = 20 to 620 do Begin x: = (xm-x0) / Mx; y: = sqr (x); ym: = round (y0-y * My); PutPixel (xm, ym, 1); End; |
Readln; CloseGraph; End. | ||
5. | Налагодження і отримання результатів | Виконати самостійно |
Модуль Graph
ТР має досить різноманітними засобами для роботи із стандартним VGA екраном (можливо також використання і та інших типів відеоадаптерів).
VGA адаптер має дозвіл 640х480 пікселів (точка (0,0) у лівому верхньому куті екрану), 16 кольорів.
Перед початком роботи з графікою необхідно її ініціалізувати, а по закінченні - "закрити". Всі графічні процедури і функції знаходяться в модулі Graph, тому також необхідно його підключення.
Загальна структура графічної програми:
Uses crt, graph;
var Gd, Gm: Integer;
begin
Gd: = Detect;
InitGraph (Gd, Gm, 'c: \ bp \ bgi');
...
{Тут побудова зображення}
...
ReadKey;
CloseGraph;
end.
Шлях c: \ bp \ bgi вказує розташування файлу egavga. bgi (драйвер графічного адаптера). На різний комп'ютерах цей шлях може бути різним. Якщо файл egavga. bgi помістити в каталог з програмою, то шлях можна не вказувати.
Основні графічні процедури та функції:
Побудова фігур
PutPixel (x, y, c) - відображає на екрані точку з координатами (x, y) і кольором c
Line (x1, y1, x2, y2) - малює лінію з початком в точці (x1, y1) і кінцем - (x2, y2)
Rectangle (x1, y1, x2, y2) - малює контур прямокутника з діагоналлю (x1, y1) - (x2, y2)
Bar (x1, y1, x2, y2) - малює зафарбований прямокутник з діагоналлю (x1, y1) - (x2, y2)
Circle (x, y, r) - малює коло з центром (x, y) і радіусом r
Ellipse (x, y, ba, ea, xr, yr) - малює дугу еліпса з центром в (x, y), горизонтальним і вертикальним радіусом xr і yr, і початковим і кінцевим кутом ba і ea
FillEllipse (x, y, xr, yr) - малює зафарбований еліпс з центром в (x, y), горизонтальним і вертикальним радіусом xr і yr
Визначення кольорів і стилів
GetPixel (x, y) - повертає колір пікселя з координатами (x, y)
SetColor (c) - встановлює колір зображення (для ліній)
SetFillStyle (p, c) - встановлює поточний стиль p і колір c (для "зафарбованих" фігур)
FloodFill (x, y, b) - зафарбовує замкнуту область з внутрішньої точкою (x, y) і кольором контуру b
Робота з текстом
OutTextXY (x, y, st) - виводить на екран рядок st з позиції (x, y)
SetTextStyle (f, d, s) - встановлює шрифт f, його напрям d і розмір
Повідомлення про помилки
function GraphErrorMsg (ErrorCode: integer): String; Повертає рядок повідомлення про помилку для заданого коду ErrorCode.
function GraphResult: integer; Повертає код помилки для останньою графічної операції.
Визначення адаптера, ініціалізація і перехід між текстом і графікою
procedure DetectGraph (var GraphDriver, GraphMode: integer); Перевіряє апаратуру і визначає який графічний драйвер і в якому використовується режимі (тип адаптера - у GraphDriver, режим - GraphMode).
function GetDriverName: string; oзвращает рядок з ім'ям поточного драйвера.
procedure InitGraph (var GraphDriver: integer; var GraphMode: integer; PathToDriver: String); ініціалізує графічну систему і встановлює пристрій в графічний режим. PathToDriver - повний шлях до драйвера. bgi, звичайно 'c: \ tp \ bgi'. Якщо шлях опущений (''), то драйвер повинен знаходиться в поточному каталозі.
function RegisterBGIfont (Font: pointer): integer; Реєструє шрифт BGI для графічної системи. Зареєстрований фонт може використовуватися у виклику SetTextStyle. Він може бути завантажений з диска в купу або перетворений в. obj файл (за допомогою binobj. exe) і пов'язаний у файл. exe. У випадку помилки функція повертає від'ємне значення.
function RegisterBGIdriver (Driver: pointer): integer; Реєструє драйвер BGI для графічної системи. Зареєстрований драйвер буде використовуватися процедурою InitGraph. Він може бути завантажений з диска в купу або перетворений в. obj файл (за допомогою binobj. exe) і пов'язаний у файл. exe. У випадку помилки функція повертає від'ємне значення.
function InstallUserDriver (DriverFileName: string; AutoDetectPtr: pointer): integer; Встановлює користувальницький драйвер пристрою в BGI таблицю драйверів пристроїв.
function InstallUserFont (FontFileName: string): integer, Встановлює новий шрифт, який не вбудований в BGI систему.
procedure SetGraphBufSize (BufSize: word); Дозволяє змінити розмір буфера для функцій заповнення (закрасок). Буфер з розміром BufSize байт розміщується в купі при зверненні до InitGraph. За замовчуванням розмір 4К, що достатньо для побудови багатокутника з 650 лініями.
function GetMaxMode: integer; Повертає номер максимального режиму поточного завантаженого драйвера.
procedure GetModeRange (GraphDriver: integer; var LoMode, HiMode: integer); Повертає мінімальний і максимальний графічні режими для цього драйвера.
function GetModeName (GraphMode: integer): string; Повертає рядок з ім'ям зазначеного графічного режиму.
procedure SetGraphMode (Mode: integer); Перекладає систему у вказаний графічний режим і очищує екран.
function GetGraphMode: integer; Повертає поточний графічний режим.
procedure GraphDefaults; Встановлює поточний покажчик (CP) у вихідну позицію (тобто точку 0,0) і скидає всі встановлювані користувачем режими в початковий стан, у т. ч. вікна, палітру, основний колір і колір фону, стиль ліній, шрифт, вирівнювання тексту, розмір символів і стиль виведеного тексту. Система повинна знаходитися в графічному режимі.
procedure RestoreCrtMode; Відновлює текстовий відеорежим, який був до ініціалізації графіки. Не звільняє буфер і не обнуляє встановлені змінні.
procedure CloseGraph; Закриває графічну систему. Відновлює текстовий відеорежим, який був до ініціалізації графіки. Звільняє буфер і скидає всі графічні змінні.
Координати графічного курсору
function GetX: integer; Повертає координату X поточної позиції (CP).
function GetY: integer; Повертає координату Y поточної позиції (СР).
function GetMaxX: integer; возврашалась максимальний Х (дозвіл по горизонталі) для поточного графічного драйвера і режиму.
function GetMaxY: integer, Повертає максимальний Y (дозвіл по вертикалі) для поточного графічного драйвера і режиму.
Відмінності графіки Турбо-Паскаля і Турбо-Сі
Турбо-Паскаль не розрізняє відмінностей у регістрах (маленькі чи великі літери) при написанні констант, типів, процедур і функцій модуля Graph. У Турбо-Сі усі константи, типи, змінні повинні бути в верхньому регістрі (великими літерами), а назви процедур і функцій - в нижньому (прописними літерами). Утримання бібліотек графіки при цьому абсолютно однаково.
НЕДОЛІКИ BGI-ГРАФІКИ
Незважаючи на великі можливості для ділової графіки, графічні засоби з точки зору професійного розробника залишають бажати кращого. Не можна працювати з довільними спрайтами, немає скролінгу екрану, збереження / виводу всього зображення, масштабування картинки, функції заповнення та роботи з бітовими образами працюють повільно, неможливе використання файлів інших графічних форматів, відсутні тривимірні зображення і т.д. Все це утруднює написання графічних редакторів, іграшок, систем інженерного та математичної графіки. Для реалізації вищевказаних можливостей необхідно безпосередньо керувати графічним адаптером, використовуючи прямий доступ в відеопам'ять і службові функції BIOS.