T uy vậy chúng ta s ẽ thực hiện nlì sau: Trớc khi bắt đáu vẽ, chúng ta xác định và chuẩn h o á những véctơ tiêu cluian của tất cà cá c mặt phẳnơ.
Trang 2ĐẠI HỌC QUỐC GIA H À NỘI
HU'ÒN<; ĐẠI HOC KHOA IIỢ C T ự NHIÊN
Trang 3ĐAI H O C Q U Ố C GIA H Ả NỔI
T R Ư Ơ N G ĐAI HOC K H O A H Ọ C T ự N HIÊN
Hà Nội - 1999
Trang 4c ó d ợ c nhữiiũ h.:im sỏ’ d ặ c biV1 có the luỳ V sử dựng mà k h ó n g cán phải lốn
n h iều 1 hòi siian s u y Iichĩ Ilh những trờnc hợp đặc biệt hay tối li hoá tóc độ U 2 Ó I I
n c ữ lập trình c d ọ c dull" irong cuốn sách này c ó ral nhiều II d ie m bói nó đa ni
n h ữ n c m ã lập c ó lính kh;i c h u y ên và hiệu quà T u y nhiên, nó vẫn đáp ứng dợc
n h ũ n g V t o n a n c ỏ ii ngũ' lập trình ờ m ức cao.
Bạn d ọ c nên c ỏ nhữiis’ hiếu biết CO' ban v ề 11SÓI1 n gữ lập trình c.
Bạn đ ọ c s ẽ d ễ d à n g nhận thấy trong quá trình thực hiện m ột c h o n g trình dài iàm v iệ c v ó i c á c b iế n chứ a vị trí nhớ cùa dữ liệu CŨI12 dề- d à n g nh làm việc VỚI
n h iều d an h s á ch c á c s i á trị dũ' liệu c ù n g loại.
T h e o nh lieu tic eiui c u ố n sách này ch ú n g lói s5 k h ô n g đ é cập tới nhĩiMũ ihuật (oán phức tạp nh phons; pháp theo dấu tia đ è tạo ra d ó huạ m áy lính chái
lo n 2 c a o h a y phơUQ pháp radiosity Hon nữa, những đối lợ n e s ẽ luồn sắ n lien
h o ặ c tách rời n h ữ n g k h ố i da diện mil troné nó chứa một s ố lợn? đa e iá c nhãì dịnh.
T h u ậ t toán t h e o dấu lia rất cán thiết đ ể ụ o ra dợc những hình anh ¡al thục,
và th ậm c h í nó c ò n c ó kh a nàng tạo ra những ảnh phức lạp T u y nhiéú, nếu bạn
m u ố n làm d ợ c đ ié u đ ó bạn vẫn cẩn c ó n h ũn s máy vi linh-chạy cới lóc dỏ nhann rất p h ổ b iên trên thị trờnc và m ót s ố lợna lớn đĩa lù Đ ẽ c ó thế tạo ra hàim irũn khối tin ir o n s m á v vi tính hơi phức tạp c h ú n e ta phai cán rất nhiêu ihiKi! luán khác nhau.
Trang 5-T ấ t cà những bien loàn cục, những macro và chức n â n g tạo n g u y ê n m au đều
đ ợ c nêu lên trong bán phụ lục cùa cuốn sách này.
T óm lại, c ó thể nói rằng cuốn sách này tập trung v à o những đ iể m sau
* Cung cấp kiến thức toán c ơ bản áp dụng ch o đ ồ h o ạ 3 D
* Dần dần phát triển chơng trình đổ hoạ hoàn hảo c ó k h à nàng đ a ra những
b àn sao của hình 3 D m ột cách nhanh ch ó n g , g ồ m c ả b ó n g - đợc phản c h iế u ở độ
e iớ i hạn, những bàn sao Iiày sẽ đợc g iữ trong tệp Postscript C ác h ìn h ảnh đ ợ c
m ô tà s ố n g động hoặc qua sự tác đ ộ n g qua lại lẫn nhau h oặc qua c á c tệp hoạt hình M ột ch u ỗ i c á c hình ảnh đợc tạo ra trong thời gian thực c h ơ n g trình n à y c ó
th ể cài đật vào trong bất kỳ m ột m áy vi tính nào c ó khà n ă n g tạo ra trong đ ồ vẽ
m àu bằng giá trị R G B (m ô hình cộ n g màu c ơ bản) và lập ra những phần tử ảnh bằng những; màu này trên màn ảnh Bộ biến dịch c có thể c ó c h ứ c năn? tạo ra
đ ờn g thảng phàn cá ch siũa hai điểm hình, và CÒI1 c ó thể làm đ ầ y c á c đa g iá c lồi.
* Minh hoạ kỹ thuật lập trình c cùng với v iệ c nhấn m ạnh tính kh á c h u y ể n
và tốc độ Nếu bạn d ọ c nào còn cha quen với ngôn n gữ lập trình c thì vẫn thấy cuốn sách này rất c ó íclì trong việc giúp bạn hiểu rõ hơn v ề s ó o h ọ c phân phối
và giãi loà dòng dữ liệu.
* Cung cấp ch o bạn dọc m ã nguồn v ề bộ c h ơ n g trình lập trình d ồ ho ạ với sự giúp đỡ của mã nguồn này, c ó khả năng thích ứng những m ã m ớ i và thực hiện những thông tin m ới (v í dụ nh có thể dễ dàng g iớ i thiệu lo ạ i đ ờ n g c o n g s p lin e mới hay họ các ngôn ngữ lập trình gia o diện, m ới )
Trang 6Trong thời gian viết cu ố n sách này tỏi đã nhặn đợc rất nhiều sự ủng hộ, hồ (rợ củ a D ave D obkin, viện khoa học v ề m á y tính, c ù n g cá c bạn bè làm v iệ c tại
p h òng thí n g h iệ m về đ ồ hoạ vi tính tơng tác.
T ôi cũng chùn thành cá m ơn các đ ồ n g nghiệp cùa tỏi tại viện hàn lâm khoa
h ọ c áo nh Reinhard, Thaller, L eonid D im itro w và Em anuel W en g er đã g iú p tôi rất nhiều trong quá trình viết sách.
T ô i cũng c â m ƠIÌ hai sinh viên đã làm v iệ c cù n g với tôi là T h o m a s G rohser
và Heinrih P om m er, c á hai đã đa ra rất n h iều những ý kiến để cải tiến m ã và tốc
đ ộ.
V à cu ố i c ù n g tôi xin cả m ơn ỏ n g H e llm u th Stachel, W o lfg a n g Rath, viện
n g h iên cứu hình học tại tròng đại học k ỹ thuật V iê n và ôn g Otto Prem, viện
H a n d elsa k a d em ie St Johann im Pongau, những n gời đã đa cho tôi nhiều lời khuyên và cũ n g chính là nhũng ngời dã c ù n g với Silvio L evy d ọ c và sửa bán in
c u ố n sách này.
Gợi ý d ọ c sách tham kháo
Danh sách nhũng cuốn s á ch về đồ hoạ 3 D rất dài và s ẽ ỉà vô dụng nếu nh
đ ọ c tấc chúng Đ ể c ó thể hiểu cuốn sá c h n à y kỷ hơn, bạn đọc nên tìm đ ọ c tham kháo thêm những sácli sau.
Cách đo c h iề u dài và d o g ó c
G iao nhau của cá c đ ò n g và các mặt ph ẳng
Tịnh tiến
M a trận
4
Trang 7Hĩnh chicu
Hình chicii li lilí’- tám
Chỏ]) quan i;il
H ệ ihunu loạ dô
Q u a lại ciữ a cá c hệ loạ dỏ
Thuậi loan XI K Ì Ì dỏ hoa c ơ b á n
Thuúi loan nhanh VC b c mặt an 5
Các đỏi tợn ạ cỡ dull ị : bao lỏi
Bé m ặi qua}
Bé mặt cắt
Trang 8Di c h u y ến đờne; khuất trên c á c dối tong có đ ừ n g b a o lối
Đ ệ m theo c h ic u sâu đ c trỏng thấy dợc
Đ ừng và inái pliant» Spline
Đ ò n g va mãi phang [lỏi suy
h
Trang 9Đ ờ n g và mặt phẳng lon g dong
Đ ờ n g c o n g dặc biệt lien be mặt da giác lioá
Đ ờ n s c o n g tácli họp không gian
M ộ t vài v í dụ ứng dụng
Phim ành đợc thực hiện bằng m áy vi tính
Phơng pháp lu trữ m ột bộ phim hiệu quà
Cách viết tếp dữ liệu và tệp hoạt hình
Cách viết tệp dữ liệu dữ liệu và hoạt hình m á y vi lính cúa bạn chạy nhanh [ill
Trang 10I NHỮNG N ÉT C ơ BÀN T R O N G HÌNH H Ọ C PHÂN
T ÍC H K H Ô N G GIAN.
Tron g c h o n g trình này ch ú n g tỏi s ẽ đề cập đ ến những vấn đ ề phỗ biến nhất ,
c h u n g nhất trong hình học phàn tích và những g iã i pháp hữu hiệu áp dụng vói từng vấn đề ch ú n g tôi cũng sẽ giới thiêu luôn v ề thuât toán COI1 trỏ c h o nhữna nhà lập trình cò n thiếu kinh nghiệm để họ c ó thể hiếu đợc những vấn để phức tạp hơn.
C húng tôi sỗ k h ô n g đề cặp tới hình học k h ô n g gian hai ch iều bời tất cá
c h ú n g ta đã qu á quen thuộc đối với khái niệm hình học kh ông gian và nh vậy
v iệ c nói v ề hiIih h ọ c kh ông gian ba chiểu lúc này s ẽ kh ông là vấn đ ề phức tạp nữa H ơn t h ế nữa rất nhiéu n guyên tắc cù a hĩnh học không gian c ó thể áp d ụ n s
đ ố i vói hinh h ọ c k h ô n g siaii hai c h iề u m à k h ô n g cần phái thay đổi nhiều Trôn thực tế, hầu hết nlm g vãìi d ề đ ề cập đ ến ò' phân l i và 1.4 c ó những đ iế m tơng tự nh trong k h ô n g d a n hai chiều ( v í dụ Iih cá c phần giao nhau và g ó c đo giữ a cá c đ ờ n g ) đều c ó thể đọc giài q u yết đơn giàn bãiig cách s ạ ch bỏ toạ độ thứ ba T u y nhiên một vài vấn đ ề k h ô n g gian hai chiều đặc biệt s ẽ đợc đ ề cập đền nhữno chơnsi khác.
1.1 V e c t o
\
C h ú n g tỏi coi hệ thỏv.í loạ dộ Cartesian k h ô n g clan ba c h iều dựa trẽn ba Irục g ia o pairwise, x,y,z hình 1 ) M ỗ i một đ iể m p irong k h ô n g sia n c ó nhfrtii: loạ độ d u y nhất ,P x ,ỉ5y,ỉJz.và c h ú n g tôi viết là p (Px,Pv,Pz) v é c tơ p là op tính lì:
đ iểm g ố c 0 ( 0 , 0, 0 ) tói UÍI11 p đ ợ c g ọ i l à c é c t ơ định vị của đ iế m p, và đ ợ c viết nil sau
V é c tơ p c ũ n g c ó thê Jợc d iễn dịch nh là tổ hợp tuvến tính cù a ba v é c tơ ctoi
vị trực g ia o - ba vóc tơ n:.v c ó thổ xác định rõ c á c véc ;ơ đơn vị
H ã y đ ể toạ độ đ iể m Q (q x,q v, qz), c ù n g với v é c tc định vị q = q x q y , o z), thành m ộ t đ iể m khác trc:;g k h ô n g gian lúc này ta s ẽ ó véc tơ pQ Iih sau h oặc
cụ thể hơn là, P Q = q - p
s
Trang 11Hình I: He Ihỏng loa dô Cíincsiaii
V é c lú l ’Q đ ụ c ' 4Ọi iu iỉicu s ò lỊíùa p vú ụ MỎI ti lõm \ ÚI r.v „V o uiiii'.
I X irẽii dừim thãuu pọ đưoc m ỏ lá bới p h o n s irinh v c c !ữ s a u :
Bây g iừ ta hãy viẽì VC hàm c dơn giàn ma c ó ihữ g iú p c h ú n g la m u Jựu !
d ie m trẽn d ờn g th án g PQ, phụ thuộc vào tham s ố I
T u y nhiên, trác lict c h ú n g tỏi m u ốn nói vài lời v ể kỹ thuật lập trình ¡nà
J ơ c sử d ụ n g c h o bộ c h o n g triuhf đ ó hoạ.
Mã nguồn cún bộ ch o n g trình lỏn này s ẽ đợc lách ra thành iilnìiiL’ mociun:
J ú n h c, tệp l c tệp 2c, tệp 3c, vãn vãn T ệp chính c cha đựng hàm sỏ chilli: ( )
Các tệp s ẽ đ ợ c ch ia nho thành c á c biến toàn c ụ c N hìn c h u n g , c h ú m túi sẽ
c ố g ắ n g tránh những biốn (oàn cụ c khi n à o c ó thế cluing l à m c h o c h o n g irình lớn k h ó c ó the d u y trì dơc và tạo ra khá nâng x u n g dột giữ a c á c m o đ u n Mặt khác, những b iến nh vậy c ó thể táng tốc dộ ch o c á c mã Biến toàn c ụ c s ẽ d ọ c su
d u n g trong su ốt c u ố n sách này Bói vì ch ú n g c ó ihe d ể dàng phân biệt \ơ i những biến c ụ c bó- Chu nu lôi sẽ da biến loàn c ụ c vào tron lí tệp c ó Lèn
G lo b a is h Tệp này cú ihc d ọ c nám irong mả c.
4 m ch eid c "Glotalsiì".
Tất c á c á c dinh nghĩa kicu m ã s ẽ d ọ c s ử d ụ n g s ẽ đ ọ c da vào m ộ t tệp include
T y p e s h C ũng tơiií’ lự Iih vậy dối vứi tất c ả cá c m a c rò s ẽ á ợ c iricn khai ( I
m acros, h) Thuật ngữ macro s ẽ dợc sir dụng nên ta c ó ihế dỗ dàng nluin (hãy
ch ú n g lừ c a c hàm
Cuói cũ n g , khai bao ÌKiin (lien đõ [làm; sõ clơc vié! II‘UI1'4 lẹp Proio.il Tronu suui CUỎI1 sách n à y ch ú iii’ tỏi sẽ :.ứ d ụ n g ngôn ngữ c liêu ciiuấn d o ỏim
Trang 12k e r m c h a m / R ilh ie định imilla ("lieu chuẩn K Vil K"; c h ứ k h ô n g phái là lieu
ch u ẩn A N S I (cụ c lieu chuán quốc g ia M ỹ ) hiện dại hơn cũ v iế i c h o ngớn ngũ VÌ1 b â y g iữ t;i c ỏ the lu ỳ ý sử d u n s Iihữiiũ dịnh imilla này khi thấy cán ihiei.
Đ ủ lien lọi hơn lỏi da tal cà nhữim lộp im lu slc tiuim ch o bộ c h ơ n g li inh dỏ
h o ạ v à o irony lộp C' I mclu.sk- dơn vị 3d - std.h, mà cũn«: • CT 10112 tựu I»h : "cục lieu
( N h ữ n g m acro phu thuộc h ệ thống ir ons tệp G M acros.il s ẽ dợc m ở rộng
ir o n s ch ữ n g 4 ) khi bấi đáu m ỗi m ộ t m ô đun ta viết
# d efin e: G lobal extern
# d e fin c : Init (var, valu e) va;
# e n d if
T e n G lo b a ls h n o n e s io n a nh:
10
Trang 13Global short v a r!, var 2 [6],
Global float Init (var 3, 10), var 4 [ 3 ] ,
Global char Init (var 5, 's')
Global FILE luit ( :i!F,sidvut)
Chl t ro II Si, Içp main.c, troc lien đực trình bày nh sau:
# d efin e M A IN
Trong tệp nàv bộ tiền xứ lý sẽ c h u y ể n rời từ Global dể tất cả cá c b iến đực
¡hông báo nil cá ch thòng thòng Trong bất kỳ một m odun nào khác, c á c biốa sẽ đợc thông báo thành EXtern.
Tuy nhiên, kỹ thuật này kh ông ch o phép ta c ó thể khời d ộ n g m ản g v ậ y liên tòi viết # i f d e f M A IN
Global n e a t var 4[3] = (0 ,5 , 15, -1};
# else
Global float var 4[3];
# endif.
vào trong G lo b a le h khi m uốn khỏi đ ộ n g m àn g một cách thuận lợi.
k ỹ thuật m ô tá cũng rất có tác d ụ ng đ ố i với định nghĩa và khỏi đ ộ n g h o á của con trỏ tới hàm: C iú m s la định nghĩa macro
Trang 14Sau phẩn íỊÌui ihiộu này, chúng tủi dã c ó tile da ra hàm c.
C hú n g tói giới thiệu m ột loại biến mới 2ỌÌ l à vectơ,.có nghĩa là một máng
c ủ a ba s ố llụrc Nhữna s ố này c ó thổ là toạ độ k h ô n g gian của một đ iểm hoặc
m ộ t v e ctơ trên ¡nàn hình, c phân biệt dọc siữ a cá c rõ kép (double) và rõ dơn (float) R õ đơn sẽ c ó tác clụiiíỉ đỏi với phần lớn cá c tròng hợp, vậy nên ta chọn ploat d e k h ô n g tốn thời gian.
ty p e d e f float vector [3], ( □ types, h)
void (poiut - line (result, p, q, lambda)
vector result; / * Đ iế m đ ợ c tích */
V e cto r p, q; / * cự c đ iế m * /
float lambda; / * thum s o ■"/
{/* b e g in point - on - line ( ) * ,/ (but đầu đ iể m trên đ ò n g íhá;ig)
résister z float Một - trừ - lambda = 1 - lam bda, ( i - 2 )
register short i,
for (i = 0 , i < 3, i+-f )
rer.ilt [i] = I - t rừ - lam bda * p[i; + lambda * q[i];
} ; * cu ối đ iểm trẽn d ừ n g ( ) */
R ecgister: Các biến thanh ghi táng tốc độ m à lập T u y nhiér đó chì là những
g ợ i ý chơng trình c s o thực sự c ó ích k h ô n g khi phụ thuộc vào bộ biên.dịch.
H i m này s ẽ khôn phái lã hàm c nếu nh v iệ c lựa chọn này k>.ỏn2 thò đực bằng cách khác có sử d ụ n s cá c macro.
v iệc s ử đ ụ n s macro dã ui úp liếp kiệm đ ọ c thời íỉian, m ặ c dù lất cá mọi VÎÇC SỊỌÌ hi:m đ ều mác thời sia n đẽ’ sao cho cá c biến vào các ngăn xép.
M ọt u đ iếm aữa đó là sử dụng iv.acro thì k ic u biến s ẽ k h ô n s aây ra hiệu qua,
d ie u c ó c ó 11 ch ĩa là nếu ban thích sử clụp.g "Ions" hay double" i -.ay ch o dîm e
"float", nó c ĩin s vẫn sẽ hoạt đ ộ n s t¿-t V ậ y r.ẻn Macro c.
# defin e, đ iểm irèn d ờ n g (kết quá, p, q, I ) \ ( I M a cro s.ilI
12
Trang 15(kết quá [0] = p[0] T I (q[0] - p[0] ) , \
(kết qua [1] = pi 1J + I * ( q [ l] - p [ l ] ) \
(kết qua [2] = p [ 1 ] + I * (q [2] - p[2J)
c ó kết quá tơng tự chính xác nh hàm trớc, chì c ó m ột điếm khác dó là ỏ'
đ iếm khúc đo là, ử hầu h ít cá c trims’ hợp, nó s ẽ làm việc hơi nhanh hon bởi vì
bộ tiền xử lv thay thế m ỗi cu ộ c gọi macro bằng m ã Iơng đong, m à k h ô n g cán phải đa vào hàm.
N ó cũng s ẽ nhanh hơn bởi vì biến đ ếm i s ẽ khôn tồn tại lảu hơn nữa Them vào đó, ch ú n g ta dùng phong trình 4 thay cho phong trình 5 bời vì tại m ỏi dờna
chì c ó m ột phép tính nhài) [hay cho 2 phép - việc bớt đi một phép tính SC thực
hiện nhanh hơn m ột chút khi so sár.h thời gian tính toán, kết quà c h o thấy r;\ns hàm point - on - line ( ) [một đ iểm trẽn đòng] ch ạy chậm hon lừ 30% đến 60%
s o vứi macro point - on - line ( ), phụ thuộc vào m ấy vi lính và bộ biên dịch sử dụng (x em phụ lục A4).
Bạn c ó thể nghi rằng điều ám ành này cùng vói tốc độ đã hơi bị thổi phỏnsi lòn, nhng bạn sẽ luôn phai nghĩ rằng lập trình của đồ hoạ 3D phải m ang lại hiệu quà cao đ ế c ó the tiếp k iệm đợc thời gian t í n h toán ờ mức thấp nhất N ếu r.h chúng ta tận d ụ ng m ọi cơ hội tiếp kiệm thời g ia n , ihì toàn bộ c h o n g trinh sẽ dực thực hiện n h a n h hơn, điều đó c ó nslĩĩa là tại giai đoạn cuối chúng ta sẽ c ó khả nãĩis tạo ra m ột tranh hoạt hình 2 0 lần trong m ột giâ y (hay c h o chi 12 lần trong một giây.
Trong macro mục đích của thuật toán con trò là đa ra cấch viết (result) thay
c h o result, (p) thay c h o p và (q) thay cho Cị.
Lý do củ a cách viết này đợc giái thích ờ c u ố i phần 1.4 Hơn thế nữa, nó vẫn luôn là V tởng hay [rong việc báo vệ lất cà cá c macro ư o n g dấu n s o ặ c đon (chúng côi sẽ SỚM da ra v í dụ minh hoạ cho điều này)
N ó i thêm m ộ t chút nữa về Macro.
Bây g i ờ hãy quay trỏ' lại giả thuyết - m ột bổ đ ề rất quan trọng đó là hai VÌCỈƠ
kh ông biến a = (ax, ay, az) và II = ( nx, ny, nz) s ẽ giao nhau chi khi c h ú n g đợc
g ọ i lù nhữnơ biến tích điểm
Trang 16N í u n bình Ihờng s o vó'i véciư b, thì thành phẩn cùa nó s ẽ thực hiện đực dieu kiện bổ xung n x b x + Iiybv + nzbz = 0
T íc h c h é o đ ợ c gọi nh vậy là một v e c tơ thực hiện đợc c à hai diều kiện, đó là trực g i a o cùa a và b.
M acro đối với tích đ iếm và tích c h é o có thể g iố n g Iih sau (đ e c ó thế dỗ đọc
h on c h ú n g lỏi định nghĩa X ,Y ,z irớc)
# d e fip e X 0
# d efip e Y 1
# clef i pe z z
# định n gh ĩa tích d ie m (a, b ) \ ( □ M acros.h )
((a) [X] * ( b ) [X] + (a) [Y] * ( bj [z] * (b) [z])
7? định n gh ĩa tích ch ¿0 (n ,a ,b )\
( (n) [X] = (a ) [Y] * (b) [Z] - (a, [z] * ( b ) [ y ) , \
( n) [ y] = ( a ) [z] * (b) [x] - ( a) [xj * ( b ) [ z ] , \
(n) [2 ] = (a) [x]* (bj [y] - (a) [y] * (b)[v]
N hững bien véc tơ phái d ọ c vi ¿'ỉ trong n g o ặ c đơn dó là !ý d o c ù a thuật loún
c o n trò Bạn phải chắc chắn rằng toàn bộ biểu thức plini ctợc \ i¿'t tr o u s ngoặc đơn N ế u k h ô n g thì biểu thức ! - ab sẽ khỏnsr đ ọ c đánh s i á chính x á c nil biếu thức 1 - tích đ iể m ta, b.)
vị X, là một tổ hợp tuyến tính của vóc tơ p, PQ và PR
X = p + □ I PQ - I 2 P R ( Ũ \ , Z 2 là s ố thực)
14
Trang 17Đ c khứ đ ợ c »ham sỏ' z I và 1 2 don ciàn c h ú n g ta chi cấn nhãn phơn g trình
v é c iơ với v é c i ơ c h u ẩ n II = PQ * PR, nh vậy từ p h ơ n g trình 6 c h ú n g ta c ó dọc phơng trình th am s ố lự d o (hay còn cọi là hàm ẩn ) cun mậi phẩnỉ» I1X = np = c = hang s ố
H a n g s ỏ c s ẽ van phụ thuộc vào độ dài c ù a v é c t ơ ch u ẩn , m à lần lợi trous;
k liỏng gian c h ứ k h ô n g phải trên mậi phàng P Q R , c h ứ n g ta mặt khác nhau cua mặt ph àng nếu d ấu (nt I - c) # dấu (m 2 - c) ( 1 0 )
H a m sau lí c h v é c lơ định vị và h ă n s s ố cùa mặt p h ả n g d ợ c tạo bơi 3 diom
{/* bái đáu m ặ t p h ả n g - hảng s ố ( ) *
Trang 18V é c t ơ pụ pr / Iihng NCCÍƯ kh;ic nhau PQ và P R :i:'
g h i véctư :n = (vcctư ‘ 1 pqr I ciiuau:
C h ú n g ta c ỏ t h e chuán hoá m ỗi đ iếm khác k h ò i i i ỉ của véc l ơ d c ò n g h ĩ a l à
V,-lì ú n g ta định tý lộ véc lơ đ e chi ¿11 dài của nó là [
Thú lúc c o n A C đối vứi v iệ c cluián lioá véc tơ cu the s c nil sau:
fr d e fin e EPS 1 c - 7 [ Z M acros.h j
/ * Con s ố rất nh ỏ nil y rất c ó ích * /
# d e fin e dò dài (a) s p Z t (tích d ie m ) (x, a)) ( Z M acros.h )
void chuun hod vccti ( V )
v e c tơ v; Z * c o n lró ũ địa c h ì z nội clung c ủ a V s c [hay đ ố i ! * /
lie'll (c h iề u dài <EPS) Ị
print f ("khủng ihc cluiấn lioá v ó c t ư V )
Q uay trư lại,
Ị V [xj = c h i ê u ù ù i ; v ị Y Ị / = e h i u i i d à i ; V [zị / = c h i c u d à i ;
} / X k ẽ l t h ú c c l u K i i i l i o á v ó c l ơ { ) ' /
16
Trang 19Lán này s ẽ c ó hiệu qua nếu iih ta sừ dụng hàm s ố thay ch o sử dụng Macro, bởi vì ch ú n g ta c ó thể sử dụng một biến thanh ghi trong một s ố lần Bạn sẽ nhận thấv rằng đối với hàm s ố này ta không cần phái viế t ( V; ihay vì viết V Đ o i với
bộ biến dịch, biến V chính là con trò chỉ ó' điểm nháy N h ữ n g thành phán CĨK1 véc tơ thay đổi k h i ch o n g trình rời thú tục COI1 (điều nàv k h ò n g xảy ra đổi với Iròìig hợp khi biến k h ỏ n s phủi là con trỏ).
Với sự trợ g iú p cùa véctơ chuẩn hoa, ch ú n g ta c ó thể đo k h o à ng cách trên đờng đợc da ra V í dụ, nếu ta muốn c ó đợc m ột đ iể m R trên đờng thẳng PQ với khoảng cách đ tính từ đ iếm p, điểm này c ó thể d ẻ d à n g đợc xác định qua phony trình sau.
r = p + d ( P Q ) v ; (13)
tại phono trình này ( PQ)o c ó đợc là do chuẩn h o á PQ.
N hữ ng véc tơ cluũin hoá cũng là chìa khoá d e đ o g ó c tron« không «um Nci;
la muốn do yóc II ííiữa hai cạnh PQ và PR Irons hình 2 ch ú n g ta đoìi tỉián chi cần chuẩn hoá v é c lơ d = PQ và e = PR
và tính tích đ iểm của chúng dể ùm đợc COS cùa g ó c I :
k h ông thì những lủ m s ố nh vậy s ẽ mất nhiều thời g ia n hơn những điều hành thuật toán và rất m ay mắn là ta c ó thể thờng xu y ên tránh dọc những hàm sứ này M ột v í dụ là luaatj COS của lambcrt, nói rằng sự s á n g củ a đa giác (mặt phảng của đối tợng mà ta định tạo) chủ yểu là phụ th u ộ c vào COS cúa g ó c c ù a những tia sáng tới T uy vậy chúng ta s ẽ thực hiện nlì sau:
Trớc khi bắt đáu vẽ, chúng ta xác định và chuẩn h o á những véctơ tiêu cluian của tất cà cá c mặt phẳnơ Cos của cá c g ó c cùa c á c mặt tới tong đ o n g với tích
Trang 20ciicm củ a v é c tơ tiêu ch u ẩn hoả và tia s á n g chuẩn hoá T u y nhiên, chính g ó c đó
k h ô n g đợc tính bời vì d o luật cùa lambert T h e o cách này, c h ú n s ta c ó thể tránh
X = 2 + I A B và mặt phảng đợc xác định bòi phong trình ẩn
I1X = c (Ta phát triển thú tục c o n đõ’ c ó dọc nhỡn« g iá trị c ủ a II và c) Đ ic m
g i a o nhau s đã thoà mãn c à hai điểu kiện, và ta c ó II (n + Ũ A B ) = c T uy nhiên,
g iá trị tham s ố đ ố i với s là:
H ã y x em lại m ã n g u ồ n của hàm s ố c tơ n s ứna:
Trang 217 Trolls' c khoiiiz CO lo;ii Bool đơc xá c dinh, loai biến c o thể tiếp c ậ n nhanh
nho nhất ià char, ma c ỏ ihc cú g iá trị từ - 12S đ ến + 1 27 Sẽ k h ô n g co dụ đoan nào trớc nếu nh bạn ổn định m ọt s ó tuV ý c h o b iế n Bool T u v v ậ y , ta s ẽ c h i ấn
định T R U E và F A L S E Hai g iá trị này phủi d ạ c x á c định lại.
void se c t - lin e - nad - plane (s, I , đ ò n g s o n g s o n g , a, ab, p) (proto.h)
vecco’ X 5 / * đ iể m car nhau * /
lhanh ghi ploat (n h áy) * I ; / * tliam s ố c ủ a d ie m cat nhairV
B o o l* s o n g s o n g
vé c tơ a, ub; / * Đ ié in Irủn d ờ n g tilling, h ớ n5 c ủ a dòìiií thắng */
M ặt pháng * p;
{/* begin s e c t - line - and - plane ( ) * /
thanh ghi v e c tơ *11 = ( v é ctơ *) p z tiêu chuẩn,
/* T ăn g tốc đ ộ macro * /
float II - ab,
n - ab = tích đ iế m ( * 11, ab),
¡1 (Is - Zero (n - abj) Ị
/* H o ặ c là đ ờ n g thắníi trùng vứi m ậi ph áng h o ặ c là s o n g s o n s vứi m ặi phảng * /
# s o n g s o n g = T R U E ,
i f ( I s - z e r o ( l í c h d i e 111 (*11 a j - p I c a s t ) ) * 1 = 0
e lse * I = INFINITE.
Trang 22I clsc[
* SOIIC sont: = FALSE;V V—
* T = i p - C l 1 s t - t i c ' l l d i e m I I - i i b ;
i / * e n d i f ( i.s - Z C I U ( ) )
T ổ hợp Inven lililí (s ;i ab, I j;
Ị /* end s e e l - line - and - plane */
Đ ố i với nhà lập innh c Í! kinh n ch iệm : n ế u ta m u ố n c ó nh ữ nc b ie n I và
s o n s S0112 luỸ V su dụm: licoãi hàm s ỏ , ta phài c h u y ế n chÚMU nh nhữni; bien CUI irò, bơi vì c "iiọi aiá trị" (T ronc lập trình P A S C A L bạn SC phải vi ốt từ khoá VU!'
trớc c á c b iến tron" danh sách dối s ố ) v í dụ, B iến co n tro ptr c h ỉ float đ ợ c khai báo bời float * pir Con trò chì k h ó n c thể bị ih a v đổi trong ham s ố , bòi Vi sụ thay đ ổ i nội d u n c *ptr chính c o n U'ỏ plr sau đ ó s ẽ là địa chì c ù a b iến * pu Con
trỏ chi k h ỏ n s thể bị tha\' đổi irons hàm số, bơi vì s ự thav đối nội d u n e *pi: cu:
I 1Ó c ũ n s s ẽ c ó hiệu qua bẽn naoài.
Khi lính I la phai chắc chán rails k h ỏ n s c ó ch ia c h o k h ỏ u c Đ iổ u dó sẽ xuãt hiên khi hớnu ciớii'- ihànu s o n s s o n s với m ãi p h ă n c ĐỐI với ư ờ n II hop 1 V » V k- w - i .
I sỗ là I h oặc k h ỏ n s xác định, nếu nh đ iể m trẽn đ ỡ n e ih à n s trùnạ v ó i mặ:w W W W phảng N ếu ta dé I = INF IN ITE hoặc 1 = 0 thì "đièm s i a o nhau" s ẽ là m ội
-d iem nào -d ó x a -d ờ n c Ìhãng, hoặc I 1Ó sẽ chính là đ iế m s ố c C ác nhà k h oa h oc \ ò
vi tính thích nhũng s ià i pháp đ ộ c đ á o nh k icu n à y h on là phài phân biệi mọ! Y.i>> irờnc hợp k h á c nhau Dán hiệu s o n s s o n c x u ấ t hiện th èm vào đó đ ế ¿ i úp la biéi
d ạ c kh) nào 1101)2 hợp dãc biệt xiiãi hiện T iẽ p ih e o UI cầ n phải bi Cl iam liiL-iKio
đỏ hai d ờ n c thãns: irons ciin s m ỏi mãi p h à n s c ã t nhau Hai đ ò n 2 IÙ1V c ó nivữni:N- w - ĩ v_ w wpnơns irìah liiam s ỏ nil sau.
Trang 24Ị / * and se c t - line - and - plane ( ) * /
Đ ố i với nhà lập trình c ít kinh nghiệm: nếu ta m uốn c ó nhữ ng biến I và
s o n g s o n s tuỳ ý sir dụ:iỵ Iiso à i hàm số, la phải c h u y ế n ch ú n g nh IÙÙÌÌŨ bien con trỏ, bời vì c "gọi 5 ¡á trị" (Tron 2: lập trình P A S C A L bạn sẽ phài vie: từ khoá var tróc c á c biến tr o u s danh sách đ ố i s ố ) v í dụ, Biến con trò ptr chi fie ai d ọ c khai
b á o bời float * ptr ch ín h con trỏ ptr s~u đó s ẽ là đ ịa chi cùa b iế n :i:ptr Con trỏ
c h ỉ k h ỏ r 2 the bi t h a y đ ổi t r o n g h à m SJ, bơi vì s ự t h a v dổi n ội d u n e * p t r c ú n nó
c ũ n g s ẽ c ó hiệu qu ả bôn n goài.
K h i tính I , ta phải chác c h ắ n rằn: k h ô n g c ó c h ia c h o k h ô n g Đ iề u đ ó sẽ
x u ấ t hiện khi h ớ n g đ ò n g th ẳn g s o n g ¿0112 với mặt phảng Đ ố i vói irờng hợp này
“ s ẽ là c ó hoặc khùng xác đ ịn h , nếu nh đ iểm trên dò'112 thản<z trùnsí với mặt
p h ả n g N ế u ta d ể J = I N F I N I T E ho;'.: □ = 0 thì "điồni s i- 0 nhau" s ẽ là m ộ t
d i ể m nào dó x a đ ờn g thầno, h oặc nó sẽ chính là đ iể m g ốc C á c nhà k h o a học về
v i tính ir.ích nhữ ng «iải pháp đ ộ c đác nlì kiểu này hơn là phải p h in biệt m ột vài
Trang 25trừng hợp k h á c nhau D;'ÚI hiệu soiiịi SOI12 xuất hiện thòm vào dó đ ẽ s i úp ta bicl
d ạ c khi n à o ir ờ n g hợp khác nhau Dấu hiệu s o n g s o n g xuất hiện ihém vào Ticp
th eo ta cẩn phải biết làm thủ' nào đổ hai d ờ n g th ản g irong c ù n g m ột mặt phang cãl nhau Hai đ ờ n g này cu những phong trinh tham sú nil sau:
X 1 = a + ũ d , x 2 = b + L e vói c = t c x , ey, c x ) (1 7 ;
T a c h o hai đ ờ n g cắi nhau b ã n s cá ch viét x l = ,\2 khi t; s o n g s o n s với iruc z ( c x = 0 và e v = 0 ) (và khi đ k h ố n c S O I 1 2 s o n s V Ớ I irục Z ) ta c ó
khi e k h ỏ n s SOI1C s o il” với trục z la nhãn p h ơ n e lrìIXh véc tơ x l = x 2 với véc
lơ n e = í - e y , e x 0 ) đỏ là chu án cùa c, ih e o phơn«; trinh 6 ta c ó
a n e + H d n e = bne
nh v ậ y th am s ố z c ó the dợc xác định
k h i n h ữ n s đ ờ n s s o n s s o n s hoặc trùim nhau, ta c ó J d n e ũ < E PS tron2 irờng
liợp n à y , ta đ ế □ = z , nếu nil đ iểm chi định khác k h ố n g h oặc D = 0, nếu nh
d iê m c h ỉ định b à n g 0.
Đ á y là h à m s ố c đực thực hiện
t v p e d e f flo a t v ec to r 2 [2] ( □ types, h)
/* v c c tơ hai c h iề u ;
# d e fin e su b t - v e c 2 lab a b ) \ ( Z M acr os, h)
( (a b ) [x] = ( b ) [x] - (a) [x], (ab) Lyj = (bj Lyj - (a) LyJ
# d e fin e D o i - product 2 (a, b ) \ ( I M acr os, h)
((a b ) [x] * (b ) [x] + (a) [y]* (b) [y]
# d e fin e lin e a r - c o m b 2 (r, p, pcj e i \ ( Z M acros, h)
Trang 26((n ) [xj = - ( V ) [v], ( in fy] = (v ) [x; i z M a c r o s, h)
v o id intersect - lines Is, z , parallel, a ,d ,b % c, d im ) ( z M a c r o s, h)
float ? [] ;
* Đ i c m s n a o n h a u G i ã i ỉ h í c h l v J o t a i s a o t a c i ù i v c m ô t m a n e c ủ a H o o t i h ; i \
c h o kiêu v c c tơ h a y vóc lo' 2 lù bưi vì hàm s ố IKIV thục hiện d ợ c m à k h ù n g cán bai
c u m ộ t sư thuỵ d ố i nào hủi khi n h ũ n g véctQ' a, b, ừ, c th u ộ c danh s á c h õùi i ò [ạ véc tơ hai ch iêu, ( c a hai v c c tơ và v é c t ơ 2 đ ơ c h ic u nh n h ữ n g COI 1 í ró d ú ;i ¡'loai Chi c ó m ộ t sự k h á c nhau du v nhất g iữ a p h iên bán 2 D vã p h iên ban 3 D l à \ iỌu lính toán cá c d ie m iiiao nhau*/
short dim; /* 2 d hoặc 3 D * /
{/* bắt dầu in tersec t - lines ( ) * /
Trang 27Norm al - vcc * /
Norm al - vec z i n c , e);
d - ne = Dot - p rod u ct z (d, lie);
} / * end if (is - z e r e (d - n e ) ) :it /
} / * end Ì (e, parallel z)) * /
Cị.iay trờ lại FA L SE , h oặc T R U E
Bool interset - s e g m e n t s ( t l , t 2 , p i , q l , p 2 ,p 2 ) (G proto.h)
f loat * 11, * t2;
float p i [], q l []; / * đ o ạ n 1 * /
float p 2 [], q l [], / * đ o ạ n 2 * /
Trang 28H ình 3: Đ ờ n g g ia o nhau c ủ a hai đa 2 Ìác lòi
G ia o nhau giữa hai mặt c ó thể đạt đọc là do giao nhau giữa hai đ ờ n s c ủ a inãt
ph ẳng thứ nhất với mật phắng thứ hai ta kh ông phải tiếp xúc thờne x u y ên vói
n hững m ặt phảng v ô hạn, nling lại phải iiếp xúc vói những đa g iá c nối mặt
p h ẳng, tíi m uốn g iá i q u y ế t m ộ t v ấ n d ề na 7 sinh Đè' đ.i ra hai đa giác loi (.thòne
là ba g ó c và bốn cạ n h ), cát nhau nil iror.2 hình 3, ta piiái tìm các đ iếm g ố c s! và
V ớ i m ột dờng g ia o nhau hiện c ó nh vậy, ta s ẽ luôn c ó khả n ã n s ùm đực
ch ín h x á c hai cạnh c ủ a đa g iá c đáu tiên cắc mật p h ẳ n s chứa đa g iá c thứ hai Có thể ơ o i hai đ iểm ạ ia o nhau là T I và T2.
c ó thể dùng p h o n g trình tham s ố sau để diễn ià đờiig nối ch ím ?
26
Trang 29X = 11 + - (t2 - r I) ( _i là s ố thực) ( 2 ! )
Đ iế m T I tơng ứng với g iá trị tham s ố □ = 0 , đ i ể m T 2 tơ n g ứng với g i á trị I
= l B â v g i ờ ta x á c định c á c cạnh c ù a đa g iá c thứ hai, c á c đ ỉn h c ủ a nó nằm trên
•oác c ạ n h k h á c n h a u c ù a m ậ t p h ả n g x á c đ ị n h b ờ i đ a g i á c t h ứ nhác, v à c h ú n g c á c h
c ạ n h T I T 2
N h ữ n g đ iế m g ia o nhau này g ọ i là u l v à u2, và c h ú n g th u ộc vồ g iá trị hai
ih a m s ố c 1 và ~ 2 Cuối c ù n g ta sửa d ổ i những g iá trị này
s ig n ( D o t - product, ((palne) norm al, pvint) - (p la n e ), cn st)
B o o l se c t - p olip s (se c tio n , 111, poly 1, n2, p o lỵ 2 ) (C M acro, h)
Trang 30{/* bill dâu Bcci - p o lv s ( f ' i
Trang 31Ì (fou nd < 2)
return F A L SE ; / * k h ô n g c ó dò'112 giao nhau * /
/ * Bây g iờ ta k é o dài đ ờ u g TI T2 c h o cắt cá c cạnh của da giác thứ 2 / plane
- constants ( & p la n e I, poly 1 [0], polv 1 [1], ply 1 [-]);
subt - w et ( p l , p 2 , poly 2 [i], poly 2 [i];
itersect - lin e 1 (s e c tio n , & lam bda, [found ], parallet;
t [0], t l , t2, p o ly 2 [1], p i p2,3;
/* Thav đổi tham s o * /
Đ ố i với những nhà lập trình c ít kinh n g h iệ m ta pliải c h u y ể n đ ổ i s ố mặt phảng 2 nil m ộ t c o n trỏ c h ì a plane Đ iề u này đ ợ c thực hiện bời c h u y ể n địa chỉ cùa nó ( = & p la n e 2).
i f (lam bda [fou nd ] < 0 )
lam bda [fou nd ] = 0
Trang 32linear - c o m b (section [0], t [0], t l t2, lambda [0],
linear - c o m b (sectio n [0], t [0], tl t2, lam bda [0],
linear - co m b (sectio n [1], Ĩ [0], tl t2, lam bda [1],
Trang 33c rất linh hoạt trong việc khai báo c u a ca c b iến , đ ỏ i khi c h ư n 2 trinh iro licit
J e đ ọ c hơn khi c á c bien dợc cán c h i ơ trong những v ò n g lập nhu v.v ùọc khai báo mút c á c h c ụ c bỏ T uy nhiên, những biến nh \'ậv k h ó n s thế s ư đ ụ n g đực
¡ i h n i n n i i Z b i e n t h a i i i i l l a l l i
void translate - pool ( I I p ool, traue) ( I Proio.il)
short 11; / * s o lo n g d iem dơc tịnh lien */
vectỏ * p ool, /* tủ loạ dộ c ó đô lớn tuỳ ý * /
rcclor trails, / :|! v é c tơ tịnh tiến */
{/* bũt dấu transíale - pool ( X*/
register v ecto vec = p ool, * h iv e c = v e c + n;
for (; v e c < hi - v ec, vec + + )
A d d - vcc ( * v e c , * v ec, trails);
} / * kết thúc translate - pool * /
Con trò vcc là con (rò c h i m ột vóccơ, vì v ậ y hi - v e c = v ec + n là một con irỏ
ch i m ộ t v é c tơ m ớ i * hi - vec ờ giữ a v ec và hi - v e c c ó m ộ t k h o ả ng k h ô n g gian
c h o nhữ ng v é c tơ n D o đ ặ c đ iể m định tỷ lộ c ủ a n h ữ n g c o n trỏ trong c [D A R N
88 ] c h ú n g c ó ih ể đ ợ c x á c định nh sau: * v e c = * ( v e c + 0), * ( v e c + L), * ( vec +
2 ) , vàn vân
Hình 4 Sự khác nhau giữ a s ự x á c định (* v e c ) [2] và * v e c [2], nơi m à vec
ch ín h là co n irỏ c h ì một véc tơ.
M ộ i lán nữa, la lại c ỏ một v í du vé m a croo m à rat cán lliiết phái viel cá c dối
su trong n g o ặ c đ o n Troiìii c ( A v c c [2] khùng g i ố n g hệl nil * vec [2] Bộ bien
d ịc h s c dien d ịch bicu thức thứ nhất là (* v c c [2] = * * v e c + 2; c ỏ nghĩa là nh
g iá trị z c ú a v é c lơ * véc.
Bicu thức ill hai SC d ợ c diễn dịch là ( * v c c [2] = ** vcc + 2),
dỏ ch ín h là g iá trị * c ù a v é c to * ( v e c + 2); Đ ổ g iú p bạn c ỏ the liiéu rỏ hưu, hãy x e m mil ill lioạ ứ hình 4 Thuật loán c o n trỏ đ ừ n g iih là inột m a thuật, nhng sau vài lần bail s ẽ phát hiện ra răng dó là m ột trọng những thuật toán hay Iihàt
Trang 34trong c và 11Ó lã n g tốc độ ch ơ n g trình m ộ t cá c h đ á n g imạc nhién N ếu bạn lại
x e m lại hàm s ố trức d ỏ , bạn s ẽ thấv ràng hầu hết tal cá c tính loan dull đợc ihực hiện vưi c á c biến ihanh ghi.
11 * v e c là m ột v é c lơ, c ó n s h ĩa là m ộl c o n trỏ chi float, ** vcc chính là
m ộ t floot!
Sự th ém v à o cá c biên nh vậy c ó the là những c ô n g v iệ c nhanh nhất m à m áy
vi tính c ó the làm đợc K h ô n g c ó m ột 2ỌÌ hàm n à o bời vì Ạ d d - v cc ch ín h 1Ì1
m ộ t m a cro N ê u nh m á y tính cùa bạn c ó khả n ă n g làm v iệ c vói h o n hai bi ến
thanh ghi và nếu nh bạn c ó những VÙI1U lớn đ ể b iế n đói, thì nên t ạ o r a m ội bicìì mới.
register vector * t = (v eciro *) trams;
B â y g i ờ viết:
for (;vec < hi - vec ; v e c + + )
A d d - vec ( * v e c , * v ec, *t);
1.5 Trớc khi nói vồ phép quay tron 2 k h ô n g s i an c h ú n s lôi m uốn nói đói diéu
v ề p h ép tính m a irận, đ ó là m ộ t cách rất thuận liện đ ế rút ¡]2,ắn những phép lính dài d ò n g và phức lạp, rắc rối T ron ẹ m ụ c này c h ú n g lỏi
c h ỉ đ ề cập tới m a trận 3 x 3 M a trận nh v ặ y là m ộ t m ủ n g g ồ m 9 s ố ( d ợ c s ọ i
là y ế u tố) thành 3 hàng d ọ c và 3 hàng ngang N h ữ n g y ế u tố thuộc hàiìíỊ n«anu
c ó thể đ ợ c diễn dịch nh m ộ t v e c tơ v é c tơ hàng n g a n g *).
H ã y đ é A và B là hai m a trận 3 x 3 :
T íc h c á c m a trận d ọ c xác định nh sau:
A B = c = (cik ) với cik = a io b o k + a i l b l k + a i2 b 2 k ( 2 4 )
ch ú V rằn 2 A B □ B A T íc h c ủ a m ột v é c 10' V = (x x , v y , \’z ) và m ộl m a irận A
d ợ c x á c dinh nh m ột v cc tơ m ói r:
lu V thứ lự c ù a cá c loán h ạ n s trong phép nhãn T r o n é rá; nii iéu sacn ( d ạ c
biiịl lá sá ch cua cá c nóc cháu áu) v é c 10' cột d ọ c ihờiig d ợc ciimg thay thê cho
v e c tơ h à n c n g a n g và thứ tự đ ợ c c h u y ến n g ợ c lại ( A v thay ch o V A ) Tro nu
irờnc hợp Iiay m a irặn A phài đợc c h u y ên vị ihànlì m ộ i m a irận A T ( p h ơ i lí; trinh
32
Trang 352 6 ) , c ó nghĩa là, cá c yếu t ố cua nó đợc phàn ánh b ở i c á i g ọ i là m ain diagonal ( clờng c h é o chính
M ỗ i m ộ t phép quay trong k h ô n g gian qu a’, quanh m ột trực ch ạy qua điểm
g ố c vứi m ột g ó c t j ỳ ý c ó ihổ dợc m ỏ tả b ò i mn trận trực g iao hoặc m a trận
q u a y , n h ữ n g véc 10 h à n g n g a n g c ù a n ii ữ nu m: trộn nil vậv đ ề u đ ọ c c h u ẩ n h o á v à
Irực g ia o pairwse Tích c ù a hai m a trụa quay cũng là m ộ t m a trận quav.
D o dặc biệt cùa ma trận quay, ta c ó m a trộn đ à o c ủ a nó nh sau:
N ố u nh A là m ột m a trận quay m iêu tà đọc phép o u a y trong k h ô n s gian
q u a y q u a n h trục a với m ộ t s ó c J , thì m a trận đ à o c ủ a nó sẽ lạo ra đ ợ c m ộ t p h é p
q u a y c ũ n g q u a y CTjanh t r ụ c a , n h n s v ớ i m ộ t c ó c n g ợ c l ại - I
H ã y nhìn vào :nã c t o n s ứns Tróc lien ta xác đ ịn h một kiểu mới:
M ột thủ tục cc:i đối với phép nhân m a trận có thể sẽ g iố n g nh sau void r.mtri
* - mult (c, n, b)
not - mairi * c n, b, 12
( / * bắt đầu mntri * - m ult ( ) * /
register short i.j ;