скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыКурсовая работа: Побудова динамічної графіки

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.  Результати роботи програми


Страницы: 1, 2, 3


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.