Giáo trình Lý thuyết đồ họa

MỤC LỤC

Chương 1: CÁC YẾU TỐ CƠ SỞ CỦA ĐỒ HỌA

1.1. Tổng quan về đồ họa máy tính . 1

1.1.1. Giới thiệu về đồ họa máy tính . 1

1.1.2. Các kỹ thuật đồ họa . 1

1.1.2.1. Kỹ thuật đồ họa điểm. 1

1.1.2.2. Kỹ thuật đồ họa vector. 2

1.1.3. Ứng dụng của đồ họa máy tính. 2

1.1.4. Các lĩnh vực của đồ họa máy tính . 3

1.1.5. Tổng quan về một hệ đồ họa . 4

1.2. Màn hình đồ họa . 6

1.3. Các khái niệm. 6

1.3.1. Điểm. 6

1.3.2. Các biểu diễn tọa độ . 8

1.3.3. Đoạn thẳng. 8

1.4. Các thuật toán vẽ đoạn thẳng. 8

1.4.1. Bài toán . 8

1.4.2. Thuật toán DDA. 9

1.4.3. Thuật toán Bresenham . 10

1.4.4. Thuật toán MidPoint . 12

1.5. Thuật toán vẽ đường tròn. 14

1.5.1. Thuật toán Bresenham . 14

1.5.2. Thuật toán MidPoint . 16

1.6. Thuật toán vẽ Ellipse. 17

1.6.1. Thuật toán Bresenham . 17

1.6.2. Thuật toán MidPoint . 20

1.7. Phương pháp vẽ đồ thị hàm số . 21

Bài tập. 23

Chương 2: TÔ MÀU

2.1. Giới thiệu các hệ màu. 25

2.2. Các thuật toán tô màu . 28

2.2.1. Bài toán . 28

2.2.2. Thuật toán xác định P S . 28

2.2.3. Thuật toán tô màu theo dòng quét . 30

2.2.4. Thuật toán tô màu theo vết dầu loang. 30

Bài tập

pdf146 trang | Chia sẻ: lethuong715 | Lượt xem: 740 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Giáo trình Lý thuyết đồ họa, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
au ñây là thủ tục vẽ họ ñường cong theo u: 
Procedure HoDuongCongU; 
 Var P: ToaDo3D; 
 u,v,du,dv:Real; 
Begin 
 u:=UMin; du:=0.05; dv:=0.05; 
 While u<=UMax do 
 Begin 
v:=Vmin; 
P.x:=fx(u,v); 
P.y:=fy(u,v); 
P.z:=fz(u,v); 
DiDen(P); { ði ñến ñiểm xuất phát ban ñầu } 
While v<=VMax do 
 Begin 
v:=v+dv; 
P.x:=fx(u,v); 
P.y:=fy(u,v); 
P.z:=fz(u,v); 
VeDen(P); { Vẽ ñến ñiểm mới } 
 End; 
u:=u + du; 
 End; 
End; 
Tương tự, ta có thể vẽ họ ñường cong theo v. 
Chương V. Biểu diễn các ñối tượng ba chiều 
68 
TÓM LẠI: Muốn vẽ một mặt cong, ta thực hiện các bước sau 
• Nhập các hệ số của phương trình mặt: a, b, c, d, Umin, Umax, Vmin, Vmax. 
• Tính các hàm 2 biến: X(u,v), Y(u,v), Z(u,v). 
• Khởi tạo phép chiếu: Song song/Phối cảnh. 
• Vẽ họ ñường cong u. 
 Vẽ họ ñường cong v. 
BÀI TẬP 
1. Hãy xây dựng một cấu trúc dữ liệu ñể lưu trữ mô hình WireFrame. 
2. Tạo file text ñể lưu các ñỉnh và cạnh của một vật thể trong không gian 3D theo mô 
hình WireFrame với cấu trúc như sau: 
 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. 
 m dòng tiếp theo, mỗi dòng lưu tọa ñộ x, y, z của từng ñỉnh trong mô hình. 
 n dòng tiếp theo, mỗi dòng lưu hai số nguyên là ñỉnh ñầu và ñỉnh cuối của từng 
cạnh trong mô hình. 
3. Viết thủ tục ñể ñọc các giá trị trong file text lưu vào mô hình WireFrame. 
4. Viết thủ tục ñể vẽ vật thể từ mô hình WireFrame. 
5. 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. 
6. 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... 
CHƯƠNG VI 
THIẾT KẾ ðƯỜNG VÀ MẶT CONG 
BEZIER VÀ B-SPLINE 
Khác với những phương pháp biểu diễn mặt và ñường bởi các công thức toán học 
tường minh, ở ñây ta sẽ bàn ñến các công cụ cho phép chỉ ra các dạng ñường và mặt 
khác nhau dựa trên các dữ liệu. 
ðiều này có nghĩa là với một ñường cong cho trước mà ta chưa xác ñịnh ñược công 
thức toán học của nó thì làm thế nào ñể có thể nắm bắt ñược dạng của ñường cong ñó 
một cách tương ñối chính xác qua việc sử dụng một tập nhỏ các ñiểm P0 , P1 ,... cùng 
với một phương pháp nội suy nào ñó từ tập ñiểm này ñể tạo ra ñường cong mong 
muốn với một ñộ chính xác cho phép. 
Có nhiều cách ñể nắm bắt ñược ñường cong cho trước, chẳng hạn: 
• Lấy một mẫu ñường cong chừng vài chục ñiểm cách nhau tương ñối ngắn rồi 
tìm một hàm toán học và chỉnh hàm này sao cho nó ñi qua các ñiểm này và 
khớp với ñường cong ban ñầu. Khi ñó, ta có ñược công thức của ñường và dùng 
nó ñể vẽ lại ñường cong. 
• Cách khác là dùng một tập các ñiểm kiểm soát và dùng một thuật toán ñể xây 
dựng nên một ñường cong của riêng nó dựa trên các ñiểm này. Có thể ñường 
cong ban ñầu và ñường cong tạo ra không khớp nhau lắm, khi ñó ta có thể di 
chuyển một vài ñiểm kiểm soát và lúc này thuật toán lại phát sinh một ñường 
cong mới dựa trên tập ñiểm kiểm soát mới. Tiến trình này lặp lại cho ñến khi 
ñường cong tạo ra khớp với ñường cong ban ñầu. 
Ở ñây, ta sẽ tiếp cận vấn ñề theo phương pháp thứ hai, dùng ñến các ñường cong 
Bezier và B-Spline ñể tạo các ñường và mặt. 
Giả sử một ñiểm trong không gian ñược biểu diễn dưới dạng vector tham số p(t). 
Với các ñường cong 2D, p(t) = (x(t), y(t)) và các ñường 3D, p(t) = (x(t), y(t), z(t)). 
6.1. ðƯỜNG CONG BEZIER VÀ MẶT BEZIER 
6.1.1. Thuật toán Casteljau 
Chương VI. Thiết kế ñường cong và mặt cong Bezier và B-Spline 
70 
ðể xây dựng ñường cong p(t), ta dựa trên một dãy các ñiểm cho trước rồi tạo ra giá 
trị p(t) ứng với mỗi giá trị t nào ñó. Việc thay ñổi các ñiểm này sẽ làm thay ñổi dạng 
của ñường cong. Phương pháp này tạo ra ñường cong dựa trên một dãy các bước nội 
suy tuyến tính hay nội suy khoảng giữa (In-Betweening). 
Ví dụ: Với 3 ñiểm P0 , P1 , P2 ta có thể xây dựng một Parabol nội suy từ 3 ñiểm này 
bằng cách chọn một giá trị t ∈ [0, 1] nào ñó rồi chia ñoạn P0P1 theo tỉ lệ t, ta ñược 
ñiểm P01 trên P0P1 . Tương tự, ta chia tiếp P1P2 cũng theo tỉ lệ t, ta ñược P11 . Nối P01 
và P11 , lại lấy ñiểm trên P01P11 chia theo tỉ lệ t, ta ñược P02. 
Với cách làm này, ta sẽ lấy những giá trị t khác ∈ [0, 1] thì sẽ ñược tập ñiểm P02. 
ðó chính là ñường cong p(t). 
Ta biểu diễn bằng phương trình: 
P01(t) = (1-t).P0 + t.P1 (1) 
P11(t) = (1-t).P1 + t.P2 (2) 
P02(t) = (1-t).P01 + t.P11 (3) 
Thay (1), (2) vào (3) ta ñược: 
P(t) = P02(t) = (1-t)2.P0 + 2t.(1-t).P1 + t2.P2 
ðây là một ñường cong bậc 2 theo t nên nó là một Parabol. 
Tổng quát hóa ta có thuật toán Casteljau cho (L+1) ñiểm: 
Giả sử ta có tập ñiểm: P0, P1, P2, ..., PL 
Với mỗi giá trị t cho trước, ta tạo ra ñiểm Pir(t) ở thế hệ thứ r, từ thế hệ thứ (r - 1) 
trước ñó, ta có: 
Pir(t) = (1-t).Pir-1(t) + t.Pi+1r-1(t) (3’) 
r = 0,1,...,L và i = 0,...,L-r 
Thế hệ cuối cùng P0L (t) ñược gọi là ñường cong Bezier của các ñiểm P0,P1 ,P2,...,PL 
Các ñiểm Pi , i=0,1,...,L ñược gọi là các ñiểm kiểm soát hay các ñiểm Bezier. 
ða giác tạo bởi các ñiểm kiểm soát này gọi là ña giác kiểm soát hay ña giác Bezier. 
6.1.2. Dạng Bernstein của các ñường cong Bezier 
ðường cong Bezier dựa trên (L+1) ñiểm kiểm soát P0 ,P1 , ...,PL ñược cho bởi công 
thức: 
 P(t) = 
k
L
=
∑
0
Pk.BkL(t) 
Chương VI. Thiết kế ñường cong và mặt cong Bezier và B-Spline 
71 
Trong ñó, P(t) là một ñiểm trong mặt phẳng hoặc trong không gian. 
BkL(t) ñược gọi là ña thức Bernstein, ñược cho bởi công thức: 
 BkL(t) = Lk L k
!
!( )!− (1-t)
L-k
.tk với L ≥ k 
Mỗi ña thức Bernstein có bậc là L. Thông thường ta còn gọi các BkL(t) là các hàm 
trộn (blending function). 
Tương tự, ñối với mặt Bezier ta có phương trình sau: 
 P(u,v) = 
i
M
=
∑
0 i
L
=
∑
0
Pi,k.BiM(u).BkL(v) 
Trong trường hợp này, khối ña diện kiểm soát sẽ có (M+1).(L+1) ñỉnh. 
 ðường cong Bezier bậc 2 ðường cong Bezier bậc 3 
Hình 6.1 
6.1.3. Dạng biểu diễn ma trận của ñường Bezier 
ðể thích hợp cho việc xử lý trên máy tính, ta biểu diễn hai mảng BL(t) và P như 
sau: 
 BL(t) = (B0L(t), B1L(t), ..., BLL(t)) 
 P = (P0 ,P1 , ...,PL ) 
Do ñó: P(t) = BL(t).P (tích vô hướng) 
hay P(t) = BL(t).PT (PT là dạng chuyển vị của P) 
Dưới dạng ña thức, có thể biểu diễn BkL(t) như sau: 
 BkL(t) = a0 + a1.t + a2.t2 + ... + aL.tL = (t0,t1,...,tL).(a0 ,a1 ,...,aL) 
Do ñó P(t) có thể biểu diễn lại như sau: 
 P(t) = PowL(t).BezL.PT 
Với: 
• PowL(t) = (t0,t1,...,tL) 
P1
1 
P1 
P0
1 
P1 
P0
2 
P2 
Chương VI. Thiết kế ñường cong và mặt cong Bezier và B-Spline 
72 
• BezL là ma trận biểu diễn mảng BL(t) trong ñó mỗi hàng i của ma trận ứng với 
các hệ số tương ứng (a0 ,a1 ,...,aL) của ña thức BiL(t) và tại vị trí (i,j) trong ma trận BezL 
có giá trị BezL(i,j) = (-1)j-i.Cni.Cij 
 Ví dụ: Ma trận Bez3 cho các ñường Bezier bậc 3 
 Bez3 = 
1 0 0 0
3 3 0 0
3 6 3 0
1 3 3 1
−
−
− −












6.1.4. Tạo và vẽ các ñường Bezier 
ðể tạo ra một ñường cong Bezier từ một dãy các ñiểm kiểm soát ta sẽ áp dụng 
phương pháp lấy mẫu hàm p(t) ở các giá trị cách ñều nhau của tham số t, ví dụ có thể 
lấy ti = i/N, i=0,1,...,N. Khi ñó ta sẽ ñược các ñiểm P(ti) từ công thức Bezier. 
Nối các ñiểm này bằng các ñoạn thẳng ta sẽ ñược ñường cong Bezier gần ñúng. ðể 
tính P(ti) ta có thể áp dụng ma trận của P(t) ở trên trong ñó chỉ có thành phần PowL(ti) 
là thay ñổi, còn tích BezL.PT với P = (P0 ,P1 , ...,PL ) là không thay ñổi. 
Sau ñây là thủ tục minh họa việc vẽ ñường cong Bezier trong mặt phẳng: 
Type Mang = array[0..50] of PointType; 
function tich(x,y:word):real; 
 var s:real;i:word; 
 begin 
 if y<=1 then tich:=1 
 else begin 
 s:=1; 
 for i:=x to y do s:=s*i; 
 tich:=s; 
 end; 
 end; 
function CLK(l,k:word):real; 
 begin 
 CLk:=tich(k+1,l)/tich(1,l-k); 
 end; 
function Xmu(x:real;mu:word):real; 
Chương VI. Thiết kế ñường cong và mặt cong Bezier và B-Spline 
73 
 var i:word;s:real; 
 begin 
 if mu=0 then s:=1 
 else begin 
 s:=1; 
 for i:=1 to mu do s:=s*x; 
 end; 
 Xmu:=s; 
 end; 
function BKL(t:real;l,k:word):real; 
 begin 
 BKL:=CLK(l,k)*xmu(1-t,l-k)*xmu(t,k); 
 end; 
procedure Pt(t:real;L:word;A:Mang;var diem:PointType); 
 var k:word;s,x,y:real; 
 begin 
 x:=0; y:=0; 
 for k:=0 to L do 
 begin 
 s:=BKL(t,l,k); 
 x:=x+A[k].x*s; 
 y:=y+A[k].y*s; 
 end; 
 diem.x:=round(x); 
 diem.y:=round(y); 
 end; 
procedure Vebezier(A:Mang;L:integer); 
 var i,SoDiem:word; Diem:PointType; 
 dx,x:real; 
begin 
sodiem:=100; 
 dx:=1/sodiem; 
Chương VI. Thiết kế ñường cong và mặt cong Bezier và B-Spline 
74 
 x:=0; 
 if L>0 then 
 begin 
 for i:=1 to sodiem+1 do 
 begin 
 Pt(x,L,A,Diem); 
 if i=1 then moveto(round(diem.x),round(diem.y)) 
 else lineto(round(diem.x),round(diem.y)); 
 x:=x+dx; 
 end; 
 end 
end; 
6.1.5. Các tính chất của ñường cong Bezier 
i/ Nội suy ñược các ñiểm ñầu và cuối. 
Chứng minh: 
 Ta có: P(t) = 
k
L
=
∑
0
Pk.BkL(t) 
 Do ñó P(0) = 
k
L
=
∑
0
Pk.BkL(0) 
 trong ñó: BkL(0) = Lk L k
!
!( )!− (1-0)
L-k
.0k ∀k ≠ 0 và k ≠ L 
 = 
L
k L k
!
!( )!− .0 = 0 
 Vì vậy, P(0) = P0.B0L(0) + PL.BLL(0) 
 = P0 + 0 = P0 
 Lý luận tương tự cho P(1). Ta có P(1) = PL. 
ii/ Tính bất biến Affine: 
Khi biến ñổi một ñường cong Bezier, ta không cần biến ñổi mọi ñiểm trên ñường 
cong một cách riêng rẻ mà chỉ cần biến ñổi các ñiểm kiểm soát của ñường cong ñó rồi 
sử dụng công thức Bernstein ñể tái tạo lại ñường cong Bezier ñã ñược biến ñổi. 
Chứng minh: 
 Giả sử ñiểm P(t) biến ñổi Affine thành P’(t) 
Chương VI. Thiết kế ñường cong và mặt cong Bezier và B-Spline 
75 
 P’(t) = P(t).N + tr = 
k
L
=
∑
0
Pk.BkL(t).N + tr 
 Trong ñó: 
 N: ma trận biến ñổi. 
 tr: vector tịnh tiến. 
 Xét ñường cong 
k
L
=
∑
0
(Pk.N + tr).BkL(t) (*) 
ñược tạo ra bằng cách biến ñổi Affine các vector Pk. Ta sẽ chứng minh ñường cong 
này chính là P’(t). 
 Khai triển (*) ta có: 
k
L
=
∑
0
Pk.N.BkL(t) + 
k
L
=
∑
0
tr.BkL(t) 
 = 
k
L
=
∑
0
Pk.N.BkL(t) + tr.
k
L
=
∑
0
BkL(t) (**) 
 Nh

File đính kèm:

  • pdfLyThuyetDoHoa.pdf