MỤC LỤC
Trong cỏc hệ thống ủồ họa, cỏc ủoạn thẳng ủược biểu thị bởi việc “tụ” ủoạn thẳng bắt ủầu từ ủiểm ủầu mỳt này kộo dài cho ủến khi gặp ủiểm ủầu mỳt kia.
Xột ủường thẳng cú hệ số gúc 0<m≤1(giả sử ủiểm ủầu A nằm bờn trỏi và ủiểm cuối B nằm bên phải).
Chỉ cú sự khỏc biệt ở ủõy là ta phải vẽ 2 nhỏnh: Một nhỏnh từ trờn xuống và một nhỏnh từ dưới lờn và 2 nhỏnh này sẽ gặp nhau tại ủiểm mà ở ủú hệ số gúc của tiếp tuyến với Ellipse = -1 (Hình 1.7).
Viết thủ tục LineRel(dx,dy:Integer); ủể vẽ ủoạn thẳng từ vị trớ hiện thời ủến ủiểm mới cỏch ủiểm hiện thời một khoảng theo trục x là dx và theo trục y là dy. Viết thủ tục DrawPoly(P:Array; n:Byte; xc,yc,R:Word); ủể vẽ một ủa giỏc ủều cú n ủỉnh lưu trong mảng P nội tiếp trong ủường trũn tõm (xc,yc) bỏn kớnh R.
Hệ màu này ủược ứng dụng trong truyền hỡnh màu băng tần rộng tại Mỹ, do ủú nú cú mối quan hệ chặt chẽ với màn hỡnh raster. Mụ hỡnh màu này cũn ủược gọi là hệ HSB với B là Brightness (ủộ sỏng) dựa trờn cơ sở nền tảng trực giỏc về tụng màu, sắc ủộ và sắc thỏi mỹ thuật (Hỡnh 2.2).
Viết thủ tục FillSector(x,y,Rx,Ry,g1,g2:Integer; color:Byte); ủể tụ màu hỡnh quạt Ellipse cú tõm (x,y), bỏn kớnh theo hai trục là Rx và Ry, gúc bắt ủầu là g1 và gúc kết thúc là g2. Viết thủ tục Donut(x,y,Rmin,Rmax:Integer; color:Byte); ủể tụ màu hỡnh vành khăn cú tõm (x,y) và bỏn kớnh hai ủường trũn tương ứng là Rmin và Rmax.
Khi cạnh của vùng hình chữ nhật tạo với trục hoành một góc αααα∈∈∈∈(0,ΠΠΠΠ/2) Ta dựng phộp quay trục tọa ủộ ủể ủưa bài toỏn về trường hợp cỏc cạnh của hỡnh chữ nhật song song với cỏc trục tọa ủộ (hỡnh 3.3). Nếu trong dóy cỏc ủỉnh mới này cú hai ủỉnh liờn tiếp khụng nằm trờn cựng một cạnh của hỡnh chữ nhật , giả sử hai ủỉnh ủú là Bi và Bi+1 thỡ ta ủi dọc cỏc cạnh của hỡnh chữ nhật từ Bi ủến Bi+1 ủể tỡm tất cả cỏc ủỉnh của hỡnh chữ nhật nằm trong ủa giỏc rồi bổ sung chúng vào giữa Bi và Bj.
Vỡ vậy, tất cả cỏc phộp biến ủổi trong khụng gian ủều ủược biểu diễn bởi cỏc ma trận vuụng 4x4 (Ma trận Homogen). Ta nhận thấy rằng, nếu phộp quay quay quanh một trục nào ủú thỡ tọa ủộ của vật thể tại trục ủú sẽ khụng thay ủổi. Người ta chứng minh ủược rằng: Tất cả cỏc ma trận của cỏc phộp biến ủổi ủó nờu ở trờn ủều cú ma trận nghịch ủảo.
Nếu dựng hệ tọa ủộ cầu ủể ủịnh vị mắt của người quan sỏt thỡ ta dễ dàng thay ủổi gúc ngắm bằng cỏch thay ủổi gúc θθθθ và ΦΦΦΦ. Trong bước này, ta phải ủổi hướng trục X3 bằng cỏch ủổi dấu cỏc phần tử của cột X.
Dũng ủầu tiờn chứa hai số nguyờn m, n dựng ủể lưu số ủỉnh và số cạnh của mụ hình. Viết thủ tục ủể ủọc cỏc giỏ trị trong file text lưu vào mụ hỡnh WireFrame. Viết chương trỡnh biểu diễn cỏc khối ủa diện sau: Tứ diện ủều, Khối lập phương, Bỏt diện ủều, Thập nhị diện ủều, Nhị thập diện ủều.
Viết chương trỡnh ủể mụ phỏng cỏc mặt toỏn học: yờn ngựa, mặt cầu, hỡnh xuyến.
Khi cài ủặt cho một ứng dụng cụ thỡ việc sử dụng mảng cố ủịnh cú thể gõy ra cỏc trở ngại về kớch thước tối ủa hay tối thiểu, cũng như việc sử dụng bộ nhớ khụng tối ưu. Vỡ thế ngoài cỏch dựng mảng cố ủịnh, ta cú thể dựng mảng ủộng trong một số ngụn ngữ như Visual Basic, Delphi hay Visual C++,… hoặc dùng cấu trúc danh sách móc nối. Song song với ủiều ủú là việc bớt ủi hay ủưa thờm cỏc thuộc tớnh cần thiết ủể biểu diễn cỏc ủặc tớnh khỏc của mặt hay của ủối tượng.
Khi thể hiện vật thể 3D, một vấn ủề nảy sinh là làm sao chỉ thể hiện cỏc mặt cú thể nhỡn thấy ủược mà khụng thể hiện cỏc mặt khuất phớa sau. Việc một mặt bị khuất hay khụng bị khuất thỡ tuỳ thuộc vào cấu trỳc cỏc mặt của vật thể và vị trớ của ủiểm nhỡn cũng như bối cảnh mà vật thể ủú ủược ủặt vào.
86 Như vậy, thuật giải Depth-Sorting ủược thực hiện một cỏch dễ dàng khi chỳng ta xỏc ủịnh một giỏ trị ủộ sõu (là giỏ trị z trong hệ toạ ủộ quan sỏt) ủại diện cho cả mặt. Khi hai mặt ở trong cựng một khoảng khụng gian về ủộ sõu và hỡnh chiếu của chúng lên mặt phẳng chiếu chồng lên nhau (hay chồng một phần lên nhau). Ngược lại, cú thể xảy ra một trong hai tỡnh huống như hỡnh (7.2) hoặc hỡnh (7.3), ủể xỏc ủịnh ủược ta phải tiếp tục sang bước kiểm tra tiếp theo.
Ngược lại thỡ rừ ràng hai ủa giỏc ủang cắt nhau (như hỡnh 7.2) hoặc chộo vào nhau (hỡnh 7.4), lỳc này chỳng ta phải tiến hành chia nhỏ hai ủa giỏc A và B thành 3 (hoặc 4) ủa giỏc con, ủường chia cắt chớnh là ủường giao cắt của 2 ủa giỏc. Ta sẽ tớnh gúc giữa vộc tơ hướng nhỡn V và phỏp vector N của mặt, nếu góc này là lớn hơn 90o thì mặt là không nhìn thấy (bị khuất), ngược lại thì mặt là khả kiến.
Trong cụng thức trờn Cos(θ) bằng tớch vụ hướng của a và n chia cho tớch ủộ lớn của chỳng. Vậy qua cụng thức (8.1) và (8.2) chỳng ta cú thể tớnh ủược cường ủộ của ỏnh sỏng phản xạ trờn bề mặt khi biết ủược cường ủộ của ỏnh sỏng ủịnh hướng cũng như cỏc vector phỏp tuyến của mặt và tia tới.
Nhưng khi nguồn sỏng ủiểm ủược mang ủến gần ủối tượng thỡ cỏc tia sỏng từ nú phỏt ra khụng cũn song song nữa mà ủược toả ra theo mọi hướng theo dạng hỡnh cầu. Vỡ thế, cỏc tia sỏng sẽ rơi xuống cỏc ủiểm trờn bề mặt dưới cỏc gúc khỏc nhau. 110 Từ ủú cường ủộ sỏng tại ủiểm ủang xột sẽ phụ thuộc vào Cos(θ) giữa n và a như ủó trỡnh bày trong phần nguồn sỏng ủịnh hướng.
Vậy với nguồn sỏng ủịnh hướng, chỳng ta cần tớnh tia tới cho mọi ủiểm trờn mặt, từ ủú kết hợp với vector phỏp tuyến của mặt ủể tớnh ủược cường ủộ sỏng tại ủiểm ủú, nếu tính toán trực tiếp thì có thể mất khá nhiều thời gian do phải tính vector a và tính Cos(θ) thụng qua cụng thức (8.1) với tất cả cỏc ủiểm trờn mặt. Nờn nhớ rằng trong tỡnh hướng nguồn sỏng ủiểm thỡ chỳng ta buộc lũng phải tớnh Cos(θ) thụng qua cụng thức (8.1) vỡ vector a sẽ thay ủổi khi mặt hay nguồn sỏng thay ủổi (trừ khi mặt tĩnh, song nếu mặt tĩnh và nguồn sỏng cố ủịnh thỡ suy ra chỳng ta chỉ cần tớnh cường ủộ sỏng một lần).
Bởi thực chất ta cảm nhận ủược ủộ cong của cỏc mặt cong do hiệu ứng ỏnh sỏng khi chiếu lờn mặt, tại cỏc ủiểm trờn mặt cong sẽ cú phỏp vector khỏc nhau nờn sẽ ủún nhận và phản xạ ỏnh sỏng khỏc nhau, từ ủú chỳng ta sẽ cảm nhận ủược cỏc ủộ sáng khác nhau trên cùng một mặt cong. Tuy nhiờn mụ hỡnh Gouraud lại xem một ủa giỏc khụng chỉ cú một vector phỏp tuyến, mà mỗi ủỉnh của mặt ủa giỏc lại cú một vector phỏp tuyến khỏc nhau, và từ vector phỏp tuyến của cỏc ủỉnh chỳng ta sẽ nội suy ra ủược vector phỏp tuyến của từng ủiểm trờn mặt ủa giỏc, từ ủú tớnh ủược cường ủộ sỏng của ủiểm. Dưới ủõy là phần trỡnh bày cỏc thủ tục phục vụ cho việc vẽ ủối tượng 3D ủặc lồi và cong, theo thuật toỏn chọn lọc mặt sau cú tớnh ủến vấn ủề chiếu sỏng của nguồn sỏng xung quanh và nguồn sỏng ủịnh hướng, song mỗi ủa giỏc sẽ ủược tụ búng theo phương pháp Gouraud.
Thủ tục này tương tự như thủ tục tụ ủa giỏc theo thuật toỏn Z-Buffer song thay vỡ nội suy ủộ sõu z của mỗi ủiểm, thỡ thủ tục này sẽ nội suy phỏp vector của mỗi ủiểm, rồi dựa vào phỏp vector của ủiểm ủú mà tớnh ra cường ủộ sỏng mà nú cú ủược do nguồn sỏng ủịnh hướng cung cấp.}. {Cường ủộ sỏng tại mỗi ủiểm ủược tớnh bằng tổng của cường ủộ ỏnh sỏng nền cộng với cường ủộ cú ủược từ nguồn sỏng ủịnh hướng, song ủể tớnh ủược cường ủộ sỏng cú ủược từ nguồn ủịng hướng cung cấp thỡ chỳng ta dựa vào tia tới (Vector_Chieu_Sang) và phỏp vector của ủiểm G[i].Ngiao.}.