Posibnik_Pascal
.pdf
NumPoints – це кількість точок ламаної, а PolyPoints – це змінна, тип якої найчастіше є масивом записів. Кожний запис складається із двох полів: перше поле задає х- координату, а друге – у-координату чергової точки ламаної.
9.FillPoly(NumPoints:word, var PolyPoints) – процедура зображає зафарбований багатокутник.
|
Зображення дуг, кіл, еліпсів |
|
|
|
|
Перед зображенням деяких із наступних фігур треба встановити стиль лінії чи |
|||
зафарбування. |
|
A |
|
|
10. |
Circle(x, y:integer; R:word) – процедура зображає коло з центром |
|
|
|
B |
|
|
||
|
у точці (x, y) і радіусом R. |
|
|
|
11. |
Arc(x, y:integer; φ1,φ2, R:word) – процедура зображає дугу кола з |
φ2 |
φ1 |
|
|
центром у точці (x, y) і радіусом R від кута φ1 до кута φ2. Кути |
|
|
|
|
рахуються від додатного напрямку осі ОХ проти годинникової |
O(x, |
X |
|
|
стрілки та вимірюються в градусах. Якщо φ1 = 0, а φ2 = 359, то |
|
|
|
|
буде зображене все коло. На малюнку 2 зображена відповідна |
|
|
|
|
дуга АВ, кут ХОА дорівнює φ1, а кут ХОВ дорівнює φ2, ОА = R. |
Мал. 2 |
|
|
12. |
PieSlice(x, y:integer; φ1,φ2, R:word) – процедура зображає |
|
||
|
|
|
||
зафарбований сектор круга з центром у точці (x, y) і радіусом R від кута φ1 до кута φ2. На малюнку 2 це був би сектор ОАВ. Кути рахуються від додатного напрямку осі ОХ проти
годинникової стрілки та вимірюються в градусах. Якщо φ1 |
= 0 і φ2 |
= 359, то буде |
|||||||
зафарбований круг. |
|
|
|
|
|
|
|
|
|
13. Ellipse(x, y:integer; φ1, |
φ2:word, |
a, b:word) |
– |
|
C |
|
|
|
|
процедура зображає дугу еліпса з центром у точці |
|
|
M |
|
|||||
|
|
|
|
||||||
(x, y) від кута φ1 до кута φ2, a, b – горизонтальна і |
|
|
|
|
|
||||
вертикальна |
осі еліпса. |
Кути |
рахуються |
від |
N |
φ2 |
φ1 |
|
|
додатного напрямку осі ОХ проти годинникової |
A |
|
|
X |
|||||
|
|
|
|||||||
стрілки та вимірюються в градусах. Якщо φ1 = 0 і |
|
O |
B |
|
|||||
φ2 = 359, то буде зображений еліпс. На малюнку 3 |
|
|
|
|
|
||||
зображена дуга MCN, О(х, у) – центр еліпса, кут |
|
|
|
|
|
||||
XOM дорівнює φ1, кут XON дорівнює φ2, АВ = а, |
|
D |
|
|
|
||||
CD = b. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Мал. 3 |
|
|
||
14. FillEllipse(x, |
y:integer; a, |
b:word) – процедура |
|
|
|
||||
зображає зафарбований еліпс з центром у точці (x, y), a, b – горизонтальна і вертикальна осі еліпса.
15.Sector(x, y:integer; φ1, φ2:word, a, b:word) – процедура зображає зафарбований сектор еліпса з центром у точці (x, y) від кута φ1 до кута φ2, a, b – горизонтальна і вертикальна осі еліпса. На малюнку 3 MОN – сектор еліпса.
Зафарбування області
16.FloodFill(x, y:integer; color:word) – процедура зафарбовує замкнену область попередньо встановленим стилем, (х, у) – деяка точка, color – колір межі замкненої області. Якщо точка (х, у) розташована всередині області, то зафарбовується вся внутрішня частина області, а якщо точка (х, у) знаходиться за межами області, то зафарбовується вся зовнішня частина області.
Робота з текстом
Відображення тексту в графічному режимі дещо відмінне від текстового режиму. Основна відмінність полягає в тому, що всі дії виконуються тільки із рядковими константами і змінними. Будь-яка числова інформація повинна попередньо перетворюватися в символьну. Друга відмінність – можливість використовувати різні шрифти.
Файли шрифтів мають розширення CHR. Після ініціалізації графічного режиму за замовчуванням встановлюється шрифт DefaultFont. Для формування кожного символу шрифту використовується матриця розміром 8х8. Стандартний набір шрифтів наведений у наступній таблиці. При бажанні користувач може підключити свій шрифт.
141
Файл |
Шрифт |
№ шрифту |
Назва шрифту |
|
DefaultFont |
0 |
Матричний шрифт 8х8 |
|
(за замовчуванням) |
||
|
|
|
|
trip.chr |
TriplexFont |
1 |
Напівжирний шрифт |
litt.chr |
SmallFont |
2 |
Тонкий шрифт |
sans.chr |
SansSerifFont |
3 |
Рубаний шрифт |
goth.chr |
GothicFont |
4 |
Готичний шрифт |
Можливість використовувати текст при створенні графічних зображень дозволяє робити написи чи підписи на малюнках. Основними процедурами для виведення тексту є наступні дві.
1.OutTextXY(x, y:integer; Text:string) – процедура виводить значення параметра Text, починаючи з точки (х, у).
2.OutText(Text:string) – процедура виводить значення параметра Text, починаючи з поточного положення вказівника СР.
Уцих процедурах параметр Text – це конкретний рядок або рядкова змінна.
При виведенні числових даних їх спочатку треба перетворити в рядок. Наступний фрагмент програми демонструє як це зробити.
Min := 6.234; |
{дійсне число} |
Str(Min:6:3, SMin); |
{перетворення числа Min у рядок SMin } |
OutTextXY(50, 70, ‘Мінімум = ‘ + SMin); {тут + означає конкатенацію}
3.SetTextStyle(Font:word; Direction:word; CharSize:word) – процедура дозволяє встановити шрифт. Параметр Font задає шрифт (№ шрифту) із вищенаведеної таблиці, Direction – орієнтацію (горизонтальна, вертикальна) і напрямок виведення тексту, CharSize – розмір символів. Дана процедура зазвичай використовується перед викликом попередніх двох
процедур.
Щоб взнати розмір символу або рядка по вертикалі та по горизонталі, можна скористатися функціями
TextHeight(Text:string):word;
TextWidth(Text:string):word;
які повертають відповідно висоту і ширину рядків Text в пікселах для поточних значень шрифту і розміру. У штрихових шрифтах розміри букв різні, і, значить, довжина і висота рядка в пікселах залежить не тільки від кількості букв у ньому, але і від їх написання.
Існує ще один спосіб встановлення потрібної величини шрифту. Для цього треба скористатися процедурою
SetUserCharSize(MultX, DivX, MultY, DivY:word).
Першими двома параметрами задається розмір по горизонталі, наступними – по вертикалі. Якщо прийняти за 1 значення ширини символу стандартного шрифту, то відношення MultX / DivX задає ширину символу, а MultY / DivY – висоту. Процедуру SetUserCharSize можна викликати до або після процедури SetTextStyle.
Виведенні рядків на екран можна розташовувати відносно поточного положення вказівника СР. Це виконується з допомогою процедури
SetTextJustify(Horiz, Vert :word).
Позиція вказівника СР може бути для рядків, що будуть виводитися, лівою чи правою межею або центром. Крім того, кожних відображуваний символ може бути розміщений у рядку вище позиції вказівника, нижче або по центру. Розташування рядків і символів на екрані задається за допомогою параметрів Horiz і Vert, можливі значення яких наведені в наступній таблиці.
142
Horiz |
Значення |
Призначення |
LeftText |
0 |
Оголосити поточну позицію вказівника СР лівою межею рядка |
CenterText |
1 |
Центрувати рядок відносно поточної позиції вказівника СР |
RightText |
2 |
Оголосити поточну позицію вказівника СР правою межею рядка |
Vert |
Значення |
Призначення |
BottomText |
0 |
Розташовувати символи нижче позиції вказівника СР |
CenterText |
1 |
Центрувати символи по вертикалі відносно позиції вказівника СР |
TopText |
2 |
Розташовувати символи вище позиції вказівника СР |
Анімаційні ефекти
Анімаційні програми містять рухомі об’єкти. У графічному режимі теж можна створювати ефекти руху. Можна виділити три способи створення ефектів руху.
1.Намалювати графічний об’єкт, а потім очистити екран. Ці дії повторювати стільки разів, скільки потрібно. При цьому графічний об’єкт кожний раз треба зображати на екрані з невеликим зміщення відносно попереднього його виведення на екран.
2.Запам’ятати невеликий фрагмент графічного зображення у буфері. Потім виводити його на екран із буфера кожний раз із невеликим зміщенням. Попереднє виведення із буфера буде перекриватися новим виведенням.
3.Використовувати відео сторінки.
Найкращим і найскладнішим є третій спосіб, а найгіршим – перший. Розглянемо другий спосіб.
При роботі з буфером важливо знати розмір пам’яті, яка необхідна для зберігання графічного фрагменту. Функція
ImageSize(x1, y1, x2, y2 : integer) : word
повертає розмір пам’яті в байтах, яка необхідна для зберігання прямокутної ділянки графічного зображення. Точки (х1, у1) і (х2, у2) є відповідно верхнім лівим і нижнім правим кутами прямокутної ділянки. Зазвичай така ділянка невеликих розмірів і вона повинна містити об’єкт, який будемо рухати. Оскільки для зберігання ділянки зручно використати динамічну пам’ять, то результат функції ImageSize треба використати в якості параметра процедури GetMem.
Збереження образу прямокутного фрагмента в пам’яті виконується процедурою
GetImage(x1, y1, x2, y2 : integer; var BitMap),
де x1, y1, x2, y2 – координати прямокутної ділянки, BitMap – нетипізований параметр, який повинен бути більшим або рівним 6 плюс розмір пам’яті, відведеної для області екрану. Перші два слова параметра BitMap визначають ширину і висоту області екрану, третє слово зарезервоване. Решта параметра BitMap використовується для зберігання двійкового образу прямокутної ділянки. Параметру BitMap співставляється динамічна змінна, для якої виділена пам’ять процедурою GetMem.
Процедура
PutImage(x, y : integer; var BitMap; BitBit : word)
виводить із буфера на екран копію прямокутної ділянки. Точка (х, у) визначає верхній лівий кут для виведення копії, параметр BitMap містить двійковий образ копії, а BitBit визначає спосіб взаємодії копії зображення із зображенням, що вже є на екрані. Взаємодія здійснюється за допомогою логічних операцій, які застосовуються до кожного біта копії та оригіналу зображення. Значенням параметра BitBit є одна із таких констант:
NormalPut = 0; |
{заміна наявного зображення на копію} |
XorPut = 1; |
{операція виключного «або»} |
OrPut = 2; |
{об’єднувальне «або»} |
AndPut = 3; |
{логічне «і»} |
NotPut = 4; |
{інверсія зображення} |
|
143 |
Логічні операції над зображенням дають такі результати. У випадку використання константи NormalPut зображення на екрані знищується і на цьому місці відображається копія із пам’яті. У разі вибору константи NotPut буде виведено копію зображення в інверсному коді – біти 0 заміняються на 1 та навпаки. Використання константи XorPut дає можливість видаляти зображення у тих точках екрану, де розміщено його оригінал. Якщо цю операцію застосувати двічі до тих самих координат, то зображення не зміниться.
Приклади
1. Програма демонструє використання основних графічних примітивів.
Program Example1;
uses Graph, Crt; {підключення модулів} const
{створення власного стилю зафарбування}
Zakraska : FillPatternType = ($00, $90, $bb, $ef, $12, $34, $9a, $cd);
{координати зірки – замкнутого багатокутника}
Zirka : array[1..11] of PointType = ((x:200; y:200), (x:300; y:200), (x:350; y:100), (x:400; y:200), (x:500; y:200), (x:440; y:250), (x:480; y:320),
(x:350; y:270), (x:220; y:320), (x:260; y:250), (x:200; y:200)); Var GrDriver, GrMode: integer; {змінні графічного драйвера і режиму}
i : integer;
begin |
|
|
randomize; |
{ініціалізація генератора випадкових чисел} |
|
GrDriver := Detect; |
|
{визначити драйвер автоматично} |
InitGraph(GrDriver, GrMode, ‘c\tp\bgi’); |
{ініціалізація графічного режиму} |
|
if GraphResult<>0 then |
{ініціалізація неуспішна} |
|
|
begin |
|
|
writeln(‘Не ініціалізований графічний режим‘); halt(1); |
|
|
end; |
|
{----------------------------------- |
ініціалізація успішна---------------------------------------------------- |
} |
{----------------------------- |
РІЗНОКОЛЬОРОВА РАМКА----------------------------------------------- |
} |
|
SetBkColor(14); |
{вибір кольору фону} |
|
SetLineStyle(CenterLn, 0, ThickWidth); |
{вибір стилю лінії} |
|
for i := 1 to 10 do |
|
|
begin |
|
|
SetColor(random(15)); |
{випадковий вибір кольору} |
|
Rectangle(10+i, 10+i, 630 – i, 470 – i); |
{прямокутник} |
|
end; |
|
|
delay(2000); |
{затримка} |
{------------------------------------------- |
КІЛЬЦЕ------------------------------------------------------------ |
} |
|
ClearDevice; |
|
|
SetBkColor(11); |
{вибір кольору фону} |
|
SetLineStyle(0, 0, 1); |
{вибір стилю лінії} |
|
for i := 0 to 25 do |
|
|
begin |
|
|
SetColor(random(15)); |
{випадковий вибір кольору} |
|
Circle(300, 200, 50 – i); |
{коло} |
|
end; |
|
|
delay(2000); |
{затримка} |
{------------------------------------------- |
ПАРАЛЕЛЕПІПЕД---------------------------------------------- |
} |
|
ClearDevice; |
|
|
SetBkColor(10); |
{вибір кольору фону} |
|
SetColor(5); |
{вибір кольору лінії} |
144
SetLineStyle(0, 0, 3); |
|
{вибір стилю лінії} |
|
SetFillPattern(Zakraska, 12); |
{вибір стилю зафарбування} |
||
Bar3D(200, 300, 400, 400, 100, true); |
{паралелепіпед} |
||
delay(2000); |
|
{затримка} |
|
{------------------------------------------- |
ЗАФАРБОВАНА ЗІРКА--------------------------------------- |
} |
|
ClearDevice; |
|
|
|
SetBkColor(14); |
|
{вибір кольору фону} |
|
SetColor(12); |
|
{вибір кольору лінії} |
|
DrawPoly(11, Zirka); |
|
{зірка} |
|
SetFillStyle(8, 1); |
|
{вибір стилю зафарбування} |
|
FloodFill(50, 50, 12); |
|
{зафарбування зірки} |
|
delay(2000); |
|
{затримка} |
|
{------------------------------------------- |
ВИВЕДЕННЯ ТЕКСТУ---------------------------------------- |
} |
|
ClearDevice; |
|
|
|
SetBkColor(14); |
|
{вибір кольору фону} |
|
SetColor(12); |
|
{вибір кольору} |
|
for i := 0 to 5 do |
|
|
|
begin |
|
|
|
SetTextStyle(0, 0, i); |
{вибір стилю тексту} |
||
OutTextXY(50, 50*(i+1), ‘Горизонталь‘); |
{виведення тексту} |
||
end; |
|
|
|
SetTextStyle(0, 1, 2); |
|
{вибір стилю тексту} |
|
OutTextXY(400, 200, ‘Вертикаль‘); |
{виведення тексту} |
||
Readln; |
|
{затримка графічного зображення} |
|
CloseGraph; |
{закриття графічного режиму} |
||
end. |
|
|
|
2. Програма демонструє рух кола по екрану з використанням очищення екрану.
Program Example2; |
|
|
|
|
uses Graph; |
{підключення модулів} |
|
||
Var |
GrDriver, GrMode: integer; |
{змінні графічного драйвера і режиму} |
||
begin |
i : integer; |
|
|
|
GrDriver := Detect; |
|
{визначити драйвер автоматично} |
||
|
|
|||
|
InitGraph(GrDriver, GrMode, ‘c:\bp\bgi’); |
{ініціалізація |
графічного |
|
режиму} |
|
|
|
|
|
if GraphResult<>0 then |
{ініціалізація неуспішна} |
|
|
|
begin |
|
|
|
|
writeln(‘Не ініціалізований графічний режим‘); halt(1); |
|
||
|
end; |
|
|
|
{----------------------------------- |
ініціалізація успішна |
---------------------------------------------------- |
} |
|
|
SetBkColor(14); |
|
{вибір кольору фону} |
|
|
SetColor(12); |
|
{вибір кольору} |
|
|
SetLineStyle(0, 0, 3); |
|
{вибір стилю лінії} |
|
|
for i := 1 to 200 do |
|
|
|
|
begin |
|
|
|
|
Circle(100+i, 100+i, 50); |
|
{коло} |
|
|
ClearDevice; |
|
{очищення екрану} |
|
end; |
|
Readln; |
{затримка графічного зображення} |
CloseGraph; |
{закриття графічного режиму} |
end. |
|
145
3. Програма імітує рух місяця на зоряному небі. Коли зображення місяця сягає межі екрану, напрям його руху змінюється..[8]
Program Example3; |
|
|
|
|
|
||
uses |
Graph, Crt; |
|
{підключення модулів} |
|
|||
Var |
GrDriver, GrMode : integer; |
{змінні графічного драйвера і режиму} |
|
||||
|
x, y, |
|
|
{координати об’єкта під час руху} |
|
||
|
dx, dy : integer; |
{приріст координат} |
|
||||
|
prt : pointer; |
{вказівник на область пам’яті, де зберігатиметься зображення} |
|||||
|
size : word; |
{розмір пам’яті, необхідної для збереження зображення} |
|
||||
|
leftX, leftY, |
|
{координати лівого верхнього і } |
|
|||
|
rightX, rightY : integer; |
{правого нижнього кута прямокутника,} |
|
||||
|
i : integer; |
|
|
{який містить зображення} |
|
||
|
|
|
{параметр циклу} |
|
|||
{---------------------------------- |
|
|
зображення зоряного неба---------------------------------------------- |
|
} |
||
procedure Sky; |
|
|
|
|
|
|
|
begin |
randomize; |
|
|
{ініціалізація генератора випадкових чисел} |
|||
|
|
|
|||||
|
SetBkColor(1); |
|
|
{вибір кольору фону} |
|
||
|
SetColor(14); |
|
|
|
{вибір кольору} |
|
|
|
SetLineStyle(0, 0, 1); |
|
|
{вибір стилю лінії} |
|
||
|
for i := 1 to 200 do |
|
|
|
|
||
end; |
Circle(random(640), random(480), 1); |
{коло} |
|
||||
|
|
|
|
|
|
|
|
{---------------------------------- |
|
|
зображення місяця на небі---------------------------------------------- |
|
} |
||
procedure Moon; |
|
|
|
|
|
||
begin |
SetColor(14); |
|
|
|
{вибір кольору} |
|
|
|
|
|
|
|
|||
|
Arc(450, 100, 270, 90, 50); |
|
|
{дуга кола} |
|
||
|
Arc(390, 100, 320, 40, 80); |
|
|
|
|
||
|
SetFillStyle(1, 14); |
|
|
{вибір стилю зафарбування} |
|
||
end; |
FloodFill(480, 100, 14); |
|
|
{зафарбування місяця} |
|
||
|
|
|
|
|
|
|
|
{---------------------------- |
|
|
збереження зображення у динамічній пам’яті--------------------------- |
} |
|||
procedure SaveClip; |
|
|
|
|
|
||
begin |
leftX := 445; leftY := 45; |
|
{координати прямокутника,} |
|
|||
|
|
|
|||||
|
rightX := 505; |
rightY := 155; |
|
{який містить місяць} |
|
||
|
size := ImageSize(leftX, leftY, rightX, rightY); |
|
|
||||
|
GetMem(prt, size); |
|
{виділити пам’ять} |
|
|||
|
GetImage(leftX, leftY, rightX, rightY, prt^); |
{зберегти зображення у пам’яті} |
|
||||
end; |
PutImage(leftX, leftY, prt^, xorput); |
|
{приховати зображення} |
|
|||
|
|
|
|
|
|
|
|
{-------------------------------------------- |
|
|
рух місяця------------------------------------------------------- |
|
|
} |
|
procedure Move; |
|
|
|
|
|
||
begin |
x := leftX; |
y := lefty; |
|
{стартові координати} |
|
||
|
|
|
|||||
|
dx := 10; |
dy := 10; |
|
{приріст координат} |
|
||
|
repeat |
|
|
|
|
|
|
|
x := x+dx; |
|
{зміна координат місяця} |
|
|||
|
y := y+dy; |
|
|
|
|
||
|
PutImage(x, y, prt^, xorput); |
{зобразити фігуру в нових координатах} |
|||||
|
delay(2000); |
|
{затримати рух} |
|
|||
146
PutImage(x, y, prt^, xorput); |
{сховати фігуру в старих координатах} |
if (x>640) or (x<0) then |
{якщо фігура сягнула межі екрану,} |
dx := -dx; |
{змінити напрям її руху} |
|
else |
|
|
if (y<0) or (y>480) then dy := -dy; |
|
until |
keypressed; |
|
end; |
|
|
{-------------------------------------------- |
основна програма |
-----------------------------------------------} |
begin |
|
|
GrDriver := Detect; |
{визначити драйвер автоматично} |
|
InitGraph(GrDriver, GrMode, ‘c:\tp\bgi’); |
{ініціалізація графічного режиму} |
|
Sky; |
|
|
Moon; |
|
|
SaveClip; |
|
|
Move; |
|
|
end. |
|
|
4.Побудувати графік функції у = |sin x| + cos|x|. [8]
Для зображення графіка функції треба перевести координати його точок у екранні
точки. Щоб графік мав звичний вигляд на екрані, треба для кожної осі координат підбирати відповідний масштаб. Область визначення даної функції - це вся вісь абсцис, а область значень - відрізок [-2; 2]. Якби за одиницю масштабу на осі ординат вибрати один піксел, то відрізок [-2; 2] мав би довжину 5 пікселів, а, отже, графік фактично мав би вигляд прямої. Дуже рідко вибирають за екранну масштабну одиницю 1 піксел. Зазвичай – це декілька пік селів і часто це число кратне 10. Назвемо екранну масштабну одиницю просто масштабом. Зауважимо також, що для кожної із осей координат інколи масштаб вибирають різний.
Система координат графіка відрізняється від системи координат екрану. Загалом, початок першої системи повинен знаходитися в центрі екрану та вісь ординат першої системи має протилежний напрям до осі ординат екрану. Якщо екран складається із 640х480 точок, то початок системи координат графіка буде в точці (320, 240).
При побудові графіка функції у = f(x) аргументу х надають можливих значень, обчислюють можливі у і отримують точки (х, у) графіка. На екрані точками є пари (х-екрану, у-екрану), причому 0 ≤ х-екрану < 640 і 0 ≤ у-екрану < 480 для екрану 640х480. Для побудови точки графіка на екрані спочатку надаємо значення координаті х-екрану із відповідного діапазону. Потім перераховуємо за формулою
х= (х-екрану - х-центру-екрану) / масштаб-осі-х,
хкоординату реального графіка. Далі для знайденого х обчислюємо у = f(x). Наостанок, переводимо у координату в екранний еквівалент за формулою
|
|
у-екрану = у-центру-екрану – масштаб-осі-у * у. |
|
Знайдену точку (х-екрану, у-екрану) зображаємо на екрані. |
|
||
Program Example4; |
{ графік функції у = |sin x| + cos|x|} |
|
|
uses |
Graph, Crt; |
|
|
Var |
GrDriver, GrMode : integer; |
|
|
|
scale : real; |
{масштаб} |
|
|
cx, cy : integer; |
{координати центру екрану} |
|
{-------------------------------- |
|
аналітична функція, графік якої будується--------------------------- |
} |
function f(x : real) : real; begin
f := abs(sin(x))+cos(abs(x));
end;
147
{---------------------------------------- |
виведення осей координат---------------------------------------- |
} |
|
procedure axes; |
|
|
|
begin |
SetColor(1); |
|
|
|
|
|
|
|
Line(cx, 0, cx, GetMaxY); |
{вісь У} |
|
|
Line(0, cy, GetMaxY, cy); |
{вісь Х} |
|
|
{стрілки на осі Х} |
|
|
Line(GetMaxX – 10, cy – 5, GetMaxX, cy);
Line(GetMaxX – 10, cy + 5, GetMaxX, cy);
{стрілки на осі У}
Line(cx, 0, cx – 5, 10);
Line(cx, 0, cx + 5, 10);
{написи на осях}
OutTextXY(GetMaxX – 10, cy + 20, ‘X’); OutTextXY(cx + 10, 10, ‘Y’);
end; |
|
|
|
{---------------------------------------- |
|
розмітка осей координат------------------------------------------ |
} |
procedure graduir; |
|
|
|
var |
i, j : real; |
{позначки на осях} |
|
begin |
s : string[7]; |
{рядок для виведення позначки на осях} |
|
SetColor(1); |
|
|
|
|
|
|
|
|
j := 0; |
{позначка ‘0’ в центрі координат} |
|
|
{-------------------------- |
розмітити вісь Х------------------------- |
} |
{позначки у вигляді вертикальних рисок} repeat
i := cx+(-j)*scale;
Line(round(i), cy-5, round(i), cy+5);
if j<>0 then {не виводити повторно позначку ‘0’} begin
|
str(-j:6:2, s); |
{перетворити числову позначку в текстову} |
|
end; |
OutTextXY(round(i)-10, cy+10, s); |
{і відобразити її на екрані} |
|
|
|
|
|
{зобразити позначки на горизонтальній осі} |
|
||
i := cx+j*scale; |
|
|
|
Line(round(i), cy-5, round(i), cy+5); |
|
||
if j<>0 |
then |
|
|
begin |
str(j:6:2, s); |
{перетворити число на рядок} |
|
|
|||
end; |
OutTextXY(round(i)-10, cy+10, s); |
|
|
|
|
|
|
j := j+pi; |
|
|
|
until j = 8*pi; |
|
{позначка вичерпано} |
|
{-------------------------- |
розмітити вісь У------------------------- |
} |
|
j := 0; |
|
|
|
repeat |
|
|
|
i := cx - j*scale; |
{розташування позначки на осі У} |
||
Line(cx+3, round(i), cx-3, round(i)); |
|
||
if j<>0 |
then |
|
|
begin |
str(j:4:1, s); |
{перетворення числа на рядок} |
|
|
|||
{вивести значення, відповідне позначці на вертикальній осі, у межах від 0 до 2}
148
OutTextXY(cx+15, round(i)-2, s);
end;
i := cy+j*scale;
Line(cx+3, round(i), cx-3, round(i)); if j<>0 then
begin
str(-j:4:1, s); |
{перетворити число на рядок} |
|
{вивести позначки на вертикальній осі в межах від -2 до 0} |
||
OutTextXY(cx+15, round(i)-2, s); {і відобразити її на екрані} |
||
end; |
|
|
j := j+0.5; |
{розмітити вертикальну вісь через кожні 0.5 ділень} |
|
end; |
until j = 2; |
|
|
{діапазон позначок від -2 до 2} |
|
|
|
|
|
|
|
{-------------------------------------------- |
|
|
побудова графіка----------------------------------------------- |
} |
|
procedure build_graph; |
|
|
|
|
|
var |
x0, y0, x1, y1 : integer; |
{екранні координати кінців відрізка графіка} |
|||
begin |
x : real; |
|
|
|
|
for x0 := 0 to GetMaxX do |
|
{вибір екранної абсциси} |
|||
|
|
||||
|
begin |
|
|
|
|
|
x := (x0-cx)/scale; |
|
{обчислити х координату графіка} |
||
|
y0 := round(cy – scale*f(x)); |
|
|||
|
if x0>0 then |
|
|
|
|
|
Line(x0, y0, x1, y1); |
{зобразити відрізок графіка} |
|||
|
x1 := x0; |
{зберегти координати кінця попереднього відрізка} |
|||
|
y1 := y0; |
|
|
|
|
end; |
end; |
|
|
|
|
|
|
|
|
|
|
{-------------------------------------------- |
|
|
основна програма---------------------------------------------- |
} |
|
begin |
GrDriver := Detect; |
|
|
|
{визначити драйвер автоматично} |
|
|
|
|
||
|
InitGraph(GrDriver, GrMode, ‘c:\tp\bgi’); |
{ініціалізація графічного режиму} |
|||
|
cx := GetMaxX div 2; |
|
{визначити координати центру екрану} |
||
|
cy := GetMaxY div 2; |
|
|
|
|
|
SetBkColor(15); |
|
|
{вибір кольору фону} |
|
|
SetColor(1); |
|
|
{вибір кольору} |
|
|
OutText(‘ input scale (20 … 100):’); |
|
|||
|
gotoxy(27, 1); |
|
|
|
|
|
read(scale); |
|
|
{ввести масштаб} |
|
|
ClearDevice; |
|
|
{очистити екран} |
|
|
axes; |
|
|
{зобразити осі координат} |
|
|
graduir; |
|
|
{розмітити осі} |
|
|
OutTextXY(10, 30, ‘y=|sin(x)| + cos|x|’); {вивести напис} |
||||
end. |
build_graph; |
|
|
{зобразити графік} |
|
|
|
|
|
|
|
149
☺ Завдання для виконання
Основний рівень
1.Написати програму зображення малюнка на екрані.
2.Написати програму побудови графіка функції:
1. y = x 2 − x 2 , |
x [− 2, 2] . |
2.y = 6x(x2 +−13) .
3.y = 1+2xx 2 .
4.y = x3 +3x2 + 2 .
5. y = x ln2 x , |
x > 0 . |
6.y = 4x 2 − x3 .
7. |
y = |
x 2 |
. |
||
x 2 |
+3 |
||||
|
|
|
|||
8.y = x 4 − 2x3 + 3.
9. |
y = x ln x, |
x > 0 |
|||
|
1 |
|
|
|
|
10. |
y = x |
Пі |
. |
|
|
11. |
y = x2 e−x . |
|
|||
12. |
y = 8cos2 ( |
x |
−12) . |
||
|
|||||
|
2 |
|
|||
13. y = 5x arctg( x 2 ) + 2 . 4
14.y = {x 2 − 4}.
15.y = [x 2 − 4].
Підвищений рівень
1. Створити програму зображення фігури.
№ |
Вид фігури |
Колір фону |
Колір ліній |
Колір |
||
п/п |
штриховки |
|||||
|
|
|
|
|||
|
|
|
|
|
|
|
|
1 |
|
|
1. |
жовтий |
|
|
|
|
||||
|
|
фіолетовий |
чорний |
|
||
1. |
|
2 |
|
|||
|
|
2. |
синій |
|||
|
|
|
|
|||
|
|
|
|
|
|
|
|
1 |
|
|
1. |
світло-сірий |
|
2 |
блакитний |
червоний |
|
|
2. |
|
|
|||
|
|
2. |
білий |
||
|
|
|
|
||
|
|
|
|
|
|
150
