МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
ДЕРЖАВНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ПОБУДОВА ЕЛЕМЕНТАРНИХ ГЕОМЕТРИЧНИХ ЗОБРАЖЕНЬ В СЕРЕДОВИЩІ ТУРБО-ПАСКАЛЬ
ІНСТРУКЦІЯ
До лабораторної роботи № 1
з курсу «Комп’ютерна графіка»
Затверджено
на засiданнi кафедри
"Автоматика та телемеханiка"
Протокол N 11 вiдp 17.02.2000p.
Львів 2000
Mета роботи - навчитися ініціалізувати графічний режим та вивчити основні графічні оператори мови Турбо-Паскаль, набути практичних навиків в складанні програм для побудови геометричних зобра-жень та графіків функцій.
1. КОРОТКІ ТЕОРЕТИЧНІ ДАНІ
Після запуску програми з середовища Турбо-Паскаля екран знаходиться в текстовому режимі, тому для використання графічних засобів комп'ютера необхідна програма, яка б ініціалізувала графіч-ний режим роботи відеоадаптера. Після завершення роботи програми ПК повертається в текстовий ре-жим.
Всі процедури та функції, необхідні для графічного режиму роботи адаптера, знаходяться в модулі GRAPH.TPU і стають доступними лише після запису на початку програми оператора USES GRAPH.
Графічний режим роботи адаптера встановлює процедура INITGRAPH; формат звертання
INITGRAPH ( <драйвер>, <режим>, <шлях> ) ,
де
<драйвер> - змінна типу integer, яка визначає тип графічного драйвера;
<режим> - змінна типу integer, яка визначає режим роботи графічного адаптера;
<шлях> - вираз типу string, який вказує на шлях до файлу драйвера.
До моменту звертання до процедури на одному з дисків має знаходитися файл графічного драйвера (з розширенням bgi). Для визначення типу драйвера в модулі є такі константи:
const
Detect = 0; {режим автовизначення типу}
CGA = 1;
MCGA = 2;
EGA = 3;
EGA64 = 4;
EGAMono = 5;
IBM8514 = 6;
. . .
VGA = 9;
PC3270 = 10.
Для визначення режиму роботи адаптера значенням змінної <режим> може бути одна з констант, що знаходиться в модулі (в режимі автовизначення типу драйвера встановлюється максимально можливий режим роботи для відеоадаптера):
const
CGAC0 = 0; {320x200, 1 сторінка, 4 кольори, палітра 0: яскраво-зелений, яскраво-червоний, жовтий}
CGAC1 = 1; {320x200, 1 сторінка, 4 кольори, палітра 1: яскраво-блакитний, малиновий, білий}
CGAC2 = 2; {320x200, 1 сторінка, 4 кольори, палітра 2: зелений, червоний, коричневий}
CGAC3 = 3; {320x200, 1 сторінка, 4 кольори, палітра 3: блакитний, фіолетовий, світло-сірий}
CGAHi = 4; {640x200, 1 сторінка, 2 кольори}
MCGAC0 = 0; {320x200, 1 сторінка, 4 кольори, палітра 0: яскраво-зелений, яскраво-червоний, жовтий}
MCGAC1 = 1; {320x200, 1 сторінка, 4 кольори, палітра 1: яскраво-блакитний, малиновий, білий}
MCGAC2 = 2; {320x200, 1 сторінка, 4 кольори, палітра 2: зелений, червоний, коричневий}
MCGAC3 = 3; {320x200, 1 сторінка, 4 кольори, палітра 3: блакитний, фіолетовий, світло-сірий}
MCGAMed = 4; {640x200, 1 сторінка, 2 кольори}
MCGAHi = 5; {640x480, 1 сторінка, 2 кольори}
EGALo = 0; {640x200, 4 сторінки, 16 кольорів}
EGAHi = 1; {640x350, 2 сторінки, 16 кольорів}
EGAMonoHi = 0; {640x350}
VGALo = 0; {640x200, 4 сторінки, 16 кольорів}
VGAMed = 1; {640x350, 2 сторінки, 16 кольорів}
VGAHi = 2; {640x480, 1 сторінка, 16 кольорів}
IBM8514Lo = 0; {640x480, 256 кольорів}
IBM8514Hi = 1; {1024x768, 256 кольорів}
Файл графічного драйвера має розширення bgi. Це файли CGA.BGI, EGAVGA.BGI та інші. Шлях до файлу графічного драйвера вказується між апострофами.
Функція GRAPHRESULT повертає значення типу integer, в якому закодований результат останнього звертання до графічних процедур. Звертання до неї
GRAPHRESULT .
Якщо помилки немає, то значенням функції є нуль (в модулі - константа grOK), інакше - від'ємне число, що вказує на номер помилки.
Функція GRAPHERRORMSG повертає значення типу string, в якому згідно із вказаним кодом помилки видається відповідне текстове повідомлення. Формат звертання
GRAPHERRORMSG ( <код> ) ,
де <код> - код помилки, що повертається функцією GRAPHRESULT.
Наприклад, ініціювання графічного режиму з автоматичним визначенням типу драйвера може виглядати так:
var
Driver, Regim, Error : integer;
begin
Driver := Detect;
Initgraph(Driver, Regim,'');
Error := GraphResult;
if Error <> grOK then
begin {помилка в процедурі ініціювання}
writeln(GraphErrorMsg(Error));
. . .
end
else {немає помилки}
. . .
Процедура CLOSEGRAPH завершує роботу адаптера в графічному режимі і повертає текстовий режим. Звертання
CLOSEGRAPH .
Функція GETGRAPHMODE повертає значення типу integer, в якому знаходиться код встановленого режиму роботи графічного адаптера. Звертання
GETGRAPHMODE .
Процедура SETGRAPHMODE встановлює новий режим роботи графічного адаптера; формат звертання
SETGRAPHMODE ( <режим> ) ,
де <режим> - вираз типу integer, де знаходиться код режиму, що встановлюєься.
Функції GETMAXX і GETMAXY повертають значення типу integer, в яких знаходяться максимальні координати екрану в поточному режимі роботи відповідно по горизонталі та вертикалі. Звертання
GETMAXX ,
GETMAXY .
Функції GETX і GETY повертають значення типу integer з поточними координатами вказівника відповідно по горизонталі та вертикалі. Звертання
GETX ,
GETY .
Координати визначаються відносно лівого верхнього кута вікна або, якщо вікно не встановлене, екрану.
Процедура SETVIEWPORT встановлює прямокутне вікно на графічному екрані; формат звертання
SETVIEWPORT (X1,Y1,X2,Y2,<відсічка> ) ,
де
X1,Y1 - вирази типу integer, що задають координати лівого верхнього кута вікна;
X2,Y2 - вирази типу integer, що задають координати правого нижнього кута вікна;
<відсічка> - вираз типу boolean, що відсікає елементи зображення, що не вміщуються у вікні.
Кординати завжди задаються відносно лівого верхнього кута екрану. Якщо параметр <відсічка> має значення TRUE, ті елементи зображення, що не вміщуються в межах вікна, відсікаються, інакше межі вікна ігноруються. Для управління цим параметром можна використати константи, що визначені в модулі:
const
ClipOn = true;
ClipOff = false;
Процедура MOVETO встановлює нове поточне положення вказівника. Звертання
MOVETO (X,Y) ,
де X,Y - вирази типу integer, що задають нові координати вказівника, відповідно, по горизонталі та вертикалі.
Процедура MOVEREL встановлює нове положення вказівника у відносних координатах. Звертання
MOVEREL (DX,DY) ,
де DX,DY - вирази типу integer, що задають прирости нових координат вказівника відповідно по горизонталі та вертикалі. Прирости задаються відносно того положення, яке займав вказівник до моменту звертання до процедури.
Процедура CLEARDEVICE очищує графічний екран. Звертання
CLEARDEVICE .
Процедура CLEARVIEWPORT очищує графічне вікно. Звертання
CLEARVIEWPORT .
Процедура GETASPECTRATIO повертає два числа, які дозволяють оцінити співвідношення сторін екрану. Звертання
GETASPECTRATIO (X,Y) ,
де X,Y - змінні типу word. Значення, що повертаються змінними X і Y, дозволяють обчислити відно-шення сторін графічного екрану в пікселях. Цей коефіцієнт може використовуватися при побудові пра-вильних геометричних фігур.
Процедура SETASPECTRATIO встановлює масштабний коефіцієнт відношення сторін графічного екрану. Звертання
SETASPECTRATIO (X,Y) ,
де X, Y - співвідношення сторін екрану, що встановлюється.
Процедура PUTPIXEL виводить на екран піксель заданим кольором за вказаними координатами. Формат звертання
PUTPIXEL (X,Y,<колір>) ,
де X, Y - вирази типу integer, які визначають координати;
<колір> - вираз типу word, що задає колір.
Координати задаються відносно лівого верхнього кута екрану або вікна.
Функція GETPIXEL повертає значення типу word із кольором пікселя по вказаних координатах. Звертання
GETPIXEL (X,Y) ,
де X, Y - вирази типу integer, координати пікселя.
Процедура LINE креслить лінію згідно із вказаними координатами початку і кінця. Звертання
LINE (X1,Y1,X2,Y2) ,
де X1, Y1, X2, Y2 - вирази типу integer, які задають координати відповідно початку і кінця лінії.
Процедура LINETO креслить лінію від поточного положення вказівника до положення, яке задане новими координатами. Звертання
LINETO (X,Y) ,
де X, Y - вирази типу integer, які задають координати нового положення вказівника.
Процедура LINEREL креслить лінію від поточного положення вказівника до положення, яке задане приростами його координат. Звертання
LINEREL (DX,DY) ,
де DX, DY - вирази типу integer, які задають прирости координат нового положення вказівника.
Процедура SETLINESTYLE встановлює новий стиль для креслення ліній; формат звертання
SETLINESTYLE (<тип>,<зразок>,<товщина>) ,
де <тип> - вираз типу word, що означає тип лінії;
<зразок> - вираз типу word, що вказує на зразок лінії;
<товщина> - вираз типу word, що задає товщину лінії.
В модулі тип лінії визначається такими константами:
const
SolidLn = 0; {суцільна лінія}
DottedLn = 1; {лінія з точок}
CenterLn = 2; {штрихпунктирна лінія}
DashedLn = 3; {пунктирна лінія}
UserbitLn = 4; {тип лінії задається користувачем}
Параметр <зразок> враховується лише для ліній, тип яких задається користувачем. В цьому випадку два байти параметру <зразок> визначають зразок лінії: кожний встановлений в одиницю біт цього слова відповідає пікселю в лінії, що світиться, нульовий біт - пікселю, який не світиться. Отже, параметр <зразок> вказує на відрізок лінії довжиною 16 пікселів, який періодично повторюється по всій довжині лінії.
Параметр <товщина> може бути двох значень, визначених в модулі:
const
NormWidth = 1; {товщина один піксель}
ThickWidth = 3; {товщина три пікселя}
Процедура GETLINESETTINGS повертає встановлений стиль лінії. Формат звертання
GETLINESETTINGS (<стиль>) ,
де <стиль> - змінна типу LINESETTINGSTYPE, якою повертається встановлений стиль ліній.
В модулі GRAPH є тип змінної:
type
LineSettingsType = record
LineStyle : word; {тип лінії}
Pattern : word; {зразок}
Thickness : word; {товщина}
end;
Процедура RACTANGLE креслить прямокутник з вказаними координатами кутів; формат звертання
RACTANGLE (X1,Y1,X2,Y2) ,
де X1, Y1, X2, Y2 - вирази типу integer, які задають координати відповідно лівого верхнього і правого нижнього кутів.
Процедура BAR3D креслить тримірне зображення паралелепіпеда і замальовує його передню грань; формат звертання
BAR3D (X1,Y1,X2,Y2,<глибина>,<в.грань>) ,
де X1, Y1, X2, Y2 - вирази типу integer, які задають координати відповідно лівого верхнього і правого нижнього кутів передньої грані;
<глибина> - вираз типу integer, який задає "глибину" паралелепіпеда в пікселях;
<в.грань> - вираз типу boolean, який визначає спосіб зображення верхньої грані (якщо <в.грань>=TRUE верхня грань крес литься, інакше - не креслиться).
В модулі GRAPH параметром <в.грань> може виступати одна з констант:
const
TopOn = true;
TopOff = false;
Процедура DRAWPOLY креслить довільну ламану лінію, задану координатами точок перегину; формат звертання
DRAWPOLY (N,<координати>) ,
де N - вираз типу word, що задає координати точок перегину, включаючиобидві крайні точки;
<координати> - вираз типу POINTTYPE, що містить координати точок перегину.
Координати точок перегину задаються парою значень типу word: перше визначає горизонтальну, друге - вертикальну координату. В модулі для них визначений такий тип:
type
PointType = record
x,y : word
end;
Процедура CIRCLE креслить коло; формат звертання
CIRCLE (X,Y,<радіус>) ,
де X, Y - вирази типу integer, які визначають координати центру;
<радіус> - вираз типу word, що вказує на радіус в пікселях.
Коло завжди правильне, так як будується з врахуванням коефіцієнта GETASPECTRATIO, тому <радіус> вказує на кількість пікселів в горизонтальному напрямку.
Процедура ARC креслить дугу кола. Формат звертання
ARC (X,Y,<поч.кут>,<кін.кут>,<радіус>) ,
де X, Y - вирази типу integer, які визначають координати центру;
<поч.кут> - вираз типу word, який вказує на початковий кут;
<кін.кут> - вираз типу word, який вказує на кінцевий кут;
<радіус> - вираз типу word, що вказує на радіус.
Кути відраховуються проти годинникової стрілки і вказуються в градусах. Нульовий кут відповідає горизонтальному напрямку вектора зліва направо.
Процедура GETARCCOORDS повертає координати трьох точок: центру, початку і кінця дуги; формат звертання
GETARCCOORDS (<координати>) ,
де <координати> - змінна типу ARCCOORDSTYPE, що повертає координати центру, початку та кінця дуги.
В модулі GRAPH визначений такий тип:
type
ArcCoordsType = record
X,Y : integer; {координати центру}
Xstart,Ystart: integer; {коорд. початку дуги}
Xend,Yend : integer; {коорд. кінця дуги}
end;
Процедура ELLIPSE креслить дугу еліпса; формат звертання
ELLIPSE (X,Y,<поч.кут>,<кін.кут>,RX,RY) ,
де X, Y - вирази типу integer, які визначають координати центру;
<поч.кут>, <кін.кут> - вирази типу word, які вказують на початковий та кінцевий кути;
RX,RY - вирази типу word, що визначають горизонтальний та вертикальний радіуси еліпса в пікселях.
Відлік кутів при кресленні еліпса є аналогічним до того, що і в процедурі ARC. Всі геометричні фігури та лінії, описані вище, виводяться на екран тим кольором та стилем ліній (для кіл, дуг та еліпсів лінія завжди суцільна), які є по замовчуванню в комп'ютері або задані користувачем.
2. ЗАВДАННЯ
2.1. Домашня пiдготовка до роботи
1. Навчитися ініціалізувати графічний режим роботи відеоадаптера в середовищі Турбо-Паскаль.
2. Вивчити основні графічні процедури та функції алгоритмічної мови Турбо-Паскаль.
3.Написати програму на алгоритмічній мові Турбо-Паскаль, яка виводить на екран певне графічне зображення. Розміри, вказані в завданнях, проставити на кресленні. Варіанти завдань беруть за вказівкою викладача з таблиці 1.
Таблиця 1.
N% п/п
Варіанти завдань
1
Побудувати рівнобедрений трикутник, основа якого дорівнює 128, а висота 104, і описати навколо нього коло.
2
Побудувати ромб, діагоналі якого дорівнюють 88 і 122 (одна з діагоналей має бути розташована горизонтально) і описати навколо нього еліпс.
3
Побудувати рівнобічну трапецію з основами 120 і 108 (основи розташовані горизонтально) і висотою 72.
4
На полі розміром 200 x 240 нанести координатну сітку розміром 10 x 10.
5
Побудувати правильний шестикутник, горизонтально розташована сторона якого дорівнює 80.
6
Побудувати ромб, в якого сторона, яка розташована горизонтально, має довжину 100 , а висота дорівнює 80.
7
Побудувати п'ятикутну зірку.
8
Побудувати рівносторонній трикутник, в якого довжина сторони дорівнює 140 і вписати в нього коло.
9
Намалювати умовне графічне позначення n-p-n транзистора і підписати його виводи.
10
Побудувати коло, вписане в квадрат. Радіус кола дорівнює 80.
11
Побудувати вписаний правильний п'ятикутник. Радіус кола дорівнює 90.
12
Намалювати умовне графічне зображення електролітичного конденсатора, вказавши полярність, а також однофазного трансформатора з магнітним осердям.
13
Побудувати квадрат із стороною 180. Розбити його на чотири менших, в кожен з яких вписати коло.
14
Намалювати серію з 10 однакових прямокутних імпульсів, вказавши тривалість та амплітуду імпульса, а також тривалості періоду та паузи.
15
Намалювати умовне графічне позначення p-n-p транзистора. Вказати (підписати) виводи - емітер, база, колектор.
16
Побудувати коло діаметром 120 і розбити його на 12 секторів.
17
Намалювати п'ять олімпійських кіл радіусом 40.
18
Побудувати правильний шістнадцятикутник із довжиною сторони 40 і вписати в нього коло.
19
Дано правильний п'ятикутник з розміром сторони 50, вершини якого є серединами сторін іншого п'ятикутника, вершини якого, в свою чергу, є вершинами третього п'ятикутника. Скласти програму, яка креслить ці п'ятикутники.
20
Скласти програму, яка розбиває екран монітора на десять однакових вертикальних прямокутники і в кожному з них провести діагоналі так, щоб з'єднання діагоналей утворило суцільну ламану лінію.
21
Покрити поверхню екрану прямокутними "паркетними" плитками розміром 40 x 80, розташова-ними під кутом 45до горизонтальної сторони екрану.
22
Побудувати правильний дев'ятикутник із стороною 30. Вписати в нього і описати навколо нього кола.
23
Побудувати куб із стороною 80 і заштрихувати його передню грань вертикальними та горизонтальними лініями з кроком 5.
24
Побудувати зображення, яке складається з горизонтально розташованих 10 однакових прямокут-ників, розміщених в вікні розміром 400 x 300. Вікно має знаходитися в центрі екрану. В кожному з прямокутників провести по дві діагоналі.
25
Намалювати умовне графічне зображення напівпровідникового діода і позначити виводи (анод, катод).
4. КОНТРОЛЬНI ПИТАННЯ
1. Як здійснюється ініціювання графічного режиму в середовищі Турбо-Паскаль?
2. Які типи відеоадаптерів та режими їх роботи ви знаєте?
3. Наведіть приклад ініціювання графічного режиму з автоматичним визначенням типу драйвера.
4. Які процедури та функції мови Турбо-Паскаль для креслення ліній та геометричних фігур вам відомі?
5. Як встановити поточний стиль лінії?