Рефераты. Побудова динамічної графіки

Помічу, що шрифт 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, 4, 5



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.