Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
69
Добавлен:
02.05.2014
Размер:
69 Кб
Скачать

- 81 -
ѓ ‹ Ђ ‚ Ђ 4 (Ђ­¤ан ‹  Њ®в)
-------------------
Њ…•ЂЌ€‡Њ› „‚“•Њ…ђЌЋ‰ ѓђЂ”€Љ€

‚л ¬®¦ҐвҐ бзЁв вм, зв® нЄа ­ Є®¬ЇмовҐа  Ї®¤®ЎҐ­ «Ёбвг Ўг¬ ЈЁ, Є®в®ал© ¬®¦­®
Ё§ЈЁЎ вм, бў®а зЁў вм ў вагЎ®зЄг Ё ў®®ЎйҐ Є Є гЈ®¤­® ва ­бд®а¬Ёа®ў вм ў
агЄ е. —в®Ўл ¤Ґ« вм Ї®¤®Ў­лҐ ўҐйЁ, ¬л ¤®«¦­л §­ вм п§лЄ, б Ї®¬®ймо Є®в®а®Ј®
ўбҐ нв® ўлЇ®«­пҐвбп - п§лЄ ¬ вҐ¬ вЁЄЁ.
‚ ¤ ­­®© Ј« ўҐ ¬л Ї®§­ Є®¬Ё¬бп б ⥬, зв® ­ §лў Ґвбп ¤ўге¬Ґа­ п Їа®ҐЄжЁп Ё
Ё§гзЁ¬ б«Ґ¤гойЁҐ ⥬л:
- Љ а⥧Ё ­бЄ п Ё«Ё ¤ўге¬Ґа­ п Їа®ҐЄжЁп;
- ’®зЄЁ, «Ё­ЁЁ Ё ®Ў« бвЁ;
- ’а ­б«пжЁп;
- Њ бив ЎЁа®ў ­ЁҐ;
- Џ®ў®а®вл;
- ђ §аҐ§ ­ЁҐ;
- €бЇ®«м§®ў ­ЁҐ ¬ ваЁж.

„‚“•Њ…ђЌЂџ ЏђЋ…Љ–€џ

„ўг嬥а­го Їа®ҐЄжЁо (2-D), Ё­ зҐ ­ §лў Ґ¬го Є а⥧Ё ­бЄ®©, ¬®¦­® ба ў­Ёвм б
«Ёб⮬ Ўг¬ ЈЁ ў Є«Ґв®зЄг. ђЁб.4.1 Ї®Є §лў Ґв нв®.
- 82 -

®бм Y Е
Е
Е
Е
(-3,4) Е
. Е
Е
Е (1,1) ®бм X
Е .
ДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕД
Е
Е
Е
Е
Е
Е

ђЁб.4.1. ’®зЄЁ (1,1) Ё (-3,4) ­  ¤ўг嬥୮© Їа®ҐЄжЁЁ.

Љ ¦¤ п в®зЄ  ў ¤ўг嬥୮© Їа®ҐЄжЁЁ ®¤­®§­ з­® ®ЇЁблў Ґвбп ¤ўг¬п
Є®®а¤Ё­ в ¬Ё. ЋЎлз­® нвЁ Є®®а¤Ё­ вл ®Ў®§­ з овбп ЎгЄў ¬Ё x Ё y, Ј¤Ґ x
®ЇаҐ¤Ґ«пҐв в®зЄг ­  Ј®аЁ§®­в «м­®© ®бЁ X,   y § ¤ Ґв в®зЄг ­  ўҐавЁЄ «м­®©
®бЁ Y. Ќ ЇаЁ¬Ґа, Ґб«Ё ­ ¬ § е®зҐвбп ­ аЁб®ў вм в®зЄЁ (1,1) Ё (-3,4), в® ¬л
ᤥ« Ґ¬ в Є, Є Є Ї®Є § ­® ­  аЁб.4.1.
Ќ з ў б Ё§г祭Ёп бў®©бвў ¤ўг嬥୮© Їа®ҐЄжЁЁ, ¬л Ўг¤Ґ¬ Ї®б⥯Ґ­­® ¤ўЁЈ вмбп
®в Їа®бв®Ј® Є б«®¦­®¬г, Ё Є ⮬㠢६Ґ­Ё, Є®Ј¤  ¤®©¤Ґ¬ ¤® ваҐе¬Ґа­ле
®ЎкҐЄв®ў, ®­Ё ­Ґ Ї®Є ¦гвбп зҐаҐбзга б«®¦­л¬Ё. Ља®¬Ґ в®Ј®, бгйҐбвўгҐв ўҐ¤м
­Ґ¬ «® ўҐбм¬  ЇаЁў«ҐЄ вҐ«м­ле ¤ўг嬥а­ле ЁЈа, ® Є®в®але в Є¦Ґ ­Ґ бв®Ёв
§ Ўлў вм. ’Ґ¬ ў ¦­ҐҐ Ї®­пвм ¬Ґе ­Ё§¬л Ї®«г祭Ёп ¤ўг嬥୮© Ја дЁЄЁ Ё
а бᬮваҐвм  «Ј®аЁв¬л а §«Ёз­ле Ја дЁзҐбЄЁе ЇаҐ®Ўа §®ў ­Ё©.


’Ћ—Љ€, ‹€Ќ€€ € ЋЃ‹Ђ‘’€

‚ᥠ¬л ўЁ¤Ґ«Ё ЁЈал вЁЇ  Asteroids, Spectre Ё Major Havoc. Њ­®ЈЁҐ Ё§ ­Ёе
Ё¬Ґов ®ЎйЁҐ зҐавл ЇҐаўле ўЁ¤Ґ®ЁЈа - ўбҐ ®­Ё ўлЇ®«­Ґ­л «Ё­Ёп¬Ё Ё ўбҐ ®­Ё,
Є Є Їа ўЁ«®, Ї«®бЄЁҐ. Љбв вЁ, ў ЇаҐ¤л¤гйЁе Ј« ў е ¬л ҐйҐ ­ЁзҐЈ® ­Ґ ¤Ґ« «Ё
¤«п аЁб®ў ­Ёп Їа®ҐЄжЁЁ Єа®¬Ґ ®в®Ўа ¦Ґ­Ёп в®зЄЁ.

- 83 -

’®зЄЁ
---------------
Њл 㦥 ¤ «Ё ®ЇаҐ¤Ґ«Ґ­ЁҐ в®зЄҐ. Ћ­  ЇаҐ¤бв ў«пҐв б®Ў®© Ї®§ЁжЁо ­  Ї«®бЄ®бвЁ,
Є®в®аго ¬®¦­® ®ЇЁб вм Ї а®© Є®®а¤Ё­ в е Ё г. „ ў ©вҐ ­ ЇЁиҐ¬ ¬ «Ґ­мЄго
Їа®Ја ¬¬г ­  ‘Ё, аЁбгойго в®зЄЁ ­  нЄа ­Ґ. ‹ЁбвЁ­Ј 4.1 Ї®Є §лў Ґв в Єго
Їа®Ја ¬¬г.

‹ЁбвЁ­Ј 4.1. Џа®Ја ¬¬ , аЁбгой п в®зЄЁ (POINTY.C).
-------------------------------------------------------------------------

#include <stdio.h> // include the basics
#include <graph.h> // include Microsofts Graphics Header

void main(void)
{

int x,y,index,color;

// put the computer into graphics mode

_setvideomode(_VRES16COLOR); // 640x480 in 16 colors

// let's draw 10000 points randomly on the screen

for (index = 0; index<10000; index++)
{
// get a random position and color and plot a point there

x = rand()%640;
y = rand()%480;
color = rand()%16;
_setcolor(color); // set the color of the pixel to be drawn
_setpixel(x,y); // draw the pixel

} // end for index

// wait for the user to hit a key

while(!kbhit()){}

// place the computer back into text mode

_setvideomode(_DEFAULTMODE);

} // end main
--------------------------------------------------------------------------
’ҐЇҐам а §ЎҐаҐ¬бп, зв® ¤Ґ« Ґв нв  Їа®Ја ¬¬ :

- Љ®¬ЇмовҐа ЇҐаҐў®¤Ёвбп ў ०Ё¬ VGA б Ї®¬®ймо ўл§®ў  дг­ЄжЁЁ ‘Ё
_setvideomode(_VRES16COLOR0. ќв  дг­ЄжЁп Ё§ Ја дЁзҐбЄ®© ЎЁЎ«Ё®вҐЄЁ
Microsoft. Џ®б«Ґ нв®Ј® Їа®Ја ¬¬  ўе®¤Ёв ў Ј« ў­л© жЁЄ«. ‚
бвагЄвгаҐ
- 84 -
FOR Є ¦¤л© а § б«гз ©­л¬ ®Ўа §®¬ ЈҐ­ҐаЁаговбп 3 зЁб« : ®¤­® ¤«п жўҐв  Ё
2 ¤агЈЁе ¤«п Є®®в¤Ё­ в (е,г) Ї®§ЁжЁЁ в®зЄЁ, Є®в®аго ¬л е®вЁ¬
­ аЁб®ў вм;
- ‡ вҐ¬ ¬л ЁбЇ®«м§гҐ¬ ЎЁЎ«Ё®вҐз­го дг­ЄжЁо _septixel(x,y), зв®Ўл
­ аЁб®ў вм в®зЄг ­  нЄа ­Ґ. Џа®Ја ¬¬  ¤Ґ« Ґв нв® 10000 а §,   Ї®в®¬
®бв ­ ў«Ёў Ґвбп;
- ‡ вҐ¬ Їа®Ја ¬¬  ¦¤Ґв ­ ¦ вЁп «оЎ®© Є« ўЁиЁ, Ї®б«Ґ 祣® Їа®Ёб室Ёв
ўл室 Ёе DOS.


…б«Ё ўл § ЇгбвЁвҐ Їа®Ја ¬¬г ­ҐбЄ®«мЄ® а §, ⮠ᬮ¦ҐвҐ § ¬ҐвЁвм , зв® в®зЄЁ
ўбҐ ўаҐ¬п ®Є §лў овбп ў ®¤­Ёе Ё вҐе ¦Ґ ¬Ґбв е. Љ Є нв® Ї®«гз Ґвбп? „Ґ¤® ў
⮬, зв® ¬л Ї®«м§гҐ¬бп дг­ЄжЁҐ© rand(), Є®в®а п ­Ґ пў«пҐвбп ў Ї®«­®¬ б¬лб«Ґ
ЈҐ­Ґа в®а®¬ б«гз ©­ле зЁбҐ«. Ћ­  ў®§ўа й Ґв в Є ­ §лў Ґ¬лҐ ЇбҐў¤®б«гз ©­лҐ
зЁб« . —в®Ўл Ё§ЎҐ¦ вм нв®Ј®, ў ¬ ­ ¤® ўбпЄЁ© а § ЇаЁ § ЇгбЄҐ гбв ­ ў«Ёў вм
ЈҐ­Ґа в®а б«гз ©­ле зЁбҐ« б а §­л¬Ё ­ з «м­л¬Ё §­ зҐ­Ёп¬Ё. ‚бв ўм⥠ў
­ з «® Їа®Ја ¬¬л дг­ЄжЁо stand(int) - Ё ўбҐ Ўг¤Ґв ў Ї®ап¤ЄҐ.

‹Ё­ЁЁ
--------------

‹Ё­Ёп, Є Є ўл §­ ҐвҐ, - нв® Єа вз ©иЁ© ®в१®Є ¬Ґ¦¤г ¤ўг¬п в®зЄ ¬Ё.
Ќ ЇаЁ¬Ґа, ¬Ґ¦¤г в®зЄ ¬Ё (1,1) Ё (5,5) ­  Ї«®бЄ®бвЁ «Ё­Ёп Ўг¤Ґв ўлЈ«п¤Ґвм
в Є (аЁб.4.2):
®бм Y
(5,5)
ДЕД .
ДЕД
ДЕД
ДЕД
ДЕД. (1,1) ®бм X
ЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДДД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД

ђЁб.4.2. ‹Ё­Ёп ­  Ї«®бЄ®бвЁ

- 85 -
„ ў ©вҐ Ё§¬Ґ­Ё¬ Їа®Ја ¬¬г Ё§ ‹ЁбвЁ­Ј  4.1 в Є, зв®Ўл ®­  аЁб®ў «  «Ё­ЁЁ
ў¬Ґбв® в®зҐЄ.—в®Ўл ᤥ« вм нв®, ­г¦­® Є®Ґ-зв® Ё§¬Ґ­Ёвм. ‚¬Ґбв® 2 б«гз ©­ле
зЁбҐ« е Ё г ⥯Ґам Ёе Ўг¤Ґв 4: (е1,г1) Ё (е2,г2). Џ®в®¬ Їа®Ја ¬¬  ­ аЁбгҐв
¬Ґ¦¤г ­Ё¬Ё «Ё­Ёо, ЁбЇ®«м§гп ўл§®ў Ў®Ў«Ё®вҐз­®© дг­ЄжЁЁ. ‹ЁбвЁ­Ј Ўг¤Ґв
ўлЈ«п¤Ґвм в Є:

‹ЁбвЁ­Ј 4.2. Џа®Ја ¬¬ , аЁбгой п «Ё­ЁЁ (LINER.C).
-------------------------------------------------------------------------

#include <stdio.h> // include the basics
#include <graph.h>// include Microsofts Graphics Header

void main(void)
{

int x1,y1,x2,y2,color,index;

// put the computer into graphics mode

_setvideomode(_VRES16COLOR); // 640x480 in 16 colors

// let's draw 1,000 lines randomly on the screen

for (index = 0; index<1000; index++)
{
// get a random positions and color and draw a line there

x1 = rand()%640; // x of starting point
y1 = rand()%480; // y of starting point
x2 = rand()%640; // x of ending point
y2 = rand()%480; // y of ending point
color = rand()%16;
_setcolor(color); // set the color of the pixel to be drawn
_moveto(x1,y1); // move to the start of the line

_lineto(x2,y2); // draw the line

} // end for index

// wait for the user to hit a key

while(!kbhit()){}

// place the computer back into text mode

_setvideomode(_DEFAULTMODE);

} // end main
-------------------------------------------------------------------------

- 86 -
Њ­®Ј®гЈ®«м­ЁЄЁ
--------------------

‹Ё­ЁЁ ўҐбм¬  Їа®бвл, Ё Ґб«Ё ўл ЇаЁ«®¦ЁвҐ ­Ґ¬­®Ј® гбЁ«Ё©, ⮠ᬮ¦ҐвҐ Ё§
Їа®Ја ¬¬л 4.2 ᤥ« вм Їа®бв®© Screen Saver. Ќ® ўЁ¤Ґ®ЁЈал Єа®¬Ґ «Ё­Ё©
ᮤҐа¦ в ҐйҐ ¬­®¦Ґбвў® Ё­вҐаҐб­ле Ја дЁзҐбЄЁе ®ЎкҐЄв®ў, ­ ЇаЁ¬Ґа,
¬­®Ј®гЈ®«м­ЁЄ®ў.
Њ­®Ј®гЈ®«м­ЁЄ - нв® ¬­®¦Ґбвў® в®зҐЄ, ®ЎкҐ¤Ё­Ґ­­ле «Ё­Ёп¬Ё. ’®зЄЁ
ЇҐаҐбҐзҐ­Ёп «Ё­Ё© ­ §лў овбп ўҐаиЁ­ ¬Ё ¬­®Ј®гЈ®«м­ЁЄ . Ќ  аЁб.4.3 Ї®Є § ­
ваҐгЈ®«м­ЁЄ, ®Ўа §®ў ­­л© ваҐ¬п ўҐаиЁ­ ¬Ё.
®бм Y
і . ўҐаиЁ­  1
ДЕД (4,13)
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕ ®бм •
ДДДДДДДДДЕДЕДЕДЕДЕДЕДЕДЕДЕДВДґДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕД
Е
ўҐаиЁ­  3 ДЕД
(-6,-3) . ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
ДЕД
і . ўҐаиЁ­  2
і (10,-9)

ђЁб.4.3. ЏаЁ¬Ґа Їа®бв®Ј® ¬­®Ј®гЈ®«м­ЁЄ .

‚ᥠ¬­®Ј®гЈ®«м­ЁЄЁ пў«повбп § Єалвл¬Ё ЈҐ®¬ҐваЁзҐбЄЁ¬Ё ®ЎкҐЄв ¬Ё.
Њ­®Ј®гЈ®«м­ЁЄЁ Ўлў ов ¤ўге вЁЇ®ў. ЋЎ  вЁЇ  ЇаҐ¤бв ў«Ґ­л ­  аЁб.4.4.

‘гйҐбвўгҐв ¬ вҐ¬ вЁзҐбЄЁ©  «Ј®аЁв¬, Ї®§ў®«пойЁ© ®ЇаҐ¤Ґ«Ёвм, Є Є Є®¬г вЁЇг
®в­®бЁвбп ¤ ­­л© ¬­®Ј®гЈ®«м­ЁЄ, ­® ®­ ¤®ў®«м­® б«®¦Ґ­ Ё ᥩз б ­ ¬ ­Ґ
­г¦Ґ­. „ ў ©вҐ «гзиҐ ­ ЇЁиҐ¬ Їа®Ја ¬¬г, аЁбгойго ¬­®Ј®гЈ®«м­ЁЄЁ (‹ЁбвЁ­Ј
4.3).

- 87 -
®бм Y і
ДЕД
ДЕД ЪДДДДДДДДДДДДДДДДДї
ЪДДДДДДДДДДДДДД ЕД і і
і ДЕД і і
і ДЕД і і
і ДЕД і і ®бм •
ДДДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДДЕДДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕД
і щ ДЕД і і
і ДЕД і і ўлЈ­гвл©
ў®Ј­гвл© ДДД і ЕД і і ДДД(ўлЇгЄ«л©)
АДДДДДДДДДДДДДДД ДЕД і і
ДЕД АДДДДДДДДДДДДДДДДДЩ
і
і


ђЁб.4.4. „ў  вЁЇ  ¬­®Ј®гЈ®«м­ЁЄ®ў


‹ЁбвЁ­Ј 4.3. Џа®Ја ¬¬ , аЁбгой п ¬­®Ј®гЈ®«м­ЁЄЁ (POLYDRAW.C).
-------------------------------------------------------------------------

#include <stdio.h> // include the basics
#include <graph.h>// include Microsofts Graphics Header

void main(void)
{

// put the computer into graphics mode
_setvideomode(_VRES16COLOR); // 640x480 in 16 colors

// draw a simple polygon
_setcolor(1); // blue
_moveto(100,100); // vertex 1
_lineto(120,120); // vertex 2
_lineto(150,200); // vertex 3
_lineto(80,190); // vertex 4
_lineto(80,60); // vertex 5
_lineto(100,100); // back to vertex 1 to close up the polygon

// now highlight each vertex in white

_setcolor(15); // white
_setpixel(100,100); // vertex 1
_setpixel(120,120); // vertex 2
_setpixel(150,200); // vertex 3
_setpixel(80,190); // vertex 4
_setpixel(80,60); // vertex 5

// wait for the user to hit a key
while(!kbhit()){}

// place the computer back into text mode

_setvideomode(_DEFAULTMODE);

} // end main
_________________________________________________________________________

- 88 -

ЋЃљ…Љ’›

Џа®¤ўЁ­Ґ¬бп ­Ґ¬­®Ј® ¤ «миҐ Ё ®ЇаҐ¤Ґ«Ё¬ бвагЄвгаг ®ЎкҐЄв . …б«Ё ¬л е®вЁ¬
ЁбЇ®«м§®ў вм «Ё­ЁЁ ¤«п аЁб®ў ­Ёп Є®а Ў«Ґ© Ё Ї« ­Ґв, в® ­ ¬ ­Ґ®Ўе®¤Ё¬ 
бвагЄвга  ¤ ­­ле ¤«п еа ­Ґ­Ёп  ваЁЎгв®ў нвЁе ®ЎкҐЄв®ў. „«п ­ з « 
Ї®бв а Ґ¬бп ҐҐ ­Ґ ®б«®¦­пвм. Џгбвм Є ¦¤л© ­ и ®ЎкҐЄв Ё¬ҐҐв ­Ґ Ў®«ҐҐ 16
ўҐаиЁ­, 梥⠨ Є®­ЄаҐв­®Ґ ¬Ґбв®Ї®«®¦Ґ­ЁҐ ­  нЄа ­Ґ. Љ Є ўлзЁб«пвм Ї®§ЁжЁо,
¬л г§­ Ґ¬ Ї®§¦Ґ,   Є®¤ ¤«п ®ЇЁб ­Ёп ўҐаиЁ­ ў бвагЄвгॠ¤ ­­ле Ўг¤Ґв
ўлЈ«п¤Ґвм ЇаЁ¬Ґа­® в Є:

‹ЁбвЁ­Ј 4.4. ‘вагЄвгал ¤ ­­ле ¤«п § ¤ ­Ёп ўҐаиЁ­ ®ЎкҐЄв®ў.
-------------------------------------------------------------------------
typedef struct vertex_typ
{
float x,y; // a single point in the 2-D plane.
} vertex, *vertex_ptr;


// the structure for an object

typedef struct object_typ
{
int num_vertices; // number of vertices in this object
int color; // color of object
float xo,yo; // position of object
float x_velocity; // x velocity of object
float y_velocity; // y velocity of object
float scale; // scale factor
float angle; // rotation rate
vertex vertices[16]; // 16 vertices
} object, *object_ptr;
__________________________________________________________________________
- 89 -

ќв  бвагЄвга  ¤ ­­ле ­ ¬ ­г¦­  ¤«п ®ЇЁб ­Ёп ®ЎкҐЄв , ЇаҐ¤бв ў«по饣® б®Ў®©
¬­®Ј®гЈ®«м­ЁЄ ®ЇаҐ¤Ґ«Ґ­­®Ј® жўҐв  Ё а бЇ®«®¦Ґ­­®Ј® ў ®ЇаҐ¤Ґ«Ґ­­®© Ї®§ЁжЁЁ
­  нЄа ­Ґ.

Џ®§ЁжЁ®­Ёа®ў ­ЁҐ ®ЎкҐЄв 
---------------------------

’ҐЇҐам Ї®Ј®ў®аЁ¬ ® бва®зЄҐ, Є®в®а п ®ЇаҐ¤Ґ«пҐв Ї®§ЁжЁо ®ЎкҐЄв  ў бвагЄвгаҐ
Ё§ ‹ЁвбвЁ­Ј  4.4. Љ®®а¤Ё­ вл (е®,г®) ®ЇЁблў ов ­ з «м­го Ї®§ЁжЁо ®ЎкҐЄв  ­ 
Ї«®бЄ®бвЁ.
Њ­®Ј®гЈ®«м­ЁЄ Ё«Ё ®ЎкҐЄв аЁбгҐвбп ®в­®бЁвҐ«м­® ­ з «м­®© Ї®§ЁжЁЁ. ‚ᥠнв®
Ї®¤ў®¤Ёв ­ б Є Ї®­пвЁо ®в­®бЁвҐ«м­®© бЁбвҐ¬л Є®®а¤Ё­ в. ‚®§¬®¦­®, ўл ­Ґ
§­ ҐвҐ, зв® Є а⥧Ё ­бЄ п бЁб⥬  ­ §лў Ґвбп ҐйҐ ¬Ёа®ў®© бЁб⥬®©
Є®®а¤Ё­ в. Џ®¤а §г¬Ґў Ґвбп, зв® ®­  Їа®бв® ®Ја®¬­ . ‚ в® ¦Ґ б ¬®Ґ ўаҐ¬п
нЄа ­ ЏЉ Ё¬ҐҐв бў®о бЁб⥬㠪®®а¤Ё­ в, ­ §лў Ґ¬го нЄа ­­®©. ЏаЁ н⮬ ўбҐ
®ЎкҐЄвл ­  нЄа ­Ґ Ё¬Ґов бў®о, «®Є «м­го бЁб⥬㠪®®а¤Ё­ в. ќв® Ї®Є § ­® ­ 
аЁб.4.5.
Њл ¬®¦Ґ¬ ®ЇаҐ¤Ґ«Ёвм ®ЎкҐЄв ў «®Є «м­®© бЁб⥬Ґ Є®®а¤Ё­ в, § вҐ¬
ЇаҐ®Ўа §®ў вм нвЁ Є®®а¤Ё­ вл ў ¬Ёа®ўлҐ Ё,­ Є®­Ґж, ­ аЁб®ў вм ­ и ®ЎкҐЄв ў
нЄа ­­®© бЁб⥬Ґ Є®®а¤Ё­ в. ‚лЈ«п¤Ёв нв® ¤®бв в®з­® ¤®«ЈЁ¬ § ­пвЁҐ¬, ­® ­ 

ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД> і
і і(0,0) і (320,0) і
і і і і
і і (-5,5) і (5,5) і
і і ЪДДДДЕДДДДї і
і і і Е(0,0) і
і і ДДДДДДДДДВВЕВВВВЕВВВВЕВДДДДДДДДД і
і і і і і і
і і АДДДДЕДДДДЩ і
і і (-5,-5) і (5,-5) і
і і і і
і (0,200) і<-- ‚Ё¤Ґ®нЄа ­
і і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
ђЁб.4.5. ‹®Є «м­ п бЁб⥬  Є®®а¤Ё­ в ®ЎкҐЄв  ­  нЄа ­Ґ.

- 90 -
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і ^ (0,200) і
і іY і
і і і
і і і
і і і
і і і
і і і
і і і
і і і
і і і
і і і
і і і<-- ‚Ё¤Ґ®нЄа ­
і і(0,0) (320,0) і
і АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД> X і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ

ђЁб.4.6. ЏҐаҐў®а зЁў ­ЁҐ нЄа ­  ¤«п ¤®бвЁ¦Ґ­Ёп Ї®«­®Ј® ᮮ⢥вбвўЁп
б 1-¬ Єў ¤а ­в®¬ Є а⥧Ё ­бЄ®© бЁб⥬л.


¤Ґ«Ґ ўбҐ ®Є §лў Ґвбп ­ҐбЄ®«мЄ® Їа®йҐ. „ ў ©вҐ ¤®Ј®ў®аЁ¬бп, зв® г ­ б ­ 
Є®¬ЇмовҐаҐ ¬Ёа®ўлҐ Ё нЄа ­­лҐ бЁбвҐ¬л Є®®а¤Ё­ в б®ўЇ ¤ ов. ќв® §­ зЁв, зв®:
- ’®зЄ  (0,0) ­ е®¤Ёвбп ў «Ґў®¬ ўҐае­Ґ¬ гЈ«г нЄа ­ ;
- ЏаЁ ¤ўЁ¦Ґ­ЁЁ ўЇа ў® 㢥«ЁзЁў Ґвбп §­ зҐ­ЁҐ •-Є®®а¤Ё­ вл;
- ЏаЁ ЇҐаҐ¬ҐйҐ­ЁЁ ў­Ё§ 㢥«ЁзЁў Ґвбп Y-Є®®а¤Ё­ в .

Ѓ« Ј®¤ ап нвЁ¬ ¤®Їг饭Ёп¬ ¬л Ї®«гз Ґ¬ нЄа ­­лҐ Є®®а¤Ё­ вл, Ї®е®¦ЁҐ ­ 
Є®®а¤Ё­ вл 1-Ј® Єў ¤а ­в  (Ї®«®¦ЁвҐ«м­лҐ §­ зҐ­Ёп ®бҐ© • Ё Y), ­® ЇаЁ н⮬
­ ¤® ўбҐЈ¤  Ї®¬­Ёвм, зв® ®бм Y г ­ б ЇҐаҐўҐа­гв  ®в­®бЁвҐ«м­® нЄа ­ .
‚ ЇаЁ­жЁЇҐ, ў н⮬ ­Ґв ­ЁзҐЈ® бва и­®Ј®, е®вп Ё ­ҐбЄ®«мЄ® ­ҐЇаЁўлз­®. —в®Ўл
згўбвў®ў вм ᥡп 㢥७­®, ЇҐаҐўҐа­Ґ¬ ®бм Y ў ­®а¬ «м­®Ґ Ї®«®¦Ґ­ЁҐ. ’®Ј¤ 
в®зЄ  (0,0) Ўг¤Ґв ­ е®¤Ёвмбп ў «Ґў®¬ ­Ё¦­Ґ¬ гЈ«г нЄа ­ , Є Є нв® Ї®Є § ­®
­  аЁб.4.6.
’ҐЇҐам г ­ б Ґбвм ўбҐ б।бвў  ¤«п ЇаҐ¤бв ў«Ґ­Ёп ®ЎкҐЄв®ў ў Є®¬ЇмовҐаҐ. ‚
б«Ґ¤го饬 а §¤Ґ«Ґ ¬л ®Ўбг¤Ё¬, Є Є ЇҐаҐ¬Ґй вм ®ЎкҐЄвл Ї® нЄа ­г,
Ї®ў®а зЁў вм Ё ¬ бив ЎЁа®ў вм Ёе.

’а ­б«пжЁп ®ЎкҐЄв®ў
-----------------------

’а ­б«пжЁҐ© ®ЎкҐЄв  Ўг¤Ґ¬ ­ §лў вм ҐЈ® ЇҐаҐ¬ҐйҐ­ЁҐ, ЇаЁ Є®в®а®¬ ­Ґ ¬Ґ­пҐвбп
­Ё гЈ®« Ї®ў®а®в , ­Ё а §¬Ґа ®ЎкҐЄв .„ ў ©вҐ ў®бЇ®«м§гҐ¬бп ­ иҐ© бвагЄвга®©

- 91 -

®бм Y
і
(-3.5, 5.5)Е
. ДЕД
ДЕД
ДЕД (4, 3.5)
ДЕД .
ДЕД
ДЕД ®бм •
ДДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДДДД
ДЕД
ДЕД
ДЕД . .(8.5, 3)
ДЕД(2,-3)
ДЕД . (6, -5)
. ДЕД
(-4,-6) і


ђЁб.4.7. Њ­®Ј®гЈ®«м­ЁЄ, ®ЇаҐ¤Ґ«пойЁ© ўЁ¤ ­ иҐЈ®  бвҐа®Ё¤ 

¤ ­­ле ¤«п ®ЇаҐ¤Ґ«Ґ­Ёп Є®­ЄаҐв­®Ј® ®ЎкҐЄв , б Є®в®ал¬ Ўг¤Ґ¬
нЄбЇҐаЁ¬Ґ­вЁа®ў вм Ё ў ¤ «м­Ґ©иҐ¬. Љ ЇаЁ¬Ґаг, Їгбвм нв® Ўг¤Ґв  бвҐа®Ё¤. Ќ 
аЁб.4.7 Ї®Є § ­ ҐЈ® ў­Ґи­Ё© ўЁ¤. ‹ЁбвЁ­Ј 4.5 ᮤҐа¦Ёв да Ј¬Ґ­в, ®ЇЁблў ойЁ©
­ и  бвҐа®Ё¤.

‹ЁбвЁ­Ј 4.5. ЋЇЁб ­ЁҐ  бвҐа®Ё¤ .
-------------------------------------------------------------------------
Object asteroid;

// ®ЇаҐ¤Ґ«Ё¬ Ї®«п
asteroid.num_vertices = 6; // иҐбвЁ ўҐаиЁ­ Ўг¤Ґв ¤®бв в®з­®
asteroid.color = 1; // жўҐв  бвҐа®Ё¤  - бЁ­Ё©

astreoid.x0 = 320; // Ї®¬ҐбвЁвм  бвҐа®Ё¤ ў 業ва нЄа ­ 
asteroid.y0 = 240;
// ⥯Ґам § ¤ Ґ¬ Є®®а¤Ё­ вл ўҐаиЁ­ Є Є ᬥ饭Ёп ®в­®бЁвҐ«м­®
// в®зЄЁ е0, г0.
asteroid.vertices[0].x = 4.0;
asteroid.vertices[0].y = 3.5;
asteroid.vertices[1].x = 8.5;
asteroid.vertices[1].y = -3.0;
asteroid.vertices[2].x = 6.0;
asteroid.vertices[2].y = -5.0;
asteroid.vertices[3].x = 2.0;
asteroid.vertices[3].y = -3.0;
asteroid.vertices[4].x = -4.0;
asteroid.vertices[4].y = -6.0;
asteroid.vertices[5].x = -3.5;
asteroid.vertices[5].y = 5.5;

-------------------------------------------------------------------------
- 92 -
Љ®­Ґз­®, ў ­ бв®пйЁе ЁЈа е ў ¬ ­Ґ ЇаЁ¤Ґвбп в Є ®ЇаҐ¤Ґ«пвм ўбҐ бў®Ё ®ЎкҐЄвл.
Ќ Їа®вЁў, ўл ¬®¦ҐвҐ § Јаг§Ёвм Є®®а¤Ё­ вл ўҐаиЁ­ Ё§ д ©«  Ё«Ё бЈҐ­ҐаЁа®ў вм
Ёе (­ ЇаЁ¬Ґа, AutoCad ЁбЇ®«м§гҐв д®а¬ в DXF, ᮤҐа¦ йЁ© бЇЁбЄЁ ўҐаиЁ­
ў¬ҐбвҐ б ¤агЈЁ¬Ё бў®©бвў ¬Ё ®ЎкҐЄв ; Ї®б«Ґ в®Ј® Є Є DXF-д ©« § Ја㦥­,
Є®®а¤Ё­ вл ўҐаиЁ­ бзЁвлў овбп Ё§ ­ҐЈ® ў ᮮ⢥вбвўгойЁҐ бвагЄвгал). Ќ®
Ї®бЄ®«мЄг ¬л б®§¤ Ґ¬ ўбҐЈ® ®¤Ё­  бвҐа®Ё¤, в® ¬®¦­® ®ЇЁб вм ҐЈ® Ё ўагз­го.
’ҐЇҐам ¤ ў ©вҐ згвм-згвм Ї®¤г¬ Ґ¬. Њл ¬®¦Ґ¬ ­ аЁб®ў вм ўҐаиЁ­л ®ЎкҐЄв 
®в­®бЁвҐ«м­® ҐЈ® Ї®«®¦Ґ­Ёп ­  нЄа ­Ґ, Є®в®а®Ґ ®ЇЁблў Ґвбп Є Є (е®,г®). …б«Ё
¦Ґ ¬л е®вЁ¬ ЇҐаҐ¤ўЁ­гвм ®ЎкҐЄв, в® ¬®¦­® ᤥ« вм в Є:
е®=е®+dе
г®=г®+dг
Ј¤Ґ: dе Ё dг - нв® Є®«ЁзҐбвў® ЇЁЄбҐ«Ґ©, ­  Є®в®а®Ґ ¬л е®вЁ¬ ЇҐаҐ¬ҐбвЁвм
®ЎкҐЄв Ї® ®бЁ X Ё«Ё Y.
ќв® ўбҐ, зв® ¬®¦­® бЄ § вм ® ва ­б«пжЁЁ ®ЎкҐЄв®ў. ’ҐЇҐам Ї®Ј®ў®аЁ¬ ®
¬ бив ЎЁа®ў ­ЁЁ.

Њ бив ЎЁа®ў ­ЁҐ ®ЎкҐЄв®ў
-----------------------------

Њ бив ЎЁа®ў ­ЁҐ ®§­ з Ґв Ё§¬Ґ­Ґ­ЁҐ а §¬Ґа  ®ЎкҐЄв . Џ®б¬®ваЁ¬ ¤«п ЇаЁ¬Ґа 
­  аЁб.4.8. ЂбвҐа®Ё¤ ­  ­Ґ¬ ў 2 а §  Ў®«миҐ, 祬 ­  аЁб.4.7. ќв® ў® ¬­®Ј®¬
®Ўкпб­пҐв ЇаЁ­жЁЇл ¬ бив ЎЁа®ў ­Ёп. ‚бҐ, зв® ­ ¬ ­ ¤® ᤥ« вм, нв® г¬­®¦Ёвм
Є®®а¤Ё­ вл Є ¦¤®© Ё§ ўҐаиЁ­ ®ЎкҐЄв  ­  Є®нддЁжЁҐ­в ¬ бив ЎЁа®ў ­Ёп.
”а Ј¬Ґ­в Є®¤  ў ‹ЁбвЁ­ЈҐ 4.6 Ї®Є §лў Ґв, Є Є нв® ¤Ґ« Ґвбп ¤«п бвагЄвгал
®ЎкҐЄв , ®ЇаҐ¤Ґ«Ґ­­®© ­ ¬Ё а ­ҐҐ.

‹ЁбвЁ­Ј 4.6. Њ бив ЎЁа®ў ­ЁҐ  бвҐа®Ё¤ .
-------------------------------------------------------------------------
void Scale_Object(object_ptr object,float scale)
{
int index;

// ¤«п ўбҐе ўҐаиЁ­ ¬ бив ЎЁа㥬 е- Ё г-Є®¬Ї®­Ґ­вл

for (index = 0; index<object->num_vertices; index++)
{
object->vertices[index].x *= scale;
object->vertices[index].y *= scale;
} // Є®­Ґж жЁЄ«  for

} // Є®­Ґж дг­ЄжЁЁ
__________________________________________________________________________
- 93 -

і®бм Y
Е
Е
(-7,11) Е
. Е
Е (8,7)
Е .
Е
Е
Е ®бм •
ДДДДДДДДДДДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДЕДДДДДДДДД
Е
Е
Е . . (17,-6)
Е (4,-6)
Е .
. Е (12,-10)
(-8,-12) Е
Е
і

ђЁб.4.8. Ѓ®«ми®© ЂбвҐа®Ё¤.

”г­ЄжЁп Ё§ ‹ЁбвЁ­Ј  4.6 а Ў®в Ґв Їг⥬ ¬ бив ЎЁа®ў ­Ёп Є®®а¤Ё­ в Є ¦¤®© Ё§
ўҐаиЁ­ ®ЎкҐЄв . …б«Ё ­ ¬ ЇаЁ¤Ґв ў Ј®«®ўг 㢥«ЁзЁвм ­ и ®ЎкҐЄв " бвҐа®Ё¤" ў
2 а § , в® ­ ¬ Ї®вॡгҐвбп ­ ЇЁб вм б«Ґ¤го饥:

Scale_Object((object_ptr)&asteroid,2,0);

‘ нвЁ¬, ўа®¤Ґ, ўбҐ. ’ҐЇҐам ¬л 㦥 Ј®в®ўл ЇаЁбвгЇЁвм Є ўа йҐ­Ёо ®ЎкҐЄв .

‚а йҐ­ЁҐ ®ЎкҐЄв®ў
------------------------
„«п в®Ј®, зв®Ўл ўа й вм ®ЎкҐЄв, ¬л ¤®«¦­л Ї®ўҐа­гвм ҐЈ® ў®ЄагЈ ®¤­®© Ё§
Є®®а¤Ё­ в. ‚ ¤ўг嬥୮© Ја дЁЄҐ ¤«п нв®Ј® ®Ўлз­® ўлЎЁа Ґвбп ®бм Z. Џ®Є  ¬л
­ е®¤Ё¬бп ў ¤ўг嬥୮¬ ¬ЁаҐ, ­ б ­Ґ ЎҐбЇ®Є®Ёв ваҐвмҐ Ё§¬ҐаҐ­ЁҐ - ¬л Їа®бв®
­Ґ ЇаЁ¤ Ґ¬ Ґ¬г §­ зҐ­Ёп.
- 94 -
…б«Ё нЄа ­ - нв® Ї«®бЄ®бвм X-Y, в® ®бм Z - нв® ЇҐаЇҐ­¤ЁЄг«па Є ®бп¬ X Ё Y.
’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё ¬л ®ЇЁблў Ґ¬ ­ иЁ ®ЎкҐЄвл ®в­®бЁвҐ«м­® ¤ўг嬥୮Ј®
¬Ёа , в® г ­ б Ї®пў«пҐвбп ў®§¬®¦­®бвм ўа й вм Ёе ®б­®бЁвҐ«м­® ®бЁ Z.
‘«Ґ¤гойЁҐ д®а¬г«л Ї®§ў®«пов ўа й вм Їа®Ё§ў®«м­го в®зЄг (X,Y) ®в­®бЁвҐ«м­®
®бЁ Z:
new_x = x*cos(angle) - y*sin(angle)
new_y = y*cos(angle) + y*sin(angle)

Ј¤Ґ: angle - нв® гЈ®«, ­  Є®в®ал© ўл е®вЁвҐ Ї®ўҐа­гвм в®зЄг. Ља®¬Ґ нв®Ј®
ў ¬ бв®Ёв Ї®¬­Ёвм ҐйҐ Ї аг ўҐйҐ©:

- Џ®«®¦ЁвҐ«м­лҐ гЈ«л Ё¬Ґов нд䥪⠢а йҐ­Ёп Ї® з б®ў®© бв५ЄҐ;
- ЋваЁж вҐ«м­лҐ гЈ«л Ё¬Ґов нд䥪⠢а йҐ­Ёп Їа®вЁў з б®ў®© бв५ЄЁ.

Ќ ¤® в Є¦Ґ ­Ґ § Ўлў вм, зв® ‘Ё ЁбЇ®«м§гҐв ¤«п бў®Ёе дг­ЄжЁ© а ¤Ё ­л,   ­Ґ
Ја ¤гбл, Ё ўбҐ ўл§®ўл ваЁЈ®­®¬ҐваЁзҐбЄЁе дг­ЄжЁ© ¤®«¦­л ЇҐаҐ¤ ў вм ў
Ї а ¬Ґва е в Є¦Ґ а ¤Ё ­л. „«п в®Ј®, зв®Ўл ЇҐаҐўҐбвЁ а ¤Ё ­л ў Ја ¤гбл, ¬л
¤®«¦­л ­ ЇЁб вм Їа®бвлҐ ¬ Єа®бл.

Deg_To_Rad(deg) {pi*deg/180;}
Rad_To_Deg(rad) {180*rad/pi;}

„агЈЁ¬Ё б«®ў ¬Ё, нв® §­ зЁв, зв® ў ЄагЈҐ 360 Ја ¤гб®ў Ё«Ё 2еPi а ¤Ё ­.
’ҐЇҐам ­ ¬ ­г¦­® ­ ЇЁб вм дг­ЄжЁо ¤«п ўа йҐ­Ёп ®ЎкҐЄв . „ ў ©вҐ Їа®бв®
ЁбЇ®«м§гҐ¬ д®а¬г«л, ­Ґ § ¤г¬лў пбм ® ⮬, Є Є Ё Ї®зҐ¬г ®­Ё а Ў®в ов.
”г­ЄжЁп ў ‹ЁбвЁ­ЈҐ 4.7 ¤Ґ« Ґв Ё¬Ґ­­® в®, зв® ¬л е®вЁ¬.

‹ЁбвЁ­Ј 4.7.‚а йҐ­ЁҐ ®ЎкҐЄв .
--------------------------------------------------------------------------
void Rotate_Object(object_ptr object, float angle)
{
int index;
float x_new, y_new,cs,sn;

// pre-compute sin and cos
cs = cos(angle);
sn = sin(angle);

// for each vertex rotate it by angle
for (index=0; index<object->num_vertices; index++)
{
// rotate the vertex
x_new = object->vertices[index].x * cs - object->vertices[index].y * sn;
y_new = object->vertices[index].y * cs + object->vertices[index].x * sn;

// store the rotated vertex back into structure
object->vertices[index].x = x_new;
object->vertices[index].y = y_new;

} // end for index

} // end Rotate_Object
-------------------------------------------------------------------------


- 95 -

„г¬ о, зв® ­ ¤® Є®Ґ-зв® ®Ўкпб­Ёвм. џ ўлзЁб«по § а ­ҐҐ §­ зҐ­Ёп бЁ­гб  Ё
Є®бЁ­гб  ¤«п ¤ ­­®Ј® гЈ« . ‡ зҐ¬, бЇа®бЁвҐ ўл. ЋвўҐв Їа®бв - ¤«п бЄ®а®бвЁ.
€Ў® § ­Ё¬ вмбп ўлзЁб«Ґ­Ёп¬Ё ваЁЈ®­®¬ҐваЁзҐбЄЁе дг­ЄжЁ© ў Їа®жҐбᥠࠡ®вл
Їа®Ја ¬¬л ¬®¦­® Ї®§ў®«Ёвм ᥡҐ в®«мЄ®, Ё¬Ґп ¬ вҐ¬ вЁзҐбЄЁ© б®Їа®жҐбб®а.
’ҐЇҐам ­ бв «® ўаҐ¬п ­ ЇЁб вм зв®-­ЁЎг¤м Ї®бҐа쥧­Ґ©. Њ­Ґ Є ¦Ґвбп, зв® ­ ¤®
Ўл ­ ЇЁб вм зв®-в® Ў®«ҐҐ нЄбва ў Ј ­в­®Ґ, 祬 ®¤Ё­®ЄЁ©  бвҐа®Ё¤. Џгбвм нв®
Ўг¤Ґв е®вп Ўл ­ҐбЄ®«мЄ®  бвҐа®Ё¤®ў. „ ў ©вҐ б­ з «  бЇ« ­Ёа㥬 ­ иЁ
¤ «м­Ґ©иЁҐ ¤Ґ©бвўЁп.
џ е®вҐ« Ўл Ё¬Ґвм Ї®«Ґ  бвҐа®Ё¤®ў а §«Ёз­ле а §¬Ґа®ў ў Є®«ЁзҐб⢥ Ў®«ҐҐ 100
ивгЄ. € в Є, зв®Ўл ®­Ё ¬®Ј«Ё ўа й вмбп. „«п нв®Ј® Їа®Ја ¬¬  ¤®«¦­  Ё¬Ґвм
б«Ґ¤гойго бв४вгаг:
 Ј 1. - €­ЁжЁЁа®ў вм Ї®«Ґ  бвҐа®Ё¤®ў;
 Ј 2. - ‘вҐаҐвм Ї®«Ґ  бвҐа®Ё¤®ў;
 Ј 3. - ’а ­бд®а¬Ёа®ў вм Ї®«Ґ  бвҐа®Ё¤®ў;
 Ј 4. - Ќ аЁб®ў вм Ї®«Ґ  бвҐа®Ё¤®ў;
 Ј 5. - ЏҐаҐ©вЁ Є  Јг 2, Ї®Є  Ї®«м§®ў вҐ«м ­Ґ ­ ¦¬Ґв Є­®ЇЄг.

—в®Ўл ᤥ« вм нв® Їа®йҐ, п ¤®Ў ўЁ« 3 ­®ўле Ї®«п Є ­ иҐ© бвагЄвгаҐ: ®¤­®
¤«п гЈ«  Ї®ў®а®в  Ё ¤ў  - ¤«п бЄ®а®бвЁ (楫ЁЄ®¬ Їа®Ја ¬¬  ЇаҐ¤бв ў«Ґ­  ў
‹ЁбвЁ­ЈҐ 4.8).

‹ЁбвЁ­Ј 4.8. Џа®Ја ¬¬ , Є®в®а п аЁбгҐв Ї®«Ґ  бвҐа®Ё¤®ў (FIELD.C).
--------------------------------------------------------------------------

// I N C L U D E S ///////////////////////////////////////////////////////////

#include <stdio.h> // include the basics
#include <graph.h> // include Microsofts Graphics Header
#include <math.h> // include math stuff

// D E F I N E S ///////////////////////////////////////////////////////////

#define NUM_ASTEROIDS 10
#define ERASE 0
#define DRAW 1

// T Y P E D E F S ///////////////////////////////////////////////////////////

// the structure for a vertex

typedef struct vertex_typ
{
float x,y; // a single point in the 2-D plane.
} vertex, *vertex_ptr;


// the structure for an object

typedef struct object_typ
{
int num_vertices; // number of vertices in this object
int color; // color of object
float xo,yo; // position of object
float x_velocity; // x velocity of object
float y_velocity; // y velocity of object
float scale; // scale factor
float angle; // rotation rate
vertex vertices[16]; // 16 vertices
} object, *object_ptr;



// G L O B A L S /////////////////////////////////////////////////////////////


object asteroids[NUM_ASTEROIDS];


// F U N C T I O N S /////////////////////////////////////////////////////////

void Delay(int t)
{

// take up some compute cycles

float x = 1;

while(t-->0)
x=cos(x);


} // end Delay

//////////////////////////////////////////////////////////////////////////////

void Scale_Object(object_ptr object,float scale)
{
int index;

// for all vertices scale the x and y component

for (index = 0; index<object->num_vertices; index++)
{
object->vertices[index].x *= scale;
object->vertices[index].y *= scale;
} // end for index

} // end Scale_Object

//////////////////////////////////////////////////////////////////////////////

void Rotate_Object(object_ptr object, float angle)
{
int index;
float x_new, y_new,cs,sn;

// pre-compute sin and cos
cs = cos(angle);
sn = sin(angle);

// for each vertex rotate it by angle
for (index=0; index<object->num_vertices; index++)
{
// rotate the vertex
x_new = object->vertices[index].x * cs - object->vertices[index].y * sn;
y_new = object->vertices[index].y * cs + object->vertices[index].x * sn;

// store the rotated vertex back into structure
object->vertices[index].x = x_new;
object->vertices[index].y = y_new;

} // end for index

} // end Rotate_Object

//////////////////////////////////////////////////////////////////////////////

void Create_Field(void)
{

int index;

for (index=0; index<NUM_ASTEROIDS; index++)
{

// fill in the fields

asteroids[index].num_vertices = 6;
asteroids[index].color = 1 + rand() % 14; // always visable
asteroids[index].xo = 41 + rand() % 599;
asteroids[index].yo = 41 + rand() % 439;

asteroids[index].x_velocity = -10 + rand() % 20;
asteroids[index].y_velocity = -10 + rand() % 20;
asteroids[index].scale = (float)(rand() % 30) / 10;
asteroids[index].angle = (float)(- 50 + (float)(rand() % 100)) / 100;

asteroids[index].vertices[0].x = 4.0;
asteroids[index].vertices[0].y = 3.5;
asteroids[index].vertices[1].x = 8.5;
asteroids[index].vertices[1].y = -3.0;
asteroids[index].vertices[2].x = 6;
asteroids[index].vertices[2].y = -5;
asteroids[index].vertices[3].x = 2;
asteroids[index].vertices[3].y = -3;
asteroids[index].vertices[4].x = -4;
asteroids[index].vertices[4].y = -6;
asteroids[index].vertices[5].x = -3.5;
asteroids[index].vertices[5].y = 5.5;

// now scale the asteroid to proper size

Scale_Object((object_ptr)&asteroids[index], asteroids[index].scale);

} // end for index

} // end Create_Field

//////////////////////////////////////////////////////////////////////////////

void Draw_Asteroids(int erase)
{

int index,vertex;
float xo,yo;

for (index=0; index<NUM_ASTEROIDS; index++)
{

// draw the asteroid

if (erase==ERASE)
_setcolor(0);
else
_setcolor(asteroids[index].color);

// get position of object
xo = asteroids[index].xo;
yo = asteroids[index].yo;

// moveto first vertex

_moveto((int)(xo+asteroids[index].vertices[0].x),
(int)(yo+asteroids[index].vertices[0].y));
for (vertex=1; vertex<asteroids[index].num_vertices; vertex++)
{
_lineto((int)(xo+asteroids[index].vertices[vertex].x),
(int)(yo+asteroids[index].vertices[vertex].y));
} // end for vertex

// close object

_lineto((int)(xo+asteroids[index].vertices[0].x),
(int)(yo+asteroids[index].vertices[0].y));
} // end for index

} // end Draw_Asteroids
//////////////////////////////////////////////////////////////////////////////

void Translate_Asteroids()
{
int index;

for (index=0; index<NUM_ASTEROIDS; index++)
{
// translate current asteroid

asteroids[index].xo += asteroids[index].x_velocity;
asteroids[index].yo += asteroids[index].y_velocity;

// collision detection i.e. bounds check

if (asteroids[index].xo > 600 || asteroids[index].xo < 40)
{
asteroids[index].x_velocity = -asteroids[index].x_velocity;
asteroids[index].xo += asteroids[index].x_velocity;
}

if (asteroids[index].yo > 440 || asteroids[index].yo < 40)
{
asteroids[index].y_velocity = -asteroids[index].y_velocity;
asteroids[index].yo += asteroids[index].y_velocity;
}
} // end for index
} // end Translate_Asteroids

//////////////////////////////////////////////////////////////////////////////

void Rotate_Asteroids(void)
{
int index;
for (index=0; index<NUM_ASTEROIDS; index++)
{
// rotate current asteroid
Rotate_Object((object_ptr)&asteroids[index], asteroids[index].angle);

} // end for index

} // end Rotate_Asteroids

//////////////////////////////////////////////////////////////////////////////

void main(void)
{

// put the computer into graphics mode
_setvideomode(_VRES16COLOR); // 640x480 in 16 colors

// initialize
Create_Field();

while(!kbhit())
{
// erase field

Draw_Asteroids(ERASE);

// transform field

Rotate_Asteroids();

Translate_Asteroids();

// draw field

Draw_Asteroids(DRAW);

// wait a bit since we aren't syncing or double buffering...nuff said

Delay(500);

} // end while

// place the computer back into text mode

_setvideomode(_DEFAULTMODE);

} // end main
--------------------------------------------------------------------------
- 101 -

Ќ Ўа ў, ®вЄ®¬ЇЁ«Ёа®ў ў Ё § ЇгбвЁў Їа®Ја ¬¬г Ё§ ‹ЁбвЁ­Ј  4.8, ўл гўЁ¤ЁвҐ ­ 
нЄа ­Ґ Ї®«Ґ  бвҐа®Ё¤®ў ў¬Ґб⥠ᮠ¬­®¦Ґбвў®¬ а §­®жўҐв­ле Є ¬­Ґ©,
®вбЄ ЄЁў ойЁе ®в Ја ­Ёж нЄа ­  (®ЇаҐ¤Ґ«Ґ­ЁҐ д Єв  бв®«Є­®ўҐ­Ёп Ўг¤Ґв
Ї®¤а®Ў­ҐҐ Ё§« Ј вмбп ¤ «ҐҐ ў нв®© Ј« ўҐ,   в Є¦Ґ ў Ј« ўҐ 11-© "Ђ«Ј®аЁв¬л,
бвагЄвгал ¤ ­­ле Ё ¬Ґв®¤®«®ЈЁп ўЁ¤Ґ®ЁЈа").
’ҐЇҐам ­ ¬ ­ ¤® ҐйҐ Є®Ґ-зв® ®Ўбг¤Ёвм:

- ЏҐаў®Ґ, ­  зв® ўл ®Ўа вЁ«Ё ў­Ё¬ ­ЁҐ, нв® в®, зв® ®Ўа §л б«ҐЈЄ  ¬Ґ«мЄ ов.
ќв® бўп§ ­® б ⥬, зв® Їа®Ја ¬¬  д®а¬ЁагҐв Ё§®Ўа ¦Ґ­ЁҐ ў в®в ¦Ґ ¬®¬Ґ­в,
Є®Ј¤  Їа®Ёб室Ёв ЇҐаҐаЁб®ўЄ  нЄа ­ .
ќЄа ­ - нв® ¬­®¦Ґбвў® «Ё­Ё©, Є®в®алҐ аЁбговбп ­  ¬®­Ёв®аҐ б«Ґў  ­ Їа ў®
Ё ᢥаег ў­Ё§ ў иҐ© ўЁ¤Ґ®Є ав®©. Џа®Ў«Ґ¬  § Є«оз Ґвбп ў ⮬, зв® ¬л ­Ґ
¬®¦Ґ¬ Ё§¬Ґ­пвм ўЁ¤Ґ®ЎгдҐа, Ї®Є  ­  нЄа ­Ґ зв®-в® аЁбгҐвбп. ‚ 5-© Ј« ўҐ
"‘ҐЄаҐвл VGA-Є ав" ¬ў ®Ўбг¤Ё¬ аЁб®ў ­ЁҐ ўбҐЈ® нЄа ­  楫ЁЄ®¬ ў ®в¤Ґ«м­л©
ЎгдҐа б Ї®б«Ґ¤гойЁ¬ ЇҐаҐ¬ҐйҐ­ЁҐ¬ ҐЈ® ў ўЁ¤Ґ®Ї ¬пвм;
- „агЈ п Їа®Ў«Ґ¬ , бўп§ ­­ п б ¬Ґаж ­ЁҐ¬, § Є«оз Ґвбп ў ⮬, зв® ¬л
ЁбЇ®«м§гҐ¬ Ја дЁзҐбЄго ЎЁЎ«Ё®вҐЄг Microsoft C, Є®в®а п ­Ґ ®зҐ­м Ўлбва®
а Ў®в Ґв. ‚л ¤®«¦­л Ї®­Ё¬ вм, зв® Microsoft ­Ґ ®ЇвЁ¬Ё§Ёа®ў « ҐҐ ¤«п
ўлб®Є®© Їа®Ё§ў®¤ЁвҐ«м­®бвЁ Ё бЄ®а®бвЁ а Ў®вл;
- Џа®Ја ¬¬  ЁбЇ®«м§гҐв зЁб«  б Ї« ў о饩 § Їпв®©, Є®в®алҐ ўЇ®б«Ґ¤бвўЁЁ
Ўг¤гв § ¬Ґ­Ґ­л зЁб« ¬Ё б дЁЄбЁа®ў ­­®© § Їпв®©;
- ‚бп Їа®Ја ¬¬  б®ўҐа襭­® ­Ґнд䥪⨢­  б в®зЄЁ §аҐ­Ёп ­ ЇЁб ­Ёп ўЁ¤Ґ®ЁЈа.
‚бҐ, зв® ®­  ¤Ґ« Ґв, ўлЇ®«­Ґ­® ў Є« ббЁзҐбЄ®©, "Є­Ё¦­®©" ¬ ­ҐаҐ. “
а §а Ў®взЁЄ®ў ўЁ¤Ґ®ЁЈа Ґбвм Їа ўЁ«® ­®¬Ґа 1: "‚ᥣ¤  Ґбвм бЇ®б®Ў ᤥ« вм
в®, зв® Є ¦Ґвбп ­Ґў®§¬®¦­л¬". …б«Ё Ў нв® Ўл«® ­Ґ в Є, в® Ї®«®ўЁ­ 
ўЁ¤Ґ®ЁЈа ­ЁЄ®Ј¤  ­Ґ Ўл«  Ўл ­ ЇЁб ­ , Ї®бЄ®«мЄг ЏЉ ­Ґ ў б®бв®п­ЁЁ
®ЎҐбЇҐзЁвм ­г¦­®© Їа®Ё§ў®¤ЁвҐ«м­®бвЁ.

(Џ®ўҐам⥠¬­Ґ, DOOM - нв® «гзиЁ© ЇаЁ¬Ґа ¬®Ё¬ б«®ў ¬. …б«Ё Ўл п ҐЈ® ­Ґ
ўЁ¤Ґ«, в® ­ЁЄ®Ј¤  ­Ґ Ї®ўҐаЁ« Ўл, зв® в Є®Ґ ў®§¬®¦­®. Ќ®, Є Є ¬л §­ Ґ¬, DOOM
бгйҐбвўгҐв, Ё нв® ­ Ё«гзиЁ© ЇаЁ¬Ґа ЁбЇ®«м§®ў ­Ёп Їа ўЁ«м­ле ¬Ґв®¤®ў ¤«п
б®§¤ ­Ёп ॠ«м­®Ј® ¬Ёа  ­  Є®¬ЇмовҐа­®¬ нЄа ­Ґ.)


ЋвбҐзҐ­Ёп
------------------
Њ­Ґ ­Ґ е®вҐ«®бм Ўл гЈ«гЎ«пвмбп ў ⥮аЁо, п б®ЎЁа обм а ббЄ § вм ®Ў
®вбҐзҐ­ЁЁ Їа®бв® ¤«п Ї®«­®вл Ё§«®¦Ґ­Ёп. Ќ ¬ Ў®«ҐҐ Ё­вҐаҐб­л бЇҐжЁ «м­лҐ
бЇ®б®Ўл ®вбҐзҐ­Ёп,   ­Ґ ®Ўй п ⥮аЁп. Џ®н⮬㠤 ў ©вҐ Ё§гзЁ¬ в®«мЄ®
®б­®ў­лҐ Є®­жҐЇжЁЁ Ё Ёе ЇаЁ¬Ґ­Ґ­ЁҐ ў ­ ЁЎ®«ҐҐ ®ЎйҐ¬ ўЁ¤Ґ.
ЋвбҐзҐ­ЁҐ ®§­ з Ґв аЁб®ў ­ЁҐ в®«мЄ® з бвЁ ўЁ¤Ґ®®Ўа § , ®Ја ­ЁзҐ­­®Ј®
§ а ­ҐҐ § ¤ ­­л¬Ё Ја ­Ёж ¬Ё. ЏаҐ¤бв ўм⥠ᥡҐ ®ЎкҐЄв, Є®в®ал© ЇҐаҐ¬Ґй Ґвбп
Ї® нЄа ­г. „®©¤п ¤® ҐЈ® Ја ­Ёжл, ўЁ¤Ё¬ п з бвм ®ЎкҐЄв  ­ зЁ­ Ґв 㬥­ми вмбп
Ё ®­ Ї®б⥯Ґ­­® г室Ёв б нЄа ­ . ‚л бзЁв ҐвҐ нв® б ¬® б®Ў®© ࠧ㬥ойЁ¬бп,  
- 102 -
Їа®Ја ¬¬Ёбвг ­ ¤® §­ вм, Є Єго з бвм ®Ўа §  ®­ ¤®«¦Ґ­ Ї®Є § вм ­  нЄа ­Ґ.
‚лзЁб«Ґ­Ёп §¤Ґбм ¬®Јгв Ўлвм б«®¦­л¬Ё Ё«Ё Їа®бвл¬Ё - ўбҐ § ўЁбЁв ®в
бЁвг жЁЁ.
ЋвбҐзҐ­Ёп ¬®Јгв Їа®Ё§ў®¤Ёвмбп ­  ¤ўге "га®ў­пе".
- “а®ўҐ­м ®Ўа § ;
- “а®ўҐ­м ®ЎкҐЄв .

ЋвбҐзҐ­ЁҐ ®Ў« бвЁ ®Ўа §®ў ®б­®ўлў Ґвбп ­  Їа®ўҐаЄҐ Є ¦¤®© в®зЄЁ, Є®в®а п
¬®¦Ґв Ўлвм ­ аЁб®ў ­  ­  нЄа ­Ґ ў ®вᥪ Ґ¬®© ®Ў« бвЁ. Ќ ЇаЁ¬Ґа, Ґб«Ё ¬л
Ё¬ҐҐ¬ Єў ¤а в­го ®Ў« бвм, Є®в®а п б®ЇаЁЄ б Ґвбп б Ја ­Ёж ¬Ё нЄа ­  ў ०Ё¬Ґ
13h (320е200), в® ¬л ­Ґ Ўг¤Ґ¬ аЁб®ў вм в®зЄЁ, ўл室пйЁҐ §  Ја ­Ёжг. ’®зЄЁ,
Є®в®алҐ ­ е®¤пвбп ў­гваЁ ®Ў« бвЁ Ё ®Ја ­ЁзҐ­л Є®®а¤Ё­ в ¬Ё 0-319 Ї® ®бЁ • Ё
0-199 Ї® ®бЁ Y, Ўг¤гв ­ аЁб®ў ­л, ®бв «м­лҐ - ­Ґв.
Џ®бЄ®«мЄг ўбҐ ®ЎкҐЄвл, Є®в®алҐ ¬®Јгв Ї®пў«пвмбп ­  нЄа ­Ґ Є®¬ЇмовҐа ,
б®бв®пв Ё§ в®зҐЄ, в® нв®в ¬Ґв®¤ ­ ЁЎ®«ҐҐ Їа®бв ў ॠ«Ё§ жЁЁ. Љ ЄЁҐ
ЈҐ®¬ҐваЁзҐбЄЁҐ дЁЈгал аЁбговбп, ў н⮬ б«гз Ґ ­Ґ Ё¬ҐҐв §­ зҐ­Ёп. Ѓг¤м в®
«Ё­ЁЁ, ваҐгЈ®«м­ЁЄЁ, ЎЁв®ўлҐ Є авл Ё«Ё ҐйҐ зв®-­ЁЎг¤м - ўбҐ ®­Ё ЁбЇ®«м§гов
ўл§®ў дг­ЄжЁЁ аЁб®ў ­Ёп в®зЄЁ. …б«Ё дг­ЄжЁп, аЁбгой п в®зЄг, ®ЇаҐ¤Ґ«пҐв,
зв® в®зЄ  ўл室Ёв §  Ја ­Ёжл ®Ў« бвЁ, в® ¤ ­­ п в®зЄ  ­Ґ бв ўЁвбп.
Ћб­®ў­ п Їа®Ў«Ґ¬ , ў®§­ЁЄ ой п ЇаЁ а §а Ў®вЄҐ  «Ј®аЁв¬®ў ®вбҐзҐ­Ёп - нв®
ЎлбвதҐ©бвўЁҐ. „ ў ©вҐ а бᬮваЁ¬ Їа®жҐбб аЁб®ў ­Ёп «Ё­ЁЁ. „«п нв®Ј®
¤®бв в®з­® г§­ вм, Ј¤Ґ «Ё­Ёп ­ е®¤Ёвбп ў ®вᥪ Ґ¬®© ®Ў« бвЁ. ‚л ¬®¦ҐвҐ
®ЇаҐ¤Ґ«Ёвм в®зЄЁ ЇҐаҐбҐзҐ­Ёп «Ё­ЁЁ б Ја ­Ёж ¬Ё ®Ў« бвЁ - Є 祬г а §ЎЁа вмбп
б Є ¦¤®© в®зЄ®©, Ґб«Ё ¬®¦­® а бб¬ ваЁў вм ®Ў« бвм 楫ЁЄ®¬. ЌҐЄ®в®алҐ
ўлзЁб«Ґ­Ёп Ї®¬®Јгв ®ЇаҐ¤Ґ«Ёвм, Ј¤Ґ «Ё­Ёп Ўг¤Ґв а §®аў ­ . ќв® ®б­®ў 
 «Ј®аЁв¬®ў, Ї®§ў®«пойЁе ўлЇ®«­пвм ®вбҐзҐ­Ёп ®Ў« бвЁ ®ЎкҐЄв®ў.
Ђ«Ј®аЁв¬л ®вбҐзҐ­Ёп ®Ў« бвЁ ®ЎкҐЄв®ў а бб¬ ваЁў ов ЈҐ®¬ҐваЁзҐбЄЁҐ
е а ЄвҐаЁбвЁЄЁ ®вᥪ Ґ¬ле ®ЎкҐЄв®ў Ё ЇаҐ®Ўа §гов Ёе ў 楫м­лҐ ®ЎкҐЄвл,
Є®в®алҐ ­Ґ ­ ¤® ࠧ१ вм. ќвЁ ­®ўлҐ ®ЎкҐЄвл § вҐ¬ ЇҐаҐ¤ овбп ў бзҐв­го
з бвм Їа®Ја ¬¬л Ё аЁбговбп ЎҐ§®в­®бЁвҐ«м­® Є з бвп¬, Є®в®алҐ ®Є § «Ёбм § 
ЇаҐ¤Ґ« ¬Ё ®вᥪ Ґ¬®© ®Ў« бвЁ. ‘«®¦­®бвм б  «Ј®аЁв¬ ¬Ё ®Ў« бвЁ ®ЎкҐЄв®ў
б®бв®Ёв ў ⮬, зв® Ёе ॠ«Ё§ жЁп ¤®ў®«м­® б«®¦­  Ё § ўЁбЁв ®в вЁЇ®ў
аЁб㥬ле ®ЎкҐЄв®ў. ЋвбҐзҐ­Ёп Їа®бвле «Ё­Ё© Ё§ ®Ў« бвЁ ®ЎкҐЄв®ў ­Ґ в Є
б«®¦­®, Ј®а §¤® б«®¦­ҐҐ ЇаЁ¤г¬ вм нд䥪⨢­лҐ  «Ј®аЁв¬л ¤«п б«®¦­ле
®ЎкҐЄв®ў, б®бв®пйЁе Ё§ ¬­®Ј®гЈ®«м­ЁЄ®ў.
Љ бз бвмо ¤«п ­ б, ­ ЁЎ®«ҐҐ б«®¦­л© ®Ўа §, Є®в®ал© ­ ¬ ЇаЁ¤Ґвбп ࠧ१ вм,
нв® ЎЁв®ўл© ®Ўа § (¬л г§­ Ґ¬ ® ⮬, Є Є б ­Ё¬ а Ў®в вм, ў Ј« ўҐ 7-®©,
"Џа®¤ўЁ­гв п ЎЁв®ў п Ја дЁЄ  Ё бЇҐжнд䥪вл"). Њл Ўг¤Ґ¬ бв६Ёвмбп
ЁбЇ®«м§®ў вм нвЁ  «Ј®аЁв¬л ўбҐЈ¤ , Є®Ј¤  нв® в®«мЄ® ў®§¬®¦­®, Ї®бЄ®«мЄг ®­Ё
¤ ов ¬ ЄбЁ¬ «м­го бЄ®а®бвм. Њл ­Ґ ¬®¦Ґ¬ ᥡҐ Ї®§ў®«Ёвм ¤®Ў ў«пвм ў ­ иЁ
дг­ЄжЁЁ ўлў®¤  в®зҐЄ ўбҐў®§¬®¦­лҐ Їа®ўҐаЄЁ, Ї®Є  нв® ­Ґ пў«пҐвбп  Ўб®«ов­®©
­Ґ®Ўе®¤Ё¬®бвмо.
- 103 -
—в®Ўл 㢥७­® згўбвў®ў вм бҐЎп ў ¤ўг嬥୮¬ ¬ЁаҐ, ¤ ў ©вҐ Ї®Ј®ў®аЁ¬ ­ 
⥬г, Є®в®аго Ў®«миЁ­бвў® «о¤Ґ© Ї®зҐ¬г-в® ­Ґ «оЎЁв. ђҐзм Ї®©¤Ґв ® ¬ ваЁж е.



Њ Ђ ’ ђ € – ›

Њ ваЁжл ­Ґ ®зҐ­м б«®¦­л ¤«п Ї®­Ё¬ ­Ёп Ё ЁбЇ®«м§®ў ­Ёп. Ѓ®«ҐҐ в®Ј®, ®­Ё
­г¦­л ¤«п ­ ЇЁб ­Ёп Ўлбвале ЇаҐ®Ўа §®ў ­Ё© Ё ®зҐ­м Ї®«Ґ§­л ¤«п
ЇаҐ¤бв ў«Ґ­Ёп ¬ вҐ¬ вЁзҐбЄЁе ®ЇҐа жЁ© ў Є®¬Ї Єв­®© д®а¬Ґ.
Њ ваЁж  - нв® ¬­®¦Ґбвў® зЁбҐ«, бЈагЇЇЁа®ў ­­ле ў Є®«®­ЄЁ Ё бв®«Ўжл. ‡¤Ґбм
Ё§®Ўа ¦Ґ­л 2 ¬ ваЁжл: Њ ваЁж  Ђ Ё Њ ваЁж  ‚.
і1 0 2і і3 5 -1і
Ђ = і і ‚ = і2 7 0і
і3 -1 4і і4 3 3і

ђ §¬Ґа­®бвм 2е3 ђ §¬Ґа­®бвм 3е3

Њ ваЁж  Ђ - нв® ¬ ваЁж  2е3 (в® Ґбвм г ­ҐҐ ¤ўҐ бва®ЄЁ Ё ваЁ бв®«Ўж ),
в®Ј¤  Є Є ¬ ваЁж  ‚ - нв® ¬ ваЁж  3е3. Њл ¬®¦Ґ¬ Ї®«гзЁвм ¤®бвгЇ Є
н«Ґ¬Ґ­вг ¬ ваЁжл Ђ, ЁбЇ®«м§гп § ЇЁбм A[m,n], Ј¤Ґ m - нв® бва®Є ,   n -
бв®«ЎҐж. ќ«Ґ¬Ґ­в ў «Ґў®¬ ўҐае­Ґ¬ гЈ«г ¬ ваЁжл Ђ Ўг¤Ґв ®Ў®§­ з вмбп
A[0,0] Ё ®­ а ўҐ­ Ґ¤Ё­ЁжҐ.

Џа®Ё§ўҐ¤Ґ­ЁҐ ®ЇҐа жЁ© ­ ¤ ¬ ваЁж ¬Ё
-------------------------------------------

‚л ¬®¦ҐвҐ Їа®Ё§ў®¤Ёвм Ў®«миЁ­бвў® ®ЇҐа жЁ© ­ ¤ ¬ ваЁж ¬Ё в Є ¦Ґ, Є Є ўл
®ЇҐаЁагҐвҐ Ё б ­®а¬ «м­л¬Ё зЁб« ¬Ё. Ќ ЇаЁ¬Ґа, ўл ¬®¦ҐвҐ Ёе бЄ« ¤лў вм Ё«Ё
ўлзЁв вм, ᮮ⢥вб⢥­­® бЄ« ¤лў п Ё«Ё ўлзЁв п Є ¦¤л© Ё§ Є®¬Ї®­Ґ­в®ў.
„«п ЇаЁ¬Ґа  а бᬮваЁ¬ б«®¦Ґ­ЁҐ ¤ўге ¬ ваЁж а §¬Ґа­®бвмо 2е3 - ¬ ваЁжл Ђ Ё
¬ ваЁжл ‘:
і1 0 2і і3 5 -1і
A = і і C = і і
і3 -1 4і і2 7 0і

ЏаЁ б«®¦Ґ­ЁЁ ¬ ваЁж Ђ Ё ‘ ­г¦­® бЄ« ¤лў вм Є ¦¤л© Ё§ н«Ґ¬Ґ­в®ў m,n. C㬬л
н«Ґ¬Ґ­в®ў § ©¬гв ў १г«мвЁаго饩 ¬ ваЁжҐ ᮮ⢥вбвўгойЁҐ ¬Ґбв :
і1 0 2і і3 5 -1і і4 5 1і
A + C = і і + і і = і і
і3 -1 4і і2 7 0і і5 6 4і

Њл в Є¦Ґ ¬®¦Ґ¬ г¬­®¦Ёвм ¬ ваЁжг ­  бЄ «па k. Ќ ЇаЁ¬Ґа, зв®Ўл г¬­®¦Ёвм
¬ ваЁжг Ђ ­  3, ¬л ¤®«¦­л г¬­®¦Ёвм ­  3 Є ¦¤л© ҐҐ н«Ґ¬Ґ­в:
- 104 -
і1 0 2і і3 0 6і
3 x A = 3 x і і = і і
і3 -1 4і і9 -3 12і


’ҐЇҐам Ї®Ј®ў®аЁ¬ ®Ў г¬­®¦Ґ­ЁЁ ¤ўге ¬ ваЁж. ќв  ®ЇҐа жЁп ­Ґ¬­®Ј® ®в«Ёз Ґвбп
®в г¬­®¦Ґ­Ёп ­Ґ бЄ «па­го ўҐ«ЁзЁ­г. ‚л ¤®«¦­л § Ї®¬­Ёвм ­ҐбЄ®«мЄ® Їа ўЁ«:
- Љ®«ЁзҐбвў® бв®«Ўж®ў ў 1-© ¬ ваЁжҐ (n) ¤®«¦­® Ўлвм а ў­® Є®«ЁзҐбвўг
бва®Є ў® ўв®а®© (в Є¦Ґ n). ќв® §­ зЁв, зв® Ґб«Ё а §¬Ґа­®бвм ЇҐаў®©
¬ ваЁжл (mxn), в® а §¬Ґа­®бвм ўв®а®© ¬ ваЁжл ¤®«¦­  Ўлвм (nxr). „ў 
®бв «м­ле Ё§¬ҐаҐ­Ёп m Ё r ¬®Јгв Ўлвм «оЎл¬Ё;
- Џа®Ё§ўҐ¤Ґ­ЁҐ ¬ ваЁж ­Ґ Є®¬¬гв вЁў­®, в® Ґбвм A x B ­Ґ а ў­® B x A.

“¬­®¦Ґ­ЁҐ ¬ ваЁжл mxn ­  ¬ ваЁжг nxr ¬®¦Ґв Ўлвм ®ЇЁб ­®  «Ј®аЁв¬ЁзҐбЄЁ
б«Ґ¤гойЁ¬ ®Ўа §®¬:
1. „«п Є ¦¤®© бва®ЄЁ ЇҐаў®© ¬ ваЁжл:
“¬­®¦Ёвм бва®Єг ­  бв®«ЎҐж ¤агЈ®© ¬ ваЁжл Ї®н«Ґ¬Ґ­в­®. ‘«®¦Ёвм
Ї®«г祭­л© १г«мв в;

2. Џ®¬ҐбвЁвм १г«мв в ў Ї®§ЁжЁо [i,j] १г«мвЁаго饩 ¬ ваЁжл, Ј¤Ґ i -
нв® бва®Є  ЇҐаў®© ¬ ваЁжл,   j - бв®«ЎҐж ўв®а®© ¬ ваЁжл.

„«п Їа®бв®вл Ї®б¬®ваЁ¬ ­  аЁб.4.9:
_
і 1 2 4 і і4 1 і4і 3 і і Џ Џ Џ Џ і
і _______ і е і і і і = і Џ Џ 26 Џ і
іі2 6 0іі і0 -1 і3і 1 і і -- і
------- і і і і
і2 7 і5і 2 і
-
2е3 3е4 2е4


[2*4] + [6*3] + [0*5] = 26


_________ _
іі1 2 4іі і4 1 4 і3і і і Џ Џ Џ 13 і
і ------- і x і і і і = і і
і 2 6 0 і і0 -1 3 і1і і і Џ Џ 26 Џ і
і і і і
і2 7 5 і2і і
-
2е3 3е4 2е4


[1*3] + [2*1] + [4*2] = 13

ђЁб.4.9. ђҐ§г«мв в ¬ ваЁз­®Ј® Їа®Ё§ўҐ¤Ґ­Ёп.


Њл ¬®¦Ґ¬ н⮠ᤥ« вм ­ ¬­®Ј® Їа®йҐ, ­ ЇЁб ў Їа®Ја ¬¬г ­  ‘Ё. „ ў ©вҐ
®ЇаҐ¤Ґ«Ё¬ ¬ ваЁжг 3е3 Ё ­ ЇЁиҐ¬ дг­ЄжЁо, г¬­®¦ ойго ¬ ваЁжл. ‚ ‹ЁбвЁ­ЈҐ 4.9
Ї®Є § ­  ᮮ⢥вбвўгой п Їа®Ја ¬¬ .
- 105 -
‹ЁбвЁ­Ј 4.9. ЋЇаҐ¤Ґ«Ґ­ЁҐ Ё г¬­®¦Ґ­ЁҐ ¤ўге ¬ ваЁж.
-------------------------------------------------------------------------
// ®Ўй п бвагЄвга  ¬ ваЁжл
typedef struct matrix_typ
{
float elem[3][3]; // ¬Ґбв® ¤«п еа ­Ґ­Ёп ¬ ваЁжл
} matrix, *matrix_ptr;
void Mat_Mult3X3(matrix_ptr matrix_1,matrix_ptr matrix_2,
matrix_ptr result)
{
index i,j,k;
for(i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
result[i][j] = 0; // Ё­ЁжЁ «Ё§ жЁп н«Ґ¬Ґ­в 
for(k=0; k<3; k++)
{
result->elem[i][j]+=matrix_1->elem[i][k]
* matrix_2->elem[k][j];
} // Є®­Ґж жЁЄ«  Ї® k
} // Є®­Ґж жЁЄ«  Ї® j
} // Є®­Ґж жЁЄ«  Ї® i
} // Є®­Ґж дг­ЄжЁЁ
_________________________________________________________________________

ЏҐаҐ¤ ўл室®¬ Ё§ нв®© дг­ЄжЁЁ ¬л Ё¬ҐҐ¬ १г«мв в, б®еа ­Ґ­­л© ў ЇҐаҐ¬Ґ­­®©
result.


…¤Ё­Ёз­ п ¬ ваЁж 
------------------------

ЏаҐ¦¤Ґ 祬 § Є®­зЁвм Ј®ў®аЁвм ® ¬ ваЁж е, бЄ ¦Ґ¬ ҐйҐ ®Ў ®¤­®© ўҐйЁ: ®
Ґ¤Ё­Ёз­®© ¬ ваЁжҐ. ЌҐ гЈ«гЎ«ппбм ў ¬ вҐ¬ вЁзҐбЄЁҐ вҐа¬Ё­л, п е®зг бЄ § вм,
зв® ­ ¬ ­г¦­  в Є п ¬ ваЁж , г¬­®¦ п ­  Є®в®аго ¬л Ї®«гз «Ё Ўл Ёб室­го
¬ ваЁжг.
ѓ®ў®ап Ї®Їа®бвг, ­ ¬ ­г¦­® Ё¬Ґвм ¬ ваЁжг а §¬Ґа­®бвмо mxn, Є®в®аго ­ §®ўҐ¬
¬ ваЁжҐ© I. “¬­®¦ п ­  ­ҐҐ «оЎго ¤агЈго ¬ ваЁжг, ¬л ¤®«¦­л Ї®«гзЁвм
Ёб室­го. ќв®© ¬ ваЁжҐ© Ўг¤Ґв Єў ¤а в­ п ¬ ваЁж , Ї® Ј« ў­®© ¤Ё Ј®­ «Ё
Є®в®а®© § ЇЁб ­л Ґ¤Ё­Ёжл,   ўбҐ ®бв «м­лҐ н«Ґ¬Ґ­вл а ў­л ­г«о:

і1 0 0 і
I = і0 1 0 і
і0 0 1 і

…б«Ё ¬л г¬­®¦Ё¬ ¬ ваЁжг A ­  ¬ ваЁжг I,
- 106 -

і1 0 2і і1 0 0і
A = і3 -1 4і I = і0 1 0і
і6 -2 0і і0 0 1і

⮠१г«мв в®¬ Ўг¤Ґв Ёб室­ п ¬ ваЁж  A:

A x I = A



€‘ЏЋ‹њ‡Ћ‚ЂЌ€… ЊЂ’ђ€– ‚ €ѓђЂ•

Њл 㦥 ¤®бв в®з­® Ї®Ј®ў®аЁ«Ё ® ¬ ваЁж е. ’ҐЇҐам Ї®б¬®ваЁ¬, § зҐ¬ ®­Ё ­ ¬
­г¦­л Ё Є Є Ёе ЁбЇ®«м§®ў вм ў ЁЈа е. ‚ Їа®Ја ¬¬Ґ Ё§ ‹ЁбвЁ­Ј  4.8 ¬л б®§¤ «Ё
Ї®«Ґ  бвҐа®Ё¤®ў, Є®в®алҐ ЇҐаҐ¬Ґй «Ёбм, Ё§¬Ґ­п«Ё бў®© а §¬Ґа Ё ўа й «Ёбм.
…б«Ё ¬л ЇаҐ¤бв ўЁ¬ ­ иЁ ®ЎкҐЄвл Є Є ­ Ў®а ¬ ваЁж, ⮠ᬮ¦Ґ¬ ЁбЇ®«м§®ў вм
г¬­®¦Ґ­ЁҐ ¬ ваЁж ¤«п Ёе ва ­бд®а¬ жЁЁ.
ЏаҐ«Ґбвм ¬ ваЁж б®бв®Ёв ў ⮬, зв® ўл ¬®¦ҐвҐ ®ЎкҐ¤Ё­Ёвм ўбҐ ®ЇҐа жЁЁ ў ®¤­г
¬ ваЁжг, ®ЇЁблў ойго ЇҐаҐ¬ҐйҐ­ЁҐ, ¬ бив ЎЁа®ў ­ЁҐ Ё ўа йҐ­ЁҐ.
Џ®¬­ЁвҐ, Є®Ј¤  ЇЁигвбп ўЁ¤Ґ®ЁЈал, ¬л ¤®«¦­л ЁбЄ вм ­ ЁЎ®«ҐҐ Ўлбвал© Ё
нд䥪⨢­л©  «Ј®аЁв¬. —Ґ¬ Ў®«мйҐ еЁва®б⥩ Ё ваоЄ®ў г ­ б ў § Ї бҐ, ⥬
«гзиҐ. ’ҐЇҐам Ї®б¬®ваЁ¬ ­  ¬ ваЁжл ¤«п ЇҐаҐ¬ҐйҐ­Ёп, ¬ бив ЎЁа®ў ­Ёп Ё
ўа йҐ­Ёп.

ѓ« ў­ п ¬ ваЁж  ЇҐаҐ¬ҐйҐ­Ё©
----------------------------------
ѓ« ў­®© ¬ ваЁжҐ© ЇҐаҐ¬ҐйҐ­Ё© Ўг¤Ґ¬ ­ §лў вм в Єго ¬ ваЁжг, ў Є®в®а®©
x_translation Ё y_translation - нв® Є®нддЁжЁҐ­вл ЇҐаҐ¬ҐйҐ­Ёп ®ЎкҐЄв  Ї®
®бп¬ X Ё Y. ‚®в Є Є ®­  ўлЈ«п¤Ёв:
і і
і1 0 0і
і0 1 0і
іx_translation y_translation 1і
і і


ѓ« ў­ п ¬ ваЁж  ¬ бив ЎЁа®ў ­Ёп
--------------------------------------
ѓ« ў­ п ¬ ваЁж  ¬ бив ЎЁа®ў ­Ёп - нв® в Є п ¬ ваЁж , ў Є®в®а®© scale_x Ё
scale_y - нв® Є®нддЁжЁҐ­вл ¬ бив ЎЁа®ў ­Ёп ®ЎкҐЄв  Ї® Є®®а¤Ё­ в ¬ x Ё y:

іscale_x 0 0і
і0 scale_y 0і
і0 0 1і

’ Є п ¬ ваЁж  Ї®§ў®«пҐв ўлЇ®«­пвм ­Ґ®¤­®а®¤­®Ґ ¬ бив ЎЁа®ў ­ЁҐ - ¬л ¬®¦Ґ¬
§ ¤ вм ®¤Ё­ ¬ бив Ў Ї® ®бЁ X Ё ¤агЈ®© - Ї® ®бЁ Y. ’ ЄЁ¬ ®Ўа §®¬, Ґб«Ё ¬л
е®вЁ¬ ¬ бив ЎЁа®ў вм ®ЎкҐЄв ®¤­®а®¤­®, в® ¤®«¦­л § ¤ вм scale_x = scale_y.

- 107 -
ѓ« ў­ п ¬ ваЁж  Ї®ў®а®в®ў
-------------------------------
‚ Ј« ў­®© ¬ ваЁжҐ Ї®ў®а®в®ў angle - нв® гЈ®«, ­  Є®в®ал© ўл е®вЁвҐ
Ї®ўҐа­гвм ®ЎкҐЄв:
іcos(angle) -sin(angle) 0і
іsin(angle) cos(angle) 0і
і0 0 1і


ЋЎй п ¬ ваЁж  ¬ бив ЎЁа®ў ­Ёп, Ї®ў®а®в®ў Ё ЇҐаҐ¬ҐйҐ­Ё©
----------------------------------------------------------
Ќ бвгЇ Ґв в®а¦Ґб⢥­­л© ¬®¬Ґ­в. ’ҐЇҐам ¬л ў®§м¬Ґ¬ ¬ ваЁжл ЇҐаҐ¬ҐйҐ­Ёп,
¬ бив ЎЁа®ў ­Ёп Ё Ї®ў®а®в  Ё ЇҐаҐ¬­®¦Ё¬ Ёе (Ї®«гзЁ¬ Ёе Є®­Є вҐ­ жЁо), зв®Ўл
Ї®«гзЁвм ®Ўйго ¬ ваЁжг, ॠ«Ё§гойго ўбҐ ваЁ дг­ЄжЁЁ ба §г. ЋЄ®­з вҐ«м­®
¬ ваЁж  Ўг¤Ґа ўлЈ«п¤Ґвм в Є:

іscale_x x cos(angle) scale_x x -sin(angle) 0і
іscale_y x sin(angle) scale_y x cos(angle) 0і
іx_translation y_translation 1і

…б«Ё ўл ⥯Ґам г¬­®¦ЁвҐ ўҐаиЁ­л ®ЎкҐЄв  ­  нвг ¬ ваЁжг, в® Ї®«гзЁвҐ
ЇҐаҐ¬ҐйҐ­­л©, Ї®ўҐа­гвл© Ё ¬ бив ЎЁа®ў ­­л© ®ЎкҐЄв. ЌҐ б« Ў®,  ?

Љ®¬Ї®­Ґ­в ­®а¬ «Ё§ жЁЁ ўҐаиЁ­л
------------------------------------
џ ᮢᥬ гЇгбвЁ« ®¤­г ¬ «Ґ­мЄго ¤Ґв «м, Є®в®аго ўл 㦥, ­ ўҐа­®Ґ, § ¬ҐвЁ«Ё.
"Љ Є ¬л ¬®¦Ґ¬ г¬­®¦Ёвм ўҐаиЁ­г ­  ¬ ваЁжг а §¬Ґа®¬ 3е3?" ЌҐЇ«®е®© ў®Їа®б.
ђ ¤, зв® ўл бЇа®бЁ«Ё. —в®Ўл ўлЇ®«­Ёвм нв®, ¬л ¤®«¦­л Ё§¬Ґ­Ёвм ЇаҐ¤бв ў«Ґ­ЁҐ
бвагЄвгал ўҐаиЁ­, ¤®Ў ўЁў Є®¬Ї®­Ґ­в ­®а¬ «Ё§ жЁЁ. Љ®¬Ї®­Ґ­в ­®а¬ «Ё§ жЁЁ -
нв® Їа®бв® Ґ¤Ё­Ёж , ¤®Ў ў«Ґ­­ п ў Є®­Ґж бвагЄвгал, ®ЇЁблў о饩 Є ¦¤го
ўҐаиЁ­г. „«п нв®Ј® ­ ¬ ­ ¤® згвм-згвм Ё§¬Ґ­Ёвм Ёб室­лҐ ⥪бвл ў ‹ЁбвЁ­ЈҐ
4.4, ў Є®в®а®¬ ®ЇЁб ­л ўҐаиЁ­л. ‚ᥠнв® ®ва ¦Ґ­® ў бвагЄвгॠ¤ ­­ле ў
‹ЁбвЁ­ЈҐ 4.10.

‹ЁбвЁ­Ј 4.10. Ќ®ў п бвагЄвга  ¤ ­­ле ¤«п ўҐаиЁ­.
------------------------------------------------------------------------
#define X_COMP 0
#define Y_COMP 1
#define N_COMP 2

typedef struct vertex_typ
{
float p[3];
} vertex, *vertex_ptr;
__________________________________________________________________________
- 108 -
Љ Є ўл ¬®¦ҐвҐ § ¬ҐвЁвм, ⥯Ґам ¬л ЇаҐўа вЁ«Ё ¬ ваЁжг P, ®ЇЁблў ойго
ўҐаиЁ­г, ў ¬ ббЁў. Ќ и  ¬ ваЁж  ЇаҐ®Ўа §®ў ­Ё© Ё¬ҐҐв а §¬Ґа 3е3, Ё ¤«п
г¬­®¦Ґ­Ёп ­ ¬ ­ ¤® Ё¬Ґвм ¬ ваЁжг а §¬Ґа®¬ 1е3. Њ ваЁж  P 㤮ў«Ґвў®апҐв
н⮬г гб«®ўЁо.

Џа®Ја ¬¬  ЂбвҐа®Ё¤л б ЁбЇ®«м§®ў ­ЁҐ¬ ¬ ваЁж
---------------------------------------------------
џ 㦥 гбв « ®в а §Ј®ў®а®ў - ¤ ў ©вҐ зв®-­ЁЎг¤м ­ ЇЁиҐ¬. Љ ЇаЁ¬Ґаг,
ЇҐаҐЇЁиҐ¬ ­ иг Їа®Ја ¬¬г Ё§ ‹ЁбвЁ­Ј  4.8. ‚л ¤®«¦­л ҐҐ Ї®¬­Ёвм. Њл ҐҐ
ЇҐаҐ¤Ґ« Ґ¬ Ё ЁбЇ®«м§гҐ¬ ў ­Ґ© ¬ ваЁжл. ‹ЁбвЁ­Ј 4.11 Ї®Є §лў Ґв нвг
Їа®Ја ¬¬г. Ћ­  ­ §лў Ґвбп "‘гЇҐа ЂбвҐа®Ё¤л".

‹ЁбвЁ­Ј 4.11. ‘гЇҐа ЂбвҐа®Ё¤л (FIELD_DL.C).
-------------------------------------------------------------------------

// I N C L U D E S ///////////////////////////////////////////////////////////

#include <stdio.h> // include the basics
#include <graph.h> // include Microsofts Graphics Header
#include <math.h> // include math stuff

// D E F I N E S ///////////////////////////////////////////////////////////

#define NUM_ASTEROIDS 10
#define ERASE 0
#define DRAW 1

#define X_COMP 0
#define Y_COMP 1
#define N_COMP 2


// T Y P E D E F S ///////////////////////////////////////////////////////////

// new and improved vertex

typedef struct vertex_typ
{
float p[3]; // a single point in the 2-D plane with normalizing factor
} vertex, *vertex_ptr;

// a general matrix structure

typedef struct matrix_typ
{
float elem[3][3]; // storage for a 3x3 martrix
} matrix, *matrix_ptr;


// the structure for an object

typedef struct object_typ
{
int num_vertices; // number of vertices in this object
int color; // color of object
float xo,yo; // position of object
float x_velocity; // x velocity of object
float y_velocity; // y velocity of object
matrix scale; // the object scaling matrix
matrix rotation; // the objects rotation and translation matrix

vertex vertices[16]; // 16 vertices
} object, *object_ptr;


// G L O B A L S /////////////////////////////////////////////////////////////


object asteroids[NUM_ASTEROIDS];


// F U N C T I O N S /////////////////////////////////////////////////////////

void Delay(int t)
{

// take up some compute cycles

float x = 1;

while(t-->0)
x=cos(x);


} // end Delay

//////////////////////////////////////////////////////////////////////////////

void Make_Identity(matrix_ptr i)
{

// makes the sent matrix into an identity matrix

i->elem[0][0] = i->elem[1][1] = i->elem[2][2] = 1;
i->elem[0][1] = i->elem[1][0] = i->elem[1][2] = 0;
i->elem[2][0] = i->elem[0][2] = i->elem[2][1] = 0;


} // end Make_Identity

//////////////////////////////////////////////////////////////////////////////

void Clear_Matrix(matrix_ptr m)
{

// zeros out the sent matrix

m->elem[0][0] = m->elem[1][1] = m->elem[2][2] = 0;
m->elem[0][1] = m->elem[1][0] = m->elem[1][2] = 0;
m->elem[2][0] = m->elem[0][2] = m->elem[2][1] = 0;


} // end Clear_Matrix

//////////////////////////////////////////////////////////////////////////////


void Mat_Mul(vertex_ptr v,matrix_ptr m)
{

// do a multiplication of a 1x3 * 3x3 the result is again a 1x3
// for speed manually do the multiplication by specifying each multiplication
// and addition manually (apprentice trick)

float x_new, y_new;

x_new = v->p[0]*m->elem[0][0] + v->p[1]*m->elem[1][0] + m->elem[2][0];
y_new = v->p[0]*m->elem[0][1] + v->p[1]*m->elem[1][1] + m->elem[2][1];

v->p[X_COMP] = x_new;
v->p[Y_COMP] = y_new;

// note we need not change N_COMP since it is always 1

} // end Mat_Mul

//////////////////////////////////////////////////////////////////////////////


void Scale_Object_Mat(object_ptr obj)
{

int index;

// scale the object, just multiply each point in the object by it's scaling
// matrix

for (index=0; index<obj->num_vertices; index++)
{

Mat_Mul((vertex_ptr)&obj->vertices[index],(matrix_ptr)&obj->scale);

} // end for index

} // end Scale_Oject_Mat


//////////////////////////////////////////////////////////////////////////////

Rotate_Object_Mat(object_ptr obj)
{

int index;

// rotate the object, just multiply each point in the object by it's rotation
// matrix

for (index=0; index<obj->num_vertices; index++)
{

Mat_Mul((vertex_ptr)&obj->vertices[index],(matrix_ptr)&obj->rotation);

} // end for index

} // end Rotate_Oject_Mat


//////////////////////////////////////////////////////////////////////////////

void Create_Field(void)
{

int index;
float angle,c,s;

// this function creates the asteroid field

for (index=0; index<NUM_ASTEROIDS; index++)
{

// fill in the fields

asteroids[index].num_vertices = 6;
asteroids[index].color = 1 + rand() % 14; // always visable
asteroids[index].xo = 41 + rand() % 599;
asteroids[index].yo = 41 + rand() % 439;
asteroids[index].x_velocity = -10 + rand() % 20;
asteroids[index].y_velocity = -10 + rand() % 20;

// clear out matrix

Make_Identity((matrix_ptr)&asteroids[index].rotation);

// now setup up rotation matrix

angle = (float)(- 50 + (float)(rand() % 100)) / 100;

c=cos(angle);
s=sin(angle);

asteroids[index].rotation.elem[0][0] = c;
asteroids[index].rotation.elem[0][1] = -s;
asteroids[index].rotation.elem[1][0] = s;
asteroids[index].rotation.elem[1][1] = c;

// set up scaling matrix

// clear out matrix

Make_Identity((matrix_ptr)&asteroids[index].scale);

asteroids[index].scale.elem[0][0] = (float)(rand() % 30) / 10;
asteroids[index].scale.elem[1][1] = asteroids[index].scale.elem[0][0];


asteroids[index].vertices[0].p[X_COMP] = 4.0;
asteroids[index].vertices[0].p[Y_COMP] = 3.5;
asteroids[index].vertices[0].p[N_COMP] = 1;

asteroids[index].vertices[1].p[X_COMP] = 8.5;
asteroids[index].vertices[1].p[Y_COMP] = -3.0;
asteroids[index].vertices[1].p[N_COMP] = 1;

asteroids[index].vertices[2].p[X_COMP] = 6;
asteroids[index].vertices[2].p[Y_COMP] = -5;
asteroids[index].vertices[2].p[N_COMP] = 1;

asteroids[index].vertices[3].p[X_COMP] = 2;
asteroids[index].vertices[3].p[Y_COMP] = -3;
asteroids[index].vertices[3].p[N_COMP] = 1;

asteroids[index].vertices[4].p[X_COMP] = -4;
asteroids[index].vertices[4].p[Y_COMP] = -6;
asteroids[index].vertices[4].p[N_COMP] = 1;

asteroids[index].vertices[5].p[X_COMP] = -3.5;
asteroids[index].vertices[5].p[Y_COMP] = 5.5;
asteroids[index].vertices[5].p[N_COMP] = 1;

// now scale the asteroid to proper size

Scale_Object_Mat((object_ptr)&asteroids[index]);

} // end for index

} // end Create_Field

//////////////////////////////////////////////////////////////////////////////

void Draw_Asteroids(int erase)
{

int index,vertex;
float xo,yo;

// this function draws the asteroids or erases them depending on the sent flag

for (index=0; index<NUM_ASTEROIDS; index++)
{

// draw the asteroid

if (erase==ERASE)
_setcolor(0);
else
_setcolor(asteroids[index].color);

// get position of object
xo = asteroids[index].xo;
yo = asteroids[index].yo;


// moveto first vertex

_moveto((int)(xo+asteroids[index].vertices[0].p[X_COMP]),
(int)(yo+asteroids[index].vertices[0].p[Y_COMP]));

for (vertex=1; vertex<asteroids[index].num_vertices; vertex++)
{
_lineto((int)(xo+asteroids[index].vertices[vertex].p[X_COMP]),
(int)(yo+asteroids[index].vertices[vertex].p[Y_COMP]));

} // end for vertex

// close object

_lineto((int)(xo+asteroids[index].vertices[0].p[X_COMP]),
(int)(yo+asteroids[index].vertices[0].p[Y_COMP]));


} // end for index

} // end Draw_Asteroids

//////////////////////////////////////////////////////////////////////////////

void Translate_Asteroids(void)
{

int index;

// this function moves the asteroids

for (index=0; index<NUM_ASTEROIDS; index++)
{
// translate current asteroid

asteroids[index].xo += asteroids[index].x_velocity;
asteroids[index].yo += asteroids[index].y_velocity;

// collision detection i.e. bounds check

if (asteroids[index].xo > 600 || asteroids[index].xo < 40)
{
asteroids[index].x_velocity = -asteroids[index].x_velocity;
asteroids[index].xo += asteroids[index].x_velocity;
}

if (asteroids[index].yo > 440 || asteroids[index].yo < 40)
{
asteroids[index].y_velocity = -asteroids[index].y_velocity;
asteroids[index].yo += asteroids[index].y_velocity;
}

} // end for index

} // end Translate_Asteroids

//////////////////////////////////////////////////////////////////////////////

void Rotate_Asteroids()
{

int index;

for (index=0; index<NUM_ASTEROIDS; index++)
{
// rotate current asteroid
Rotate_Object_Mat((object_ptr)&asteroids[index]);

} // end for index

} // end Rotate_Asteroids


//////////////////////////////////////////////////////////////////////////////

void main(void)
{

// put the computer into graphics mode
_setvideomode(_VRES16COLOR); // 640x480 in 16 colors

// initialize
Create_Field();

while(!kbhit())
{
// erase field

Draw_Asteroids(ERASE);

// transform field

Rotate_Asteroids();

Translate_Asteroids();

// draw field

Draw_Asteroids(DRAW);

// wait a bit since we aren't syncing or double buffering...nuff said

Delay(500);


} // end while

// place the computer back into text mode

_setvideomode(_DEFAULTMODE);

} // end main
________________________________________________________________________
- 115 -
‚ ¬ Ї®вॡгҐвбп ўаҐ¬п, зв®Ўл Ё§гзЁвм нвг Їа®Ја ¬¬г. “¤Ґ«ЁвҐ ў­Ё¬ ­ЁҐ
бЇ®б®Ўг, Є®в®ал¬  бвҐа®Ё¤л ¬ бив ЎЁаговбп Ё Ї®ў®а зЁў овбп. …б«Ё ўл
ба ў­ЁвҐ ўаҐ¬п ЁбЇ®«­Ґ­Ёп Їа®Ја ¬¬ Ё§ ‹ЁбвЁ­Ј®ў 4.8 Ё 4.11, в® ­Ґ ­ ©¤ҐвҐ
­ЁЄ Є®© а §­Ёжл. …б«Ё ¦Ґ ўл Ї®ва вЁвҐ ўаҐ¬п Ё Ї®¬ҐбвЁвҐ ўбҐ Ї®ў®а®вл,
¬ бив ЎЁа®ў ­ЁҐ Ё ЇҐаҐ¬ҐйҐ­ЁҐ ў ®¤­г ¬ ваЁжг, в® Їа®Ја ¬¬  Ё§ ‹ЁбвЁ­Ј  4.11
Ўг¤Ґв а Ў®в вм §­ зЁвҐ«м­® Ўлбв॥.
€в Є, г¬­®¦Ґ­ЁҐ ¬ ваЁж ®б®ЎҐ­­® нд䥪⨢­®, Є®Ј¤  ўл Їа®Ё§ў®¤ЁвҐ
¬­®¦Ґб⢥­­лҐ ва ­бд®а¬ жЁЁ ®ЎкҐЄв  б Ї®¬®ймо Ґ¤Ё­®©, § а ­ҐҐ
Ї®¤Ј®в®ў«Ґ­­®© ¬ ваЁжл, ўЄ«оз о饩 ў бҐЎп ўбҐ ®ЇҐа жЁЁ ЇаҐ®Ўа §®ў ­Ёп ­ ¤
нвЁ¬ ®ЎкҐЄв®¬.

Љ ‚Ђ…Њ“ ‘‚…„…Ќ€ћ
‡ Ї®¬­ЁвҐ, зв® ўбҐ нв® ¬л ¤Ґ« Ґ¬ ¤«п в®Ј®, зв®Ўл ­ гзЁвмбп ЇЁб вм
ўЁ¤Ґ®ЁЈал, ®б®ЎҐ­­® ваҐе¬Ґа­лҐ. € ¤Ґ« Ґ¬ ¬л нв® Ї®б⥯Ґ­­®. …б«Ё п ў ¬
ба §г Ї®Є ¦г, Є Є ЇЁб вм ЁЈал вЁЇ  Wjlfenstein 3-D Ё«Ё DOOM, в® ¬л ¬­®Ј®Ґ
Ї®вҐа塞 ў в ЄвЁЄҐ Ё дЁ«®б®дЁЁ а §а Ў®вЄЁ Ё б®§¤ ­Ёп ЁЈа.
…б«Ё ¦Ґ ўл ­ бв®пйЁ© а §а Ў®взЁЄ ЁЈа, ⮠㦥 ў ¤ ­­л© ¬®¬Ґ­в ¤®«¦­л ¤г¬ вм
® ⮬, Є Є ЇҐаҐ¤Ґ« вм ⥠Їа®Ја ¬¬л, Є®в®алҐ п ¤ «, ў ­ бв®пйго ЁЈаг. ЌҐ
ЎҐбЇ®Є®©вҐбм! Њ­Ґ Ё ў Ј®«®ўг ­Ґ ЇаЁе®¤Ёв бЄ § вм: "‚ Є зҐб⢥ гЇа ¦­Ґ­Ёп
ЇҐаҐЇЁиЁвҐ Їа®Ја ¬¬г Ё§ ‹ЁбвЁ­Ј  4.11 ў ­ бв®пйго ЁЈаг". Њл ­ ЇЁиҐ¬ ЁЈаг
ў¬ҐбвҐ, ­® згвм Ї®§¦Ґ. ‹гзиҐ Ї®Ј®ў®аЁ¬ ® ⮬, Є ЄЁҐ Ё§¬Ґ­Ґ­Ёп ­ ¬ ­ ¤®
ў­ҐбвЁ, зв®Ўл ЁЈа  Ї®«гзЁ« бм.
…б«Ё ўл е®вЁвҐ г§­ вм, Є  п Ўл ЇҐаҐ¤Ґ«лў « ‹ЁбвЁ­Ј 4.8 ў ­ бв®пйго ЁЈаг, в®
п Ўл ᤥ« « б«Ґ¤го饥:

1. Ћб­ бвЁ« Їа®Ја ¬¬г ўбҐ¬ ­Ґ®Ўе®¤Ё¬л¬ ¤«п ўлЇ®«­Ґ­Ёп ¬ЁббЁЁ. ‚Ґ¤м ­г¦­®
Ё¬Ґвм ¬ ­ҐўаҐ­­л© Є®б¬ЁзҐбЄЁ© Є®а Ў«м, ­ҐбЄ®«мЄ® а ЄҐв ¤«п г­Ёз⮦Ґ­Ёп
 бвҐа®Ё¤®ў,   зв®Ўл ЁЈа  ЇаЁ­п«  "в®ў а­л©" ўЁ¤, ­г¦­  бЁб⥬  Ї®¤бзҐв 
®зЄ®ў, § бв ўЄ  Ё, Є®­Ґз­®, ў®§¬®¦­®бвм ўл室  Ё§ Їа®Ја ¬¬л. Ља®¬Ґ
ЇҐаҐзЁб«Ґ­­®Ј® Ї®вॡгҐвбп б®§¤ вм бЁб⥬㠮Ї®ўҐйҐ­Ёп ® бв®«Є­®ўҐ­Ёпе б
 бвҐа®Ё¤ ¬Ё (в Є п бЁб⥬  Ўг¤Ґв а бᬮв७  згвм Ї®§¦Ґ, ў нв®© ¦Ґ
Ј« ўҐ);
2. „ «ҐҐ п Ї®¤Ј®в®ўЁ« Ўл бў®© Є®а Ў«м. „«п нв®Ј® ®ЇЁб « Ўл ®ЎкҐЄв,
Є®в®ал© Ї®§ Ё¬бвў®ў «, ­ ЇаЁ¬Ґа, Ё§ ЁЈал Star Trek;
3. Ќ ЇЁб « Ўл Ї®¤Їа®Ја ¬¬г ¤«п аЁб®ў ­Ёп Ё г­Ёз⮦Ґ­Ёп Є®а Ў«п (вЁЇ 
дг­ЄжЁЁ Draw_Asteroids Ё§ ‹ЁбвЁ­Ј  4.11);
4. ђ §а Ў®в « Ўл дг­ЄжЁЁ, Ї®§ў®«пойЁҐ ЁЈа®Єг гЇа ў«пвм Є®а Ў«Ґ¬;
5. Ќ ЇЁб « Ўл дг­ЄжЁЁ, Є®в®алҐ, ў § ўЁбЁ¬®бвЁ ®в б®бв®п­Ёп Є« ўЁ вгал,
ўа й «Ё Є®а Ў«м Ї® Ё«Ё Їа®вЁў з б®ў®© бв५ЄЁ. ќв® п ᤥ« « Ўл, Ё§¬Ґ­пп
ўҐ«ЁзЁ­г angles ў бвагЄвгаҐ, ®ЇЁблў о饩 ®ЎкҐЄв Є®а Ў«п;
- 116 -
6. Џ®в®¬ ¬­Ґ Ї®­ ¤®ЎЁ«бп Ўл бЇ®б®Ў ЇҐаҐ¤ўЁ¦Ґ­Ёп Є®а Ў«п. „«п нв®Ј® п
Ё§¬Ґ­п« Ўл §­ зҐ­Ёп x_velocity Ё y_velocity ў ᮮ⢥вбвўгойЁе дг­ЄжЁпе:

x_velocity = cos(angle)*speed
y_velocity = sin(angle)*speed

Ј¤Ґ бЄ®а®бвм Ё§¬Ґ­п« бм Ўл ЇаЁ ­ ¦ вЁЁ ­  ®ЇаҐ¤Ґ«Ґ­­лҐ Є« ўЁиЁ;

7. —в®Ўл ўўҐбвЁ Є®а Ў«м ў ЁЈаг, п Ї®¬ҐбвЁ« Ўл ўл§®ў дг­ЄжЁЁ бвЁа ­Ёп ўбҐе
Ја дЁзҐбЄЁе ®ЎкҐЄв®ў - Є®а Ў«п Ё  бвҐа®Ё¤®ў - ў ®¤­® Ё в® ¦Ґ ¬Ґбв®. ‡ вҐ¬
Ї®¬ҐбвЁ« Ўл дг­ЄжЁо ¤ўЁ¦Ґ­Ёп, Є®в®а п ®Їа иЁў Ґв Є« ўЁ вгаг, ў бҐаҐ¤Ё­г
Їа®Ја ¬¬л (¬Ґ¦¤г ўл§®ў®¬ дг­ЄжЁ© бвЁа ­Ёп Ё аЁб®ў ­Ёп);
8. ‚ б ¬л© Є®­Ґж жЁЄ«  ўбв ўЁ« Ўл дг­ЄжЁо аЁб®ў ­Ёп Є®а Ў«п.

‚®в, б®Ўб⢥­­®, Ё ўбҐ. ‚лЈ«п¤Ёв ­Ґ ®зҐ­м б«®¦­®. Џ®б¬®ваЁ¬, зв® ¤ «миҐ.

Ћб­®ўл Є®­ва®«п бв®«Є­®ўҐ­Ё©
-----------------------------------
„ ў ©вҐ § Ўг¤Ґ¬ Їа® ®аг¦ЁҐ Ё Ї®б¬®ваЁ¬, зв® Їа®Ё§®©¤Ґв, Ґб«Ё ­ б § ¤Ґ­Ґв
 бвҐа®Ё¤ (п б«ли «, ®­Ё ®зҐ­м ⢥а¤лҐ). „«п нв®Ј® ­ ¬ ­ ¤® б®§¤ вм бЁб⥬г
Є®­ва®«п бв®«Є­®ўҐ­Ё©.
®бм Y
(-3.5,-5.5) і
Ъ.ДДДДДДДДЕДДДДДДДДДДДДДДДДДДДї
і ДЕД (4,3.5) і
і ДЕД . і
і ДЕД і
і ДЕД і
і ДЕД і ®бм X
ДДДДДДДДЕДЕДЕЕЕДЕДЕДЕДДЕДДЕДЕДЕДЕДЕДЕДДДДДДЕД
і ДЕД і
і ДЕД і
і ДЕД . . і(8.5,-3)
і ДЕД і
і ДЕД (2,-3) . і
і. і (6,-5) і
АДДДДДДДДДБДДДДДДДДДДДДДДДДДДДЩ
(-4,-6)

ђЁб.4.10. ЋЇЁблў ойЁ© Їаאַ㣮«м­ЁЄ ў®ЄагЈ  бвҐа®Ё¤  ¤«п ўлпў«Ґ­Ёп
бв®«Є­®ўҐ­Ё©.

- 117 -
ќв® §­ зЁв, зв® ­ ¬ ­ ¤® ᤥ« вм §аЁ¬л¬ б®г¤ аҐ­ЁҐ Є®б¬ЁзҐбЄ®Ј® Є®а Ў«п б
 бвҐа®Ё¤®¬. Џа ўЁ«м­ҐҐ ўбҐЈ® Ўг¤Ґв Ї®бвгЇЁвм в Є:
1. ‡ Ўлвм ® ॠ«м­ле Ја ­Ёж е  бвҐа®Ё¤  Ё Є®а Ў«п Ё б®§¤ вм ўЁавг «м­го
Ја ­Ёз­го ®Ў« бвм ў®ЄагЈ Є ¦¤®Ј® ®ЎкҐЄв  ЁбЄ«озЁвҐ«м­® ¤«п вҐбв®ўле
楫Ґ©. ЌҐ ­ ¤® ҐҐ аЁб®ў вм, ¤®бв в®з­®, зв®Ўл ®­  ЇаЁбгвбвў®ў «  ў­гваЁ
Їа®Ја ¬¬л. ђЁб.4.10 Ї®Є §лў Ґв, зв® п Ё¬Ґо ў ўЁ¤г.

2. …б«Ё ¬л гўЁ¤Ё¬, зв® Ја ­Ёз­ п ®Ў« бвм ­ иҐЈ® бг¤­  ў®и«  ў Ја ­Ёз­го
®Ў« бвм  бвҐа®Ё¤ , ¬л ¬®¦Ґ¬ бЄ § вм, зв® ­ и Є®а Ў«м г­Ёз⮦Ґ­. ќв®
¤®ў®«м­® Їа®б⮠ᤥ« вм: ¤®бв в®з­® ба ў­Ёвм Є ¦¤го ўҐаиЁ­г ®Ў« бвЁ б
ўҐаиЁ­®© ¤агЈ®© ®Ў« бвЁ. …б«Ё Ґбвм ўе®¦¤Ґ­ЁҐ, §­ зЁв Їа®Ё§®и«®
бв®«Є­®ўҐ­ЁҐ.

3. ’ҐЇҐам, Є®Ј¤  бв®«Є­®ўҐ­ЁҐ § дЁЄбЁа®ў ­®, ­г¦­® Їа®Ё§ўҐбвЁ ­  нЄа ­Ґ
Є Є®©-­ЁЎг¤м Єа б®з­л© нд䥪в: 500-в®­­л© Є®а Ў«м б ¤ўЁЈ вҐ«Ґ¬ ­ 
 ­вЁўҐйҐб⢥ ўаҐ§ Ґвбп ў  бвҐа®Ё¤. Ќ ЇаЁ¬Ґа, ўбЇлиЄЁ б«гз ©­ле в®зҐЄ.
ќв® Ўг¤Ґв ­ҐЇ«®е® ᬮваҐвмбп.

4. Џ®¤бзҐв ®зЄ®ў Їа®бв: б®§¤ ©вҐ ЇҐаҐ¬Ґ­­го score Ё ЇҐз в ©вҐ ҐҐ ­ 
нЄа ­Ґ Є ¦¤л© а §, Їа®е®¤п зҐаҐ§ Ј« ў­л© жЁЄ«. ‚л ¬®¦ҐвҐ ЁбЇ®«м§®ў вм
дг­ЄжЁо _outtext() Ё§ ЎЁЎ«Ё®вҐЄЁ ‘Ё.

Ља®¬Ґ нв®Ј® ­ ¬ ­ ¤® ­ ЎЁа вм ®зЄЁ. ‡­ зЁв, ­г¦­® Ё¬Ґвм ®аг¦ЁҐ. Ќ ЇаЁ¬Ґа,
Є®а Ў«м ў ЁЈаҐ ¬®¦Ґв ЁбЇ®«м§®ў вм д®в®­­лҐ в®аЇҐ¤л - ¬ «Ґ­мЄЁҐ в®зЄЁ. —в®Ўл
Ёе Ї®«гзЁвм, ­ ¬ ­ ¤®:
1. Ќ §­ зЁвм ®¤­г Ё§ Є« ўЁи («гзиҐ Џа®ЎҐ«) ¤«п бв५мЎл.

2. Љ®Ј¤  Ўг¤Ґв ®Ў­ а㦥­® ­ ¦ вЁҐ ­  Є« ўЁиг, ®ЇаҐ¤Ґ«Ёвм ­ҐбЄ®«мЄ®
ЇҐаҐ¬Ґ­­ле, ў Є®в®але § Ї®¬­Ёвм ­ Їа ў«Ґ­ЁҐ ¤ўЁ¦Ґ­Ёп Є®а Ў«п (miss_xv Ё
miss_yv).

3. ‡ вҐ¬ § Ї®¬­Ёвм ў ¤ўге ЇҐаҐ¬Ґ­­ле Ёб室­го Ї®§ЁжЁо а ЄҐвл, в® Ґбвм
Є®®а¤Ё­ вл 業ва  Є®а Ў«п (miss_x Ё miss_y).

4. ЏаЁбў®Ёвм ЇҐаҐ¬Ґ­­®© life §­ зҐ­ЁҐ 100.

5. ‚ жЁЄ«Ґ ­ з вм ЇҐаҐ¬ҐйҐ­ЁҐ а ЄҐвл Ї а ««Ґ«м­® Єгабг Є®а Ў«п Ё Є ¦¤л©
а § ба ў­Ёў вм Є®®а¤Ё­ вл в®аЇҐ¤л б Ја ­Ёж ¬Ё  бвҐа®Ё¤®ў. …б«Ё
бв®«Є­®ўҐ­ЁҐ ®Ў­ а㦥­®, 㢥«ЁзЁвм бзҐвзЁЄ ®зЄ®ў Ё г¤ «Ёвм  бвҐа®Ё¤.

6. “¬Ґ­миЁвм §­ зҐ­ЁҐ ЇҐаҐ¬Ґ­­®© life, Ё Ґб«Ё ®­  бв «  а ў­  ­г«о, в®
г­Ёз⮦Ёвм а ЄҐвг Ё ¤ вм ў®§¬®¦­®бвм ЁЈа®Єг ўлбв५Ёвм б«Ґ¤гойЁ© а §.


€’Ћѓ

ќв  Ј« ў  ¬®Ј«  Ўл ®Є § вмбп ў б®в­Ё а § Ў®«миҐ. “ ¬Ґ­п ¤Ґ©б⢨⥫쭮 Ўл« 
§ ¤ з  Їа®ўҐбвЁ Єа вЄЁ© Єгаб ¤ўг嬥୮© Ја дЁЄЁ. Њл г§­ «Ё ¬­®Ј® ­®ўле
- 118 -
Є®­жҐЇжЁ© Ё вҐа¬Ё­®ў. ’ҐЇҐам ¬л §­ Ґ¬, Є Є Їа®Ё§ў®¤Ёвм Їа®бвлҐ
ЇаҐ®Ўа §®ў ­Ёп ®ЎкҐЄв®ў Ё в®зҐЄ ­  Ї«®бЄ®бвЁ. Њл в Є¦Ґ г§­ «Ё ® ¬ ваЁж е
(¤ ¦Ґ ­ҐбЄ®«мЄ® Ў®«миҐ, 祬 ­г¦­®) Ё Є Є ®­Ё ¬®Јгв Ўлвм ЁбЇ®«м§®ў ­л ў
Є®¬ЇмовҐа­®© Ја дЁЄҐ Ё ўЁ¤Ґ®ЁЈа е ¤«п гЇа®йҐ­Ёп ЈҐ®¬ҐваЁзҐбЄЁе
ЇаҐ®Ўа §®ў ­Ё© Ё ЇаЁ¤ ­Ёп Ё¬ Ў®«ҐҐ Є®¬Ї Єв­®© д®а¬л. ‚ Є®­жҐ ¬л ¤ ¦Ґ
гўЁ¤Ґ«Ё Ї®«Ґ  бвҐа®Ё¤®ў ­  нЄа ­Ґ. џ 㢥७, зв® г ў б Ґбвм ¬­®Ј® ў®Їа®б®ў.
Ќ ўҐа­®Ґ, ¤ ¦Ґ Ў®«миҐ, 祬 ў ­ з «Ґ Ё§г祭Ёп нв®© Є­ЁЈЁ. џ Ї®бв а обм
®вўҐвЁвм ­  ­Ёе ў ¤ «м­Ґ©иҐ¬. Ќ® Їа®иг ў б Ї®¬­Ёвм, зв® ­Ґ бгйҐбвўгҐв
Їа®бвле Ё Ўлбвале Їа ўЁ« ¤«п ­ ЇЁб ­Ёп ЁЈа. ќв® ­Ґ б®авЁа®ўЄ  ¬ ббЁў . Ќ ¬,
Є Є Їа®Ја ¬¬Ёбв ¬, ­г¦Ґ­ ­ Ў®а а §«Ёз­ле ваоЄ®ў ¤«п ॠ«Ё§ жЁЁ ­ иЁе Ё¤Ґ©,
  Ї®бҐ¬г Їа®¤®«¦Ё¬ а Ў®вг.
Соседние файлы в папке Книга по созданию трёхмерных игр