Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Книга по созданию трёхмерных игр / 4
.TXT
- 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 -
Є®жҐЇжЁ© Ё вҐа¬Ё®ў. ’ҐЇҐам ¬л § Ґ¬, Є Є Їа®Ё§ў®¤Ёвм Їа®бвлҐ
ЇаҐ®Ўа §®ў Ёп ®ЎкҐЄв®ў Ё в®зҐЄ Ї«®бЄ®бвЁ. Њл в Є¦Ґ г§ «Ё ® ¬ ваЁж е
(¤ ¦Ґ ҐбЄ®«мЄ® Ў®«миҐ, 祬 㦮) Ё Є Є ®Ё ¬®Јгв Ўлвм ЁбЇ®«м§®ў л ў
Є®¬ЇмовҐа®© Ја дЁЄҐ Ё ўЁ¤Ґ®ЁЈа е ¤«п гЇа®йҐЁп ЈҐ®¬ҐваЁзҐбЄЁе
ЇаҐ®Ўа §®ў Ё© Ё ЇаЁ¤ Ёп Ё¬ Ў®«ҐҐ Є®¬Ї Єв®© д®а¬л. ‚ Є®жҐ ¬л ¤ ¦Ґ
гўЁ¤Ґ«Ё Ї®«Ґ бвҐа®Ё¤®ў нЄа Ґ. џ 㢥аҐ, зв® г ў б Ґбвм ¬®Ј® ў®Їа®б®ў.
Ќ ўҐа®Ґ, ¤ ¦Ґ Ў®«миҐ, 祬 ў з «Ґ Ё§г票п нв®© ЄЁЈЁ. џ Ї®бв а обм
®вўҐвЁвм Ёе ў ¤ «мҐ©иҐ¬. Ќ® Їа®иг ў б Ї®¬Ёвм, зв® Ґ бгйҐбвўгҐв
Їа®бвле Ё Ўлбвале Їа ўЁ« ¤«п ЇЁб Ёп ЁЈа. ќв® Ґ б®авЁа®ўЄ ¬ ббЁў . Ќ ¬,
Є Є Їа®Ја ¬¬Ёбв ¬, 㦥 Ў®а а §«Ёзле ваоЄ®ў ¤«п ॠ«Ё§ жЁЁ иЁе Ё¤Ґ©,
Ї®бҐ¬г Їа®¤®«¦Ё¬ а Ў®вг.