Курсовая работа: Побудова динамічної графіки
const
NormalPut= 0;{Заміна існуючого зображення на копію}
XorPut = 1;{Виняткове АБО}
OrPut = 2;{Об'єднувальне АБО}
AndPut = 3;{Логічне І}
NotPut = 4;{Інверсія зображення}
Найбільш часто використовуються операції NormalPut, XORPut і NotPut. Перша з них просто стирає частину екрану і на це місце поміщає копію з пам'яті в тому вигляді, як вона там зберігається. Операція NotPut робить те ж саме, але копія виводиться в нверсному вигляді. Для монохромного режиму це означає заміну пікселів, що світяться, на темні і навпаки. В кольоровому режимі операція NotPut застосовується до коду кольору кожного пікселя. Наприклад, для White (код 15 або в двійковому вигляді 1111) ця операція дасть код 0000 = 0 = Black, для Red = 4 = 0100 одержимо 1011 = 11 = LightCyan і т.д. Операція XORPut, застосована до того ж місця екрану, звідки була одержана копія, зітре цю частину екрану. Якщо операцію застосувати двічі до однієї і тієї ж ділянки, вид зображення на екрані не зміниться. У такий спосіб можна досить просто переміщати зображення по екрану, створюючи ілюзію руху.
· Виведення тексту
Описувані нижче стандартні процедури і функції підтримують виведення текстових повідомлень в графічному режимі. Це не одне і те ж, що використовування процедур Write або WriteLn. Річ у тому, що спеціально для графічного режиму розроблені процедури, що забезпечують виведення повідомлень різними шрифтами в горизонтальному або вертикальному напрямі, із зміною розмірів і т.д. Проте в стандартних шрифтах, розроблених для цих цілей фірмою Borland, відсутня кирилиця, що виключа виведення російськомовних повідомлень.
З другого боку, процедури Write і WriteLn після завантаження в пам'ять другої половини таблиц знакогенератора (а ця операція легко реалізується в адаптерах EGA і VGA) здатн виводити повідомлення з використанням національного алфавіту, але не володіють могутніми можливостями спеціальних процедур.
Нижче описуються стандартні засоби модуля Graph для виведення тексту.
Процедура OutText.
Виводить текстовий рядок, починаючи з поточним положенням покажчика. Заголовок:
Procedure OutText(Txt: String);
Тут Txt - рядок, що виводиться.
При горизонтальному напрямі висновку покажчик зміщується в кінець виведеного тексту, при вертикальному - не міняє свого положення. Рядок виводиться відповідно до встановленого стилю і вирівнювання. Якщо текст виходить за меж екрану, то при використовуванні штрихових шрифтів він відсікається, а у раз стандартного шрифту не виводиться.
Процедура OutTextXY.
Виводить рядок, починаючи із заданого місця.
Заголовок:
Procedure OutTextXY (X,Y: Integer; Txt: String);
Тут X, У - координати точки виведення; Txt - рядок, що виводиться. Відрізняється від процедури OutText тільки координатами виведення. Покажчик не міняє свого положення.
Процедура SetTextStyle.
Встановлює стиль текстового висновку на графічний екран.
Заголовок:
Procedure SetTextStyle(Font,Direct,Size: Word);
Тут Font - код (номер) шрифту; Direct - код напряму; Size - код розміру шрифту.
Для вказівки коду шрифту можна використовувати наступні заздалегідь певні константи:
const
DefaultFont = 0;{Точковий шрифт 8x8}
TriplexFont = 1;{Потрійний шрифт TRIP.CHR}
SmallFont = 2;{Зменшений шрифт LITT.CHR}
SansSerifFont = 3;{Прямий шрифт SANS.CHR}
GothicFont = 4;{Готичний шрифт GOTH.CHR}
Зазначу, що ц константи визначають всі шрифти для версій 4.0, 5.0, 5.5 і 6.0. У версії 7,0 набір шрифтів значно розширено, проте для нових шрифтів не передбачен відповідні мнемонічні константи. В цій версії крім перерахованих Ви можете при зверненні до SetTextStyle використовувати такі номери шрифтів:
Номер |
Файл |
Короткий опис |
5 | scri.chr | «рукописний» шрифт |
6 | simp.chr | одноштриховий шрифт типу Courier |
7 | tscr.chr | Красивий похилий шрифт типуTimes Italic |
8 | Icom.chr | Шрифт типу Times Roman |
9 | euro . chr | Шрифт типу Courier збільшеного розміру |
10 | bold.chr | Крупний двохштриховий шрифт |
Шрифт DefaultFont входить в модуль Graph і доступний у будь-який момент. Це -единий матричний шрифт, тобто його символи створюються з матриць 8x8 пікселів. Вся решта шрифтів - векторна: їх елементи формуються як сукупність векторів (штрихів), що характеризуються напрямом і розміром. Векторні шрифти відрізняються більш образотворчими можливостями, але головна їх особливість полягає в легкості зміни розмірів без стотного погіршення якості зображення. Кожний з цих шрифтів розміщується в окремому дисковому файлі. Якщо Ви збираєтеся використовувати який-небудь векторний шрифт, відповідний файл повинен знаходитися у Вашому каталозі, інакше виклик цього шрифту ігнорується і підключається стандартний.
Помічу, що шрифт DefaultFont створюється графічним драйвером у момент ініціалізації графіки на підставі аналізу текстового шрифту. Тому, якщо Ваш ПК здатний виводити кирилицю в текстовому режимі, Ви зможете за допомогою цього шрифту виводити російськомовні повідомлення і в графічному режимі. В решті шрифтів ця можливість з'являється тільки після їх модифікації.
Для завдання напряму видачі тексту можна використовувати константи:
const
HorizDir = 0;{Зліва направо}
VertDir = 1;{Від низу до верху}
Як бачимо, стандартні процедури OutText і OutTextXY здатні виводити повідомлення лише в двох можливих напрямах - зліва направо або від низу до верху. Знаючи структуру векторних шрифтів, неважко побудувати власні процедури, здатні виводити повідомлення в будь-якому напрямі.
Кожний шрифт здатний десятиразово змінювати свої розміри. Розмір символів, що виводяться, кодується параметром Size, який може мати значення в діапазоні від 1 до 10 (точковий шрифт - в діапазоні від 1 до 32). Якщо значення параметра рівно 0. встановлюється розмір 1, якщо більше 10 - розмір 10. Мінімальний розмір шрифту. при якому ще виразно розрізняються всі його деталі, рівний 4 (для точкового шрифту - 1).
Процедура SetTextJustify.
Зада вирівнювання тексту, що виводиться, по відношенню до поточного положення покажчика або до заданих координат.
Заголовок:
Procedure SetTextJustify(Horiz,Vert: Word);
Тут Horiz - горизонтальне вирівнювання; Vert - вертикальне вирівнювання. Вирівнювання визначає як розміщуватиметься текст - лівіше або правіше вказаного місця, вище, нижче або по центру. Тут можна використовувати такі константи:
const
LeftText = 0;{Покажчик зліва від тексту}
CenterText= 1;{Симетрично зліва і справа, верху і знизу}
RightText = 2;{Покажчик праворуч від тексту}
BottomText= 0;{Покажчик знизу від тексту}
TopText = 2;{Покажчик зверху від тексту}
Зверніть увагу на невдалі, з моєї точки зору, імена мнемонічних констант: якщо, наприклад, Ви задасте LeftText, що в перекладі означає «Лівий Текст», повідомлення буде розташовано праворуч від поточного положення покажчика (при висновку процедурою OutTextXY - праворуч від заданих координат). Також «навпаки» потрактує і решта констант.
Процедура SetUserCharSize.
Змінює розмір символів, що виводяться, відповідно до заданих пропорцій.
Заголовок:
Procedure SetUserCharSize(XI,X2,Yl,Y2: Word);
Тут X1...Y2 - вирази типа Word, що визначають пропорції по горизонталі і вертикалі.
Процедура застосовується тільки по відношенню до векторних шрифтів. Пропорції задають масштабний коефіцієнт, що показує в скільки разів збільшиться ширина і висота символів, що виводяться, по відношенню до стандартно заданих значень. Коефіцієнт по горизонталі знаходиться як відношення X1 до Х2, по вертикалі - як відношення Y1 до Y2. Щоб, наприклад, подвоїти ширину символів, необхідно задати X1=2 і Х2=1. Стандартний розмір символів встановлюється процедурою SetTextStyle, яка відміняє попереднє їй звернення до SetUserCharSize.
Функція TextWidth.
Повертає довжину в пікселях текстового рядка, що виводиться.
Заголовок:
Function TextWidth (Txjt: String): Word;
Враховуються поточний стиль і коефіцієнти зміни розмірів символів, задані відповідно процедурами SetTextStyle і SetUserCharSize.
Функція TextHeight.
Повертає висоту шрифту в пікселях.
Заголовок:
Function TextHeight(Txt: String): Word;
Процедура GetTextSettings.
Повертає поточний стиль і вирівнювання тексту.
Заголовок:
Procedure GetTextSettins(var Textlnfo: TextSettingsType);
Тут Textlnfo - змінна типа TextSettingsType, який в модулі Graph визначений таким чином:
type
TextSettingsType = record
Font : Word; {Номер шрифту}
Direction: Word; {Напрям}
CharSize : Word; {Код розміру}
Horiz : Word; {Горизонтальне вирівнювання}
Vert : Word; {Вертикальне вирівнювання}
end;
- Включення драйвера і шрифтів в тіло програми
Функція InstallUserFont.
Дозволяє програм використовувати нестандартний векторний шрифт. Заголовок функції:
Function InstallUserFont(FileName: String): Integer;
Тут FileName - м'я файлу, що містить векторний шрифт.
Як вже мовилося, в стандартну поставку Турбо Паскаля версій 4.0 - 6.0 включено три векторн шрифти, для версії 7.0 - 10. Функція InstallUserFont дозволяє розширити цей набір. Функція повертає ідентифікаційний номер нестандартного шрифту, який може використовуватися при зверненні до процедури SetTextStyle.
Функція InstallUserDriver.
Включа нестандартний графічний драйвер в систему BGI-драйверів. Заголовок функції:
Function InstallUserDriver(FileName: String; AutoDetectPtr: Pointer): Integer;
Ця функція розширює і без того достатньо обширний набір стандартних графічних драйверів і призначена в основному для розробників апаратних засобів.
2. Блок-схема
Рух установки вліво вздовж екрану
Size:=ImageSize(1,380,270,479);
GetMem(p2,size);
GetImage(1,380,270,479,p2^);
i:=354;
b:=2;
i>=147
PutImage(i,380,p2^,1);
Delay(5000);
cleardevice;
i:=i-3;
PutImage(i,380,p1^,1);
Delay(5000);
cleardevice;
i:=i-3;
Підняття ракети на 45 x:=180
x<226
y:=x*pi/180;
i:=round(240*cos(y))+404;
j:=round(240*sin(y))+406;
i1:=round(242*cos(y+0.1111))+404;
j1:=round(242*sin(y+0.1111))+406;
i2:=round(26*cos(y+1.59))+404;
j2:=round(26*sin(y+1.59))+406;
i3:=round(260*cos(y+0.05555))+404;
j3:=round(260*sin(y+0.05555))+406;
Line(i,j,404,406);
Line(i1,j1,i2,j2);
line(404,406,i2,j2);
line(i,j,i3,j3);
line(i1,j1,i3,j3);
line(i,j,i1,j1);
x:=x+2;
SetFillStyle(6,9);
Floodfill(i+5,j-1,3);
SetFillStyle(6,4);
Floodfill(i1-5,j1+4,3);
PutImage(154,407,p2^,1);
sound(3000-x*10);
delay(10000);
nosound;
Стартовий вогонь
k:=1..300;1
i:=random(100)+400;
j:=random(179)+380;
putpixel(i,j,random(16));
3. Текст програми
Uses Graph,crt;
const vga=9;
var
p2,p1:pointer;
Driver, Mode:integer; x,j,i,i1,j1,i2,j2,j3,i3,k:integer;Size:word;m:char;
y:real;
procedure raket; {Процедура створення ракети}
begin
line(i+20,j+13,i+260,j+13); {Основа ракети}
line(i+20,j-13,i+260,j-13);
line(i+20,j-13,i+20,j+13);
line(i+260,j-13,i+260,j+13);
outtextxy(344,390,'CCCP'); {Напис на ракеті}
Line(i,j,i+20,j+13); {Кінець ракети}
Line(i,j,i+20,j-13);
end;
Begin
Driver := vga;
Mode:=2;
InitGraph(Driver, Mode,'d:\BP\BGI') ; {Ініціалізація графіки}
setColor(3);
Line(509,417,254,417); {Платформа}
Circle(479,449,30); {Створення шасі}
SetFillStyle(1,1);
Floodfill(479,440,3);
SetFillStyle(1,3);
Circle(479,449,3);
Floodfill(479,449,3);
SetFillStyle(7,12);
Circle(479,464,5);
Floodfill(479,464,3);
Circle(479,434,5);
Floodfill(479,434,3);
Circle(465,449,5);
Floodfill(465,449,3);
Circle(494,449,5);
Floodfill(494,449,3);
Size:=ImageSize(449,419,509,479);
GetMem(p1,size);
GetImage(449,419,509,479,p1^);
PutImage(384,419,p1^,1);
PutImage(319,419,p1^,1);
PutImage(254,419,p1^,1);
Line(300,417,300,407); {Тримачі ракети}
Line(320,417,320,407);
Line(462,417,462,407);
Line(442,417,442,407);
Circle(488,394,10);
PutPixel(488,394,2);
Line(478,417,478,394);
Line(498,417,498,394);
i:=240; {Прорисовка ракети}
j:=394;
SetFillStyle(6,9);
raket;
Floodfill(241,394,3); {Розфарбування ракети}
Floodfill(261,394,3);
SetFillStyle(6,10);
Floodfill(488,394,3);
SetFillStyle(6,9);
Floodfill(488,405,3);
Size:=ImageSize(240,380,509,479);
GetMem(p1,size);
GetImage(240,381,509,479,p1^);
ClearDevice;
PutImage(1,380,p1^,1);
Circle(50,50,30); {Створення нового колеса}
SetFillStyle(1,1);
Floodfill(55,50,3);
SetFillStyle(1,3);
Circle(50,50,3);
floodfill(50,50,3);
SetFillStyle(7,12);
Circle(40,40,5);
floodfill(40,40,3);
Circle(40,61,5);
floodfill(40,61,3);
Circle(60,40,5);
floodfill(60,40,3);
Circle(60,61,5);
floodfill(60,61,3);
Size:=ImageSize(20,20,80,80);
GetMem(p2,size);
GetImage(20,20,80,80,p2^); { Занесення нового колеса в пам’ять}
PutImage(15,418,p2^,0); {Створення нових шасі}
PutImage(80,418,p2^,0);
PutImage(145,418,p2^,0);
PutImage(210,418,p2^,0);
Size:=ImageSize(1,380,270,479);
GetMem(p2,size);
GetImage(1,380,270,479,p2^); {Занесення установки в пам’ять}
ClearDevice;
readkey; { Рух установки вліво вздовж екрану}
i:=354;
b:=2;
while (i>=147) do
begin
PutImage(i,380,p2^,1);
Delay(5000);
cleardevice;
i:=i-3;
PutImage(i,380,p1^,1);
Delay(5000);
cleardevice;
i:=i-3;
end;
PutImage(i,380,p1^,1);
i:=144;
j:=j-1;
SetColor(3);
raket;
Size:=ImageSize(154,407,509,479);
GetMem(p2,size);
GetImage(154,407,509,479,p2^);
x:=180;
while (x<226) do {Підняття ракети на 45}
begin
cleardevice;
y:=x*pi/180;
i:=round(240*cos(y))+404;
j:=round(240*sin(y))+406;
i1:=round(242*cos(y+0.1111))+404;
j1:=round(242*sin(y+0.1111))+406;
i2:=round(26*cos(y+1.59))+404;
j2:=round(26*sin(y+1.59))+406;
i3:=round(260*cos(y+0.05555))+404;
j3:=round(260*sin(y+0.05555))+406;
Line(i,j,404,406);
Line(i1,j1,i2,j2);
line(404,406,i2,j2);
line(i,j,i3,j3);
line(i1,j1,i3,j3);
line(i,j,i1,j1);
x:=x+2;
SetFillStyle(6,9); {Розфарбування ракети}
Floodfill(i+5,j-1,3);
SetFillStyle(6,4);
Floodfill(i1-5,j1+4,3);
PutImage(154,407,p2^,1);
sound(3000-x*10);
delay(10000);
nosound;
end;
for k:=1 to 300 do {Стартовий вогонь}
begin
i:=random(100)+400;
j:=random(179)+380;
putpixel(i,j,random(16));
end;
delay(65000);
Size:=ImageSize(228,215,519,406);
GetMem(p1,size);
GetImage(228,215,519,406,p1^); {Занесення піднятої ракети в пам’ять}
cleardevice;
i:=228;
while (i>1) do {Рух ракети в лівий верхній кут}
begin
PutImage(154,407,p2^,1);
Putimage(i,i-13,p1^,1);
delay(1000);
cleardevice;
i:=i-5;
end;
readkey;
dispose(p1);
dispose(p2);
end.
4. Результати роботи програми