Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Кафедра САПР
ГРАФІЧНО-РОЗРАХУНКОВА РОБОТА
з курсу:
“Геометричне моделювання у конструюванні
інженерних об’єктів і систем”
СПИСОК СКОРОЧЕНЬ
CAD – Computer Aided Design – системи автоматизованого проектування;
CGI – Computer Generated Image – зображення, створене на комп'ютері.
OpenGL – Open Graphic Library – графічна бібліотека;
ЕПТ – електронно-променева трубка;
КГ – комп’ютерна графіка;
МТІ – Массачусеттський технологічний інститут.
ВСТУП
Представлення даних на моніторі в графічному режимі вперше було реалізовано в середині 50-их років в військових і наукових дослідженнях.
Комп’ютерна графіка – це спеціальна ділянка інформатики, що вивчає методи (модель + алгоритм) і засоби створення та обробки зображень за допомогою програмно-апаратних комплексів. Комп’ютерна графіка охоплює всі види та форми представлення зображення, як на екрані, так і на зовнішньому носії (папір, плівка тощо). КГ застосовується для візуалізації даних в різних сферах людської діяльності: медицина (комп’ютерна томографія), наука (склад речовини, векторні поля, графіки процесів), дизайн (для реклами, поліграфія, моделювання), світле майбутнє (ігри).
Машинна графіка ще відносно молода, і відповідним тут є стандарт, що саме розвивається. Тиск головним чином відчувається з боку виробників CAD систем - кошти просторового моделювання вже стали повсякденним інструментом для багатьох інженерів і проектувальників. Однак протягом останніх 15-20 років складність моделей постійно зростала, і на сьогодні склалася ситуація, при якій прогресивні форми організації проектування (робота з великим збиранням) лімітуються можливостями сучасного графічного обладнання і ПО інтерактивній візуалізації.
Відправною точкою можна вважати 1930 рік, коли в США нашим співвітчизником Володимиром Зворикіним, що працював в компанії Westinghouse, була винайдена електронно-променева трубка, що уперше дозволяє отримувати зображення на екрані без використання механічних рухомих частин. Саме ЕПТ є прообразом сучасних телевізійних кінескопів і комп'ютерних моніторів. Початком ери власне комп'ютерної графіки можна вважати грудень 1951 року, коли в Массачусеттськом технологічному інституті для системи протиповітряної оборони військово-морського флоту США був розроблений перший дисплей для комп'ютера “Вихор". Винахідником цього дисплея був інженер з МТІ Джей Форрестер.
Одним з батьків-фундаторів комп'ютерної графіки вважається Айвен Сазерленд (Ivan Sotherland), який в 1962 році все в тому ж МТІ створив програму комп'ютерної графіки під назвою “Блокнот" (Sketchpad). Ця програма могла малювати досить прості фігури (точки, прямі, дуги кіл), могла обертати фігури на екрані. Після цієї програми деякі великі фірми, такі як “Дженерал моторз", “Дженерал електрик", приступили до розробок в області комп'ютерної графіки. У 1965 році фірма IBM випустила перший комерційний графічний термінал під назвою IBM-2250. У кінці 70-х років для космічних кораблів “Шаттл" з'явилися льотні тренажери, засновані на комп'ютерній графіці. У 1982 році на екрани кінотеатрів вийшов фільм, в якому уперше використовувалися кадри, синтезовані на комп'ютері. Ще в 1979 році Джордж Лукас, глава фірми “Lucasfilm" і творець серіалу “Зоряні війни", організував в своїй фірмі відділ, який займався впровадженням останніх досягнень комп'ютерної графіки в кіно.
Існують фірми, що спеціалізуються на розробці комп'ютерів для графічних додатків, такі як “Silicon Graphics", “Evans&Sotherland". Області додатку комп'ютерної графіки в цей час дуже широкі. У промисловості використовується комп'ютерне моделювання процесів з графічним відображенням що відбувається на екрані. Розробка нових автомобілів реалізовуються на комп'ютері від стадії первинних ескізів зовнішнього вигляду корпусу автомобіля до розгляду поведінки деталей автомобіля в різних дорожніх умовах. У медицині застосовуються комп'ютерні томографи, що дозволяють заглянути всередину тіла і поставити правильний діагноз. У архітектурі широко застосовуються системи автоматизованого проектування (CAD) які дозволяють розробити повний проект будівлі, засновуючись на методах комп'ютерної графіки. Хіміки вивчають складні молекули білків користуючись коштами комп'ютерного відображення даних. У світі регулярно проводяться виставки, наприклад, такі як SIGGRAPH, картин намальованих за допомогою комп'ютера. У математиці розвиток фракталів був би неможливий без комп'ютерів з відповідними коштами графічного відображення даних. Кошти мультимедія привели до появи нових джерел інформації тих, що об'єднують в собі статичні і відеозображення, текст і звук. Новітні операційні системи працюють в графічному режимі і спочатку реалізовують в своїх функціях методи КГ.
Фахівці прийшли до висновку, що тип взаємодії з моделлю, відомий як проектування в контексті, дозволяє виявляти такі помилки як некоректне розташування компонентів, ще на ранніх етапах циклу розробки, а це приводить до зменшення трудовитрат і вартості проекту.
Як показала практика, отримати такі кошти, не зачіпаючи рівень базового графічного апарату, неможливо. А для базового рівня задача складається в тому, щоб добитися візуалізації великих інженерних моделей з інтерактивною швидкістю, не жертвуючи при цьому точністю відтворення в тій мірі, в якій це може привести до помилкової інтерпретації результуючих зображень.
OpenGL відкриває перед користувачем можливості дуже тонкого управління процесом рендеринга: можна визначити такі параметри як матриці перетворень координат, коефіцієнти рівнянь розрахунку освітленості і т.д. Але! Все це чиста візуалізація. OpenGL не має коштів для уявлення власне моделей складних геометричних об'єктів, якщо розуміти модель як структурний опис елементів, відмінних від примітивів. Програма на OpenGL в більшій мірі специфікує, порядок отримання певного результату, а не його зовнішнє уявлення. Результат роботи програми - тільки зображення. Інакше кажучи, OpenGL є фундаментально процедурною мовою.
Абстрактний конвеєр рендеринга, що є повною схемою графічної обробки, крім етапів, що реалізовуються в апаратних прискорювачах, включає в себе ще два: генерацію прикладної моделі і її обхід, під час якого викликаються функції OpenGL. Досі ці два етапи віддавалися на розсуд програміста і хост-процесора, а тим часом саме в них закладені резерви підвищення графічної продуктивності.
Не дивно, що в цьому напрямі і вульгарно розвиток, головною рушійною силою якого знов стала компанія Silicon Graphics. З'явилися IRIS Performer, Open Inventor, Cosmo 3D, а тепер і OpenGL Optimizer. Хоч акценти в цих програмно-інструментальних системах розставлені по-різному, загальним для цієї лінії є розвиток коштів управління прикладною моделлю (графом сцени) і реалізація закладених в ній можливостей.
ІНДИВІДУАЛЬНЕ ЗАВДАННЯ
Просторовий об’єкт – сортувальник сипучих речовин.
а) Побудова каркасної моделі геометричного об’єкта з графічною побудовою.
б) Побудова матриці суміжності з відповідною нумерацією вершин графа та зазначенням її на графічній побудові.
в) Побудова матриці інцеденції з відповідною нумерацією вершин та дуг графа та зазначенням її на графічній побудові.
а) Визначити полярні координати точки, що симетрична відносно полярної вісі точки В(5;π/2).
б) Задані точки: С(-3), D(-8) . Визначити координати цих точок при умові, що одиниця довжини буде взята так, що e': e = 5 : 2.
в) Полярна вісь полярної системи координат паралельна вісі абсцис декартової прямокутної системи та направлена однаково з нею. Задані декартові прямокутні координати полюса О(-1;2) та полярні координати точки C(5;-π/2). Визначити координати цієї точки у декартові прямокутній системі.
г) Перевести координати точки Р з однорідного представлення у вигляді: (17, 3, 1) в систему афінних координат.
д) Вісі декартової системи координат повернуті на кут α = 300 . Координати точок A( 21/2;−1) та C(−5;3⋅51/2) визначені у новій системі координат. Обчислити координати цих точок у старій системі координат.
Привести до нормального виду рівняння окружності: x2 + y2 − 4x = 0.
Побудувати криву Без’є на основі шести вершин багатокутника, що заданий точками з координатами: P0[2,12], P1[5,2], P2[8,5], P3[9,16], P4[11,2], P5[15,8].
а) провести перетворення кольору з RGB => TColor (для Delphi);
б) на основі кольору утворити колір за матричним представленням перетворення:
Написати програму із застосуванням графічних функцій WinAPI, яка дозволяє візуалізувати графіки функцій з можливостями масштабування у вікні на певному інтервалі. Застосувати функції зміни кольору, штриховки, зафарбування замкнутих областей, текстових підписів, виводу координатної сітки. Організувати вивід графіка у зовнішній метафайл.
Побудувати в різних областях екрана графіки функцій Y(x) і YN(x). Графік функції YN(x) будується для трьох і чотирьох членів розкладання функції Y(х) у ряд Тейлора.
Y(x)= Sin(x); Y3(x)= x -x3/3! + x5/5!; Y4(x)= x -x3/3! + x5/5! -x7/7!; х=[-3..3];
Написати імітаційну програму з застосуванням афінних перетворень, яка дозволяє в автоматичному режимі та при ручному керуванні створювати динамічно змінну візуалізацію при якій моделюється поводження молекул газу в циліндрі під поршнем, що рухається.
Написати програму із застосуванням 2D графічних функцій бібліотеки OpenGL, яка дозволяє візуалізувати у незалежних віконних форма програми ескізне креслення мікрометра для зовнішніх лінійних вимірів.
РОЗВ’ЯЗКИ
Таблиця 1 Матриця суміжності вершин графа геометричного об’єкта О2
Геометричний параметр
Дуги графа
1
2
3
4
5
6
7
8
9
10
11
12
13
14
L (індекс носія дуги)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Mn (початкова координата)
1
2
3
1
1
2
3
4
5
5
6
8
5
6
Mk (кінцева координата)
2
3
4
4
5
6
7
8
8
6
7
7
9
10
Таблиця 2 Матриця суміжності вершин графа геометричного об’єкта О2
Геометричний параметр
Дуги графа
15
16
17
18
19
20
21
22
23
24
25
26
27
28
L (індекс носія дуги)
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Mn (початкова координата)
7
8
9
9
10
12
9
10
11
12
13
13
14
16
Mk (кінцева координата)
11
12
12
10
11
11
13
14
15
16
16
14
15
15
Таблиця 3 Матриця інцеденції дуг графа геометричного об’єкта О2
Геометричний параметр
Пари інцедентних дуг
1
2
3
4
5
6
7
8
9
10
11
12
i (індекс носія першої дуги)
1
1
4
1
1
2
2
2
3
3
3
4
j (індекс носія другої дуги)
5
4
5
2
6
6
3
7
7
4
8
8
Mij (кінцева координата)
1
1
1
2
2
2
3
3
3
4
4
4
Таблиця 4 Матриця інцеденції дуг графа геометричного об’єкта О2
Геометричний параметр
Пари інцедентних дуг
13
14
15
16
17
18
19
20
21
22
23
24
i (індекс носія першої дуги)
5
5
5
10
10
9
6
6
6
10
10
11
j (індекс носія другої дуги)
10
9
13
9
13
13
10
11
14
11
14
14
Mij (кінцева координата)
5
5
5
5
5
5
6
6
6
6
6
6
Таблиця 5 Матриця інцеденції дуг графа геометричного об’єкта О2
Геометричний параметр
Пари інцедентних дуг
25
26
27
28
29
30
31
32
33
34
35
36
i (індекс носія першої дуги)
7
7
7
11
11
12
8
8
8
9
9
12
j (індекс носія другої дуги)
11
12
15
12
15
15
9
12
16
12
16
16
Mij (кінцева координата)
7
7
7
7
7
7
8
8
8
8
8
8
Таблиця 6 Матриця інцеденції дуг графа геометричного об’єкта О2
Геометричний параметр
Пари інцедентних дуг
37
38
39
40
41
42
43
44
45
46
47
48
i (індекс носія першої дуги)
13
13
13
17
17
18
14
14
14
18
18
19
j (індекс носія другої дуги)
17
18
21
18
21
21
18
19
22
19
22
22
Mij (кінцева координата)
9
9
9
9
9
9
10
10
10
10
10
10
Таблиця 7 Матриця інцеденції дуг графа геометричного об’єкта О2
Геометричний параметр
Пари інцедентних дуг
49
50
51
52
53
54
55
56
57
58
59
60
i (індекс носія першої дуги)
15
15
15
19
19
20
16
16
16
17
17
20
j (індекс носія другої дуги)
19
20
23
20
23
23
17
20
24
20
24
24
Mij (кінцева координата)
11
11
11
11
11
11
12
12
12
12
12
12
Таблиця 8 Матриця інцеденції дуг графа геометричного об’єкта О2
Геометричний параметр
Пари інцедентних дуг
61
62
63
64
65
66
67
68
69
70
71
72
i (індекс носія першої дуги)
21
21
25
22
22
26
23
23
27
24
24
25
j (індекс носія другої дуги)
25
26
26
26
27
27
27
28
28
25
28
28
Mij (кінцева координата)
13
13
13
14
14
14
15
15
15
16
16
16
a.)
б.) Якщо на прямій вибрати нову одиницю довжини е’, то координати однієї й тої самої точки будуть обернено пропорційні відповідним одиницям, тобто x = e’ / e ⋅ x’.
Для точки С* : x = 5 / 2 ⋅ (-3) = -7.5
Для точки D* : x = 5 / 2 ⋅ (-8) = -20
в.)
Якщо перенести паралельно початок координат в точку О(-1;2) та не змінювати напрямок осей, то: x = x’ + a, y = y’ + в : x = 0 + (-1) = -1
y = -5 + 2 = -3
Координати точки С(5;-П/2) у Декартові прямокутній системі будуть мати координати С*(-1;-3).
г.) P(17;3;1)
(17;3;1) = (ω⋅x; ω⋅y; ω) => ω = 1
(17;3;1) = (ω⋅17; ω⋅3; ω) => (1⋅17;1⋅3;1) => (x;y) = (17;3)
д.) α = 300. Координати точок у новій системі координат: А(21/2;-1) та С(-5;3 ⋅ 51/2). Ці точки у старій системі координат:
Для А* : x = x'⋅cosα − y'⋅sinα = 21/2 ⋅ 31/2/2 – (–1) ⋅ 1/2 = 1/2 ⋅ (61/2 +1)
y = x'⋅sinα + y'⋅cosα = 21/2 ⋅ 1/2 + (–1) ⋅ 31/2/2 = 1/2 ⋅ (21/2 – 31/2)
А*( 1/2 ⋅ (61/2 +1) ; 1/2 ⋅ (21/2 -31/2) ) = А*(1.73; –0.16)
Для С* : x = x'⋅cosα − y'⋅sinα = –5 ⋅ 31/2/2 – 3 ⋅ 51/2 ⋅ 1/2 = –1/2 ⋅ (5 ⋅ 31/2 +3 ⋅ 51/2)
y = x'⋅sinα + y'⋅cosα = –5 ⋅ 1/2 + 3 ⋅ 51/2 ⋅ 31/2/2 = –1/2 ⋅ (5 – 3 ⋅ 151/2)
С*( –1/2 ⋅ (5 ⋅ 31/2 +3 ⋅ 51/2) ; –1/2 ⋅ (5 – 3 ⋅ 151/2) ) = С*(–7.69;3.31)
(x – x0)2 + (y – y0)2 = R2 – нормальний вид рівняння окружності
x2 – 2 ⋅ x ⋅ x0 + x02 + y2 – 2 ⋅ y ⋅ y0 + y2 = R2
З останнього загального рівняння випливає, що наше рівняння: x2 + y2 – 4 ⋅ x = 0 треба записати у вигляді:
x2 – 2 ⋅ 2(x0=2) ⋅ x + 22(x0=2) + y2 – 2 ⋅ 0(y0=0) ⋅ y + 02(y0=0) = 22(R=2)
x2 – 4 ⋅ x + 4 + y2 = 4
(x – 2)2 + y2 = 22 – нормальний вид заданого рівняння окружності
За алгоритмом Без’є крива буде апроксимуватися поліномом:
Оскільки в завданні є 6 вершин, то порядок полінома n=5, тоді:
Коефіцієнти для кривої Без’є:
t
I5,0
I5,1
I5,2
I5,3
I5,4
I5,5
0
1
0
0
0
0
0
0,15
0,444
0,392
0,138
0,024
2,152⋅10-3
7,594⋅10-5
0,3
0,168
0,36
0,309
0,132
0,028
2,43⋅10-3
0,45
0,05
0,206
0,337
0,276
0,113
0,018
0,6
0,01
0,077
0,23
0,346
0,259
0,078
0,75
9,766⋅10-4
0,015
0,088
0,264
0,396
0,237
0,9
10⋅10-6
4,5⋅10-4
8,1⋅10-3
0,073
0,328
0,59
1
0
0
0
0
0
1
P(t) = P0 ⋅ I5,0 + P1 ⋅ I5,1 + P2 ⋅ I5,2 + P3 ⋅ I5,3 + P4 ⋅ I5,4 + P5 ⋅ I5,5
P(0) = P0 = [2;12]
P(0,15) = 0,444 ⋅ P0 + 0,39 ⋅ P1 + 0,138 ⋅ P2 + 0,024 ⋅ P3 + 2,152⋅10-3 ⋅ P4 + 7,594⋅10-5 ⋅ P5 = = [4,193;7,191]
P(0,3) = 0,168 ⋅ P0 + 0,36 ⋅ P1 + 0,309 ⋅ P2 + 0,132 ⋅ P3 + 0,028 ⋅ P4 + 2,43⋅10-3 ⋅ P5 = = [6,14;6,468]
P(0,45) = 0,05 ⋅ P0 + 0,206 ⋅ P1 + 0,337 ⋅ P2 + 0,276 ⋅ P3 + 0,113 ⋅ P4 + 0,018 ⋅ P5 =
= [7,823;7,483]
P(0,6) = 0,01 ⋅ P0 + 0,077 ⋅ P1 + 0,23 ⋅ P2 + 0,346 ⋅ P3 + 0,259 ⋅ P4 + 0,078 ⋅ P5 =
= [9,378;8,102]
P(0,75) = 9,766⋅10-4 ⋅ P0 + 0,015 ⋅ P1 + 0,088 ⋅ P2 + 0,0264 ⋅ P3 + 0,396 ⋅ P4 + 0,237 ⋅ P5 =
= [11,068;7,394]
P(0,9) = 10⋅10-6 ⋅ P0 + 4,5⋅10-4 ⋅ P1 + 8,1⋅10-3 ⋅ P2 + 0,073 ⋅ P3 + 0,328 ⋅ P4 + 0,59 ⋅ P5 =
= [13,182;6,586]
P(1) = P5 = [15;8]
Графік кривої Без’є і кривої побудованої по координатам вершин багатокутника
Суцільна лінія на графіку відтворює криву побудовану по вершинах багатокутника, що заданий точками Р0, …, Р5.
Штрихова лінія на графіку відтворює криву Без’є.
а.) function RGB_TColor (R, G, B: Byte): TColor;
begin
Result := B shl 16 or G shl 8 or R;
end;
B: CD16 => 20510 => 110011012
G: EB16 => 23510 => 111010112
R: FF16 => 25510 => 111111112
00 FF EB CD 00110011010000000000000000
R G B or 1110101100000000
or 11111111
00110011011110101111111111
Result := CDEBFF16
б.)
Red
Green
Blue
FF
255
EB
235
CD
205
R1
G1
B1
E0
EC
C9
Текст програми
program Plechin3;
uses
SysUtils,
Windows,
Messages;
var
wc : TWndClassEx; // Зміна шаблону класу вікна.
MainWnd : HWND; // Описувач головного вікна.
Mesg : TMsg; // Змінна для циклу збора повідомлень.
xPos, yPos, nWidth, nHeight : Integer; // Деякі параметри вікна.
MyDC, OldDC : HDC; // Контекст пристрою.
brush : HBrush; // Пензлик.
// Координати початків координат для всіх графіків.
ox1, oy1, ox2, oy2, ox3, oy3 : real;
// Зміщення центрів координат від центру екрана.
d_ox1, d_oy1, d_ox2, d_oy2, d_ox3, d_oy3 : real;
OX, OY : real; // Центр екрану.
rec : TRect; // Область вікна для малювання.
lenght, c_lenght : real; // Довжина півосі з її поч. незмінним значенням.
zoom : real; // Масштаб. По замовчуванню = 1.
// Віконна процедура головного вікна.
function WindowProc(wnd : HWND; Msg : Integer; Wparam : Wparam; Lparam : Lparam) : Lresult;
stdcall;
Begin
// Далі проходить цикл обробки повідомлень.
case msg of
wm_destroy :
// Повідомленні, яке надсилається при знищенні вікна.
begin
postquitmessage(0);
exit;
Result := 0;
end
else Result := DefWindowProc(wnd, msg, wparam, lparam);
end;
end;
//---------------------------------------------------------------------------
// Процедура побудови графіка функції y(x).
// Значення x і y множаться на 50 щоб більшим був графік.
procedure Yx(ox, oy, xbegin, xend, krok : real; color : longint);
var
x, y : double; // Центр графіка.
pen : HPen; // Тимчасове перо.
begin
pen := CreatePen(ps_Solid, 2, color); // Створюємо перо.
SelectObject(MyDC, pen); // Реєструємо його в контексті пристрою.
// Знаходимо першу точку графіка.
x := xbegin;
y := sin(x);
MoveToEx(MyDC, Round(x*50*zoom+ox), Round(oy-y*50*zoom), nil); // Переводимо туди курсор.
x := x + krok; // Збільшуємо кут.
// Знаходимо наступні точки графіка і малюємо лінії.
repeat
y := sin(x);
LineTo(MyDC, Round(x*50*zoom+ox), Round(oy-y*50*zoom));
x := x + krok;
until x > xend;
DeleteObject(pen); // Видаляєм перо.
end;
//---------------------------------------------------------------------------
// Процедура побудови графіка функції y3(x).
// Значення x і y множаться на 50 щоб більшим був графік.
procedure Y3x(ox, oy, xbegin, xend, krok : real; color : longint);
var
x, y, m : double; // Центр графіка.
pen : HPen; // Тимчасове перо.
begin
pen := CreatePen(ps_Solid, 2, color); // Створюємо перо.
SelectObject(MyDC, pen); // Реєструємо його в контексті пристрою.
// Знаходимо першу точку графіка.
x := xbegin;
y := x - x*x*x/6 + x*x*x*x*x/120;
MoveToEx(MyDC, Round(x*50*zoom+ox), Round(oy-y*50*zoom), nil); // Переводимо туди курсор.
x := x + krok; // Збільшуємо кут.
// Знаходимо наступні точки графіка і малюємо лінії.
repeat
y := x - x*x*x/6 + x*x*x*x*x/120;
LineTo(MyDC, Round(x*50*zoom+ox), Round(oy-y*50*zoom));
x := x + krok;
until x > xend;
DeleteObject(pen); // Видаляєм перо.
end;
//---------------------------------------------------------------------------
// Процедура побудови графіка функції y4(x).
// Значення x і y множаться на 50 щоб більшим був графік.
procedure Y4x(ox, oy, xbegin, xend, krok : real; color : longint);
var
x, y, m : double; // Центр графіка.
pen : HPen; // Тимчасове перо.
begin
pen := CreatePen(ps_Solid, 2, color); // Створюємо перо.
SelectObject(MyDC, pen); // Реєструємо його в контексті пристрою.
// Знаходимо першу точку графіка.
x := xbegin;
y := x - x*x*x/6 + x*x*x*x*x/120 - x*x*x*x*x*x*x/5040;
MoveToEx(MyDC, Round(x*50*zoom+ox), Round(oy-y*50*zoom), nil); // Переводимо туди курсор.
x := x + krok; // Збільшуємо кут.
// Знаходимо наступні точки графіка і малюємо лінії.
repeat
y := x - x*x*x/6 + x*x*x*x*x/120 - x*x*x*x*x*x*x/5040;
LineTo(MyDC, Round(x*50*zoom+ox), Round(oy-y*50*zoom));
x := x + krok;
until x > xend;
DeleteObject(pen); // Видаляєм перо.
end;
//---------------------------------------------------------------------------
// Процедура побудови координатних осей.
procedure DrawOsi(ox, oy : real);
Var
pen : HPen; // Тимчасове перо.
brush : HBrush; // Тимчасовий пензль.
// Масим для функції Polygon(), яка малює стрілки для осьових ліній.
point : array [1..5] of TPoint;
begin
// 1. Створуємо перо і реєструємо його в контексті пристрою.
pen := CreatePen(ps_Solid, 2, RGB(0, 0, 0));
SelectObject(MyDC, pen);
// 2. Створюємо пензлик і реєструємо його в контексті пристрою.
brush := CreateSolidBrush(RGB(0, 0, 0));
SelectObject(MyDC, brush);
SetBkMode(MyDc, 1); // Робимо прозорий фон.
// 3. Малюємо осі координат.
MoveToEx(MyDC, Round(ox - lenght), Round(oy), nil);
LineTo(MyDC, Round(ox + lenght), Round(oy)); // Малюємо OX.
MoveToEx(MyDC, Round(ox), Round(oy + lenght), nil);
LineTo(MyDC, Round(ox), Round(oy - lenght)); // Малюємо OY.
// 4. Малюємо стрілку для осі OX.
point[1].X := Round(ox + lenght);
point[1].Y := Round(oy - 1);
point[2].X := Round(ox + (lenght - 13));
point[2].Y := Round(oy + 4);
point[3].X := Round(ox + (lenght - 5));
point[3].Y := Round(oy - 1);
point[4].X := Round(ox + (lenght - 13));
point[4].Y