CÁC THUẬT TOÁN VẼ ĐƯỜNGGiả sử tọa độ các điểm nguyên sau khi xấp xỉ đối tượng thực lần lượt là ,yi, i = 0,…Đây là các điểm nguyên sẽ được hiện thị trên màn hình.. các mẫu đối tượng tron
Trang 1CÁC THUẬT TOÁN VẼ ĐƯỜNG
Giả sử tọa độ các điểm nguyên sau khi xấp xỉ đối tượng thực lần
lượt là ( ,yi), i = 0,…Đây là các điểm nguyên sẽ được hiện thị trên màn hình
Bài toán đặt ra là nếu biết được ( ,yi) là tọa độ nguyên xác định ở bước thứ i, điểm nguyên tiếp theo (xi+1,yi+1) sẽ được xác định như thế nào
Nhận xét rằng để đối tượng hiện thị trên lưới nguyên được liền nét, các điểm mà (xi+1,yi+1) có thể chịn chỉ có thể là một trong tám điểm được
đánh số từ 1 đến 8 trong hình 2.1 (điểm đen chính là ( ,yi)) Hay nói cách khác (xi+1,yi+1) = (xi ± 1,yi ± 1)
Dáng điệu của đường sẽ cho ta gợi ý khi trọn một trong tám điểm trên Cách trọn các điểm như thế nào sẽ tùy thuộc vào từng thuật toán trên
cơ sở xem xét tới vấn đề tối ưu tốc độ
Hình 3.1 - Các điểm (xi+1,yi+1) có thể chọn ở bước (i+1)
1 Thuật toán vẽ đường thẳng
Xét đoạn thẳng có hệ số góc 0<m<1 và Dx>0
Trang 2Với các đoạn thẳng dạng này, nếu ( ,yi) là điểm đã xác định được ở bước thứ i (điểm màu đen) thì điểm cần chọn (xi+1,yi+1) ở bước thứ (i+1) sẽ
là một trong hai trường hợp như hình vẽ sau:
Hình 3.2 - Các điểm (xi+1,yi+1) chọn ở bước (i+1) cho trường hợp đoạn
thẳng có hệ số góc 0<m<1
Như vậy :
Vấn đề còn lại là cách chọn một trong hai điểm trên như thế nào để
có thể tối ưu về mặt tốc độ
1.1 Thuật toán DDA (Digital Differential Analyzer)
Với thuật toán DDA, việc quyết định chọn yi+1 là yi hay yi +1, dựa vào phương trình của đoạn thẳng y = mx + b Nghĩa là, ta sẽ tính tọa độ của điểm (xi+1,y) thuộc về đoạn thẳng thực Tiếp đó, yi+1 sẽ là giá trị sau khi làm tròn giá trị tung độ y
Như vậy: y = m(xi+1) + b
yi+1 = Round(y)
Trang 3Hình 3.3 - Minh họa thuật toán DDA
Nếu tính trực tiếp giá trị y ở mỗi bước từ phương trình y = mx + b thì ta cần một phép toán nhân và một phép toán cộng số thực Để cải thiện tốc độ, người ta tính giá trị thực của y ở mỗi bước theo cách sau để khử phép tính nhân trên số thực:
Trang 41.2 Thuật toán Bresenham
Ý tưởng chính của thuật toán là hạn chế tối đa các phép toán trên số thực trong thuật toán để tối ưu hóa về mặt tốc độ so với thuật toán DDA
- Phương pháp:
Gọi (xi+1,y) là điểm thuộc đoạn thẳng thực Ta có: y = m(xi + 1) + b.Xét các hiệu khoảng cách của tung độ thực y so với các tung độ nguyên yi và yi+1 để chọn điểm S(xi + 1, yi) hay P(xi+1, yi+1) gần với điểm thực nhất
Trang 5Hình 3.4 - Minh họa thuật toán BresenhamĐặt d1 = y - yi
d2 = (yi + 1) – y
Xét tất cả các vị trí tương đối của y so với yi và yi + 1, việc chọn điểm (xi+1,yi+1) là S hay P phụ thuộc vào việc so sánh d1 và d2 hay dấu của d1 – d2:
• Nếu d1 – d2 < 0, ta sẽ chọn điểm S, tức yi+1 = y
• Ngược lại, nếu d1 – d2 ≥ 0, ta chọn P, tức yi+1 = yi + 1
Xét pi = Dx(d1 – d2) = Dx(2y – 2yi -1)
⇒ pi = Dx[2(m(xi + 1) + b) – 2yi -1]
Thay m = vào phương trình trên ta được
Pi = 2Dyxi – 2Dxyi + c, với c = 2Dy + (2b – 1)Dx
Do Dx > 0 nên dấu của biểu thức d1 – d2 cũng chính là dấu của pi
Ta có:
pi+1 - pi = (2Dyxi+1 – 2Dxyi+1 + c) – (2Dyxi – 2Dxyi + c)
⇔ pi+1 - pi = 2Dy(xi+1 - xi) – 2Dx(yi+1 – yi)
⇔pi+1 - pi = 2Dy - 2Dx(yi+1 – yi), do xi+1 = xi + 1
Từ đây có thể suy ra cách tính pi+1 từ pi như sau:
Trang 6Nếu pi < 0 thì pi+1 = pi + 2Dy do ta chọn yi+1 = yi.
Ngược lại, nếu pi ≥ 0, thì pi+1 = pi + 2Dy – 2Dx do ta chọn yi+1 = yi + 1.Giá trị p0 được tính từ điểm đầu tiên (x0, y0) theo công thức:
P0 = 2Dyx0 – 2Dxy0 + c = 2Dyx0 – 2Dxy0 - (2b – 1)Dx
Do (x0, y0) là điểm nguyên thuộc về đoạn thẳng nên ta có
y0 = mx0 + b = x0 + b Thế vào phương trình trên ta suy ra:
p0 = 2Dy – Dx
Lưu đồ thuật toán Bresenham
Trang 71.3 Thuật toán Midpoint
Thuật toán MidPoint đưa ra cách chọn yi+1 là yi hay yi +1 bằng cách so sánh điểm thực Q (xi +1,y) với điểm MidPoint là trung điểm của S và P Ta có:
• Nếu điểm Q nằm dưới điểm MidPoint, ta chọn S
• Ngược lại nếu điểm Q nằm trên điểm MidPoint ta chọn P
Hình 3.5 - Minh họa thuật toán Midpoint
Ta chọn dạng tổng quát của phương trình đường thẳng:
AX +BY +C=0
Với A= y2 – y1, B= - (x2 –x1), C= x2y1 -x1y2
Đặt F(x,y) =Ax +By +C, ta có nhận xét:
• F(x,y) <0, nếu (x,y) nằm phía trên đường thẳng
• F(x,y) =0, nếu (x,y) thuộc về đường thẳng
• F(x,y) >0, nếu (x,y) nằm phía dưới đường thẳng
Lúc này việc chọn các điểm S, P ở trên được đưa về việc xét dấu của
Trang 8• Nếu Pi <0, điểm MidPoint nằm phía trên đoạn thẳng Lúc này điểm thực Q nằm dưới điểm MidPoint nên ta chọn S, tức là Yi+1 =Yi +1.Mặt khác :
• Pi+1 = Pi +2Dy, nếu Pi <0 do đó ta chọn Yi+1 =yi
• Pi+1 = Pi +2Dy- 2Dx, nếu Pi ≥0 do đó ta chọn Yi+1 =yi+1
Ta tính giá trị P0 ứng với điểm ban đầu (x y0 , 0),với nhận xét rằng là điểm thuộc về đoạn thẳng, tức là có: Ax0 +By0 + =C 0
Trang 9Trong hệ tọa độ Descartes, phương trình đường tròn bán kính R có dạng:
Với tâm O(0,0): x2 + y2 = R2
c c
x x R c
y y Y
θ θ
Hình 3.6 - Đường tròn với các điểm đối xứng
Thuật toán đơn giản
Trang 10- Tại mỗi giá trị x, tính int(y= R2 −X2).
Vẽ điểm (x,y) cùng 7 điểm đối xứng của nó
2.1.Thuật toán xét điểm giữa(MidPoint)
Do tính đối xứng của đường tròn nên ta vẽ được cả đường tròn Thuật toán MidPoint đưa ra cách chọn yi+1 là yi hay yi-1 bằng cách so sánh điểm thực Q (xi+1,y) với điểm giữa MidPoind là trung điểm của S1 và S2 Chọn điểm bắt đầu để vẽ là (0,R) Giả sử (xi, yi) là điểm nguyên đã tìm được ở bước thứ i (xem hình 1.8), thì điểm (xi+1, yi+1) ở bước i+1 là sự lựa chọn giữa S1 và S2
1
1
1 1
i i
i i
i
y Y
y
+ +
• F(x,y) < 0 , nếu điểm (x,y) nằm trong đường tròn
• F(x,y) = 0 , nếu điểm (x,y) nằm trên đường tròn
Trang 11• F(x y, ) > 0, nếu điểm ( )x y, nằm ngoài đường tròn.
Trang 12
2.2.Vẽ đường tròn bằng thuật toán Bresenham
Tương tự thuật toán vẽ đường thẳng Bresenham, các vị trí ứng với các tọa độ nguyên nằm trên đường tròn có thể tính được bằng cách xác
Trang 13định một trong hai pixel gần nhất với đường tròn thực hơn trong mỗi bước ( xem hình 3).
Hình 3.8 - Đường tròn với khoảng cách d1 và d2
- P0 ứng với điểm ban đầu(x y0 , 0) (= 0,R) là: P0 = −3 2R
CÁC PHÉP BIẾN ĐỔI TRONG ĐỒ HỌA HAI CHIỀU
Một trong những ưu điểm quan trọng cua đồ họa là cho phép dễ dàng thao tác lên các đối tượng đã được tạo ra Một nhà quản lý có nhu cầu thu nhỏ các biểu đồ trong một báo cáo, một kiến trúc sư muốn nhìn tòa nhà
ở những góc nhìn khác nhau, một nhà thiết kế muốn quan sát và chỉnh sửa
Trang 14các mẫu đối tượng trong quá trình thiết kế Tất cả các thao tác này có thể được hỗ trợ một cách dễ dàng nhờ vào các phép biến đổi hình học Các phép biến đổi hình học sẽ làm thay đổi mô tả về tọa độ của các đối tượng,
từ đó làm cho đối tượng bị thay đổi về hướng, kích thước và hình dạng Ngoài ra một số phép biến đổi khác cũng thường được áp dụng đó là phép đối xứng và biến dạng
Có hai quan điểm về phép biến đồi hình học đó là: biến đổi trừu tượng(object transformation) và biến đồi tọa độ ( coordinate transformation) Biến đổi đối tượng là thay đổi tọa độ của các điểm mô tả
nó theo một quy tắc nào đó, còn biến đồi hệ tọa độ là tạo ra một hệ tọa độ mới và tất cả các điểm mô tả đối tượng sẽ được chuyển về hệ tọa độ mới Hai cách này có những mối liên hệ chặt chẽ với nhau và mỗi cách đều có những lợi thế riêng
1 Phép biến đồi hình học cơ sở
Một phép biến đổi hai chiều sẽ biến đổi điêm P trong mặt phẳng thành điểm có tọa độ mới Q theo một quy luật nào đó Về mặt bản chất, một phép biến đổi điểm là một ánh xạ T được định nghĩa:
'
'
,,
Trang 15Để tịnh tiến một điểm P x y từ vị trí này sang vị trí khác trong mặt ( , )phẳng, ta cộng thêm các giá trị mô tả độ dời vào các tọa độ của P Nếu gọi
nó sau đó vẽ lại đa giác với các đỉnh mới Một cách tương tự, để tịnh tiến các đối tượng như đường tròn, ellipse, ta tịnh tiến tâm của chúng tới vị trí mới rồi vẽ lại
Biểu diễn dưới dạng ma trận như sau nếu ta biểu diễn tọa độ điểm ( , )
P x y và Q x y dưới dạng các vector dòng lần lượt là ( ', ') ( x y và , ) ( x y', ')
Trang 16x y
Khi các giá trị s x, s nhỏ hơn 1, phép biến đổi sẽ thu nhỏ đối tượng, y
ngược lại khi các giá trị này lớn hơn 1, phép biến đổi sẽ phóng lớn đối tượng Khi s x và s bằng nhau, ta gọi đó là phép đồng dạng, phép đồng y
dạng là phép biến đổi bảo toàn tính cân xứng của đối tượng
Tâm tỉ lệ là điểm không bị thay đổi qua phép biến đổi tỉ lệ Phép biến đổi tỉ lệ mô tả như trên còn gọi là phép biến đổi tỉ lệ quanh gốc tọa độ
vì có tâm tỉ lệ là gốc tọa độ Nhận xét: Khi phép biến đổi tỉ lệ thu nhỏ đối tượng, đối tượng sẽ được dời về gần gốc tọa độ hơn, tương tự khi phóng to đối tượng, đối tượng sẽ được dịch chuyển xa gốc tọa độ hơn
s S
Trang 18Phép đối xứng có thể xem là phép quay quanh trục đối xứng một góc
1800 Nếu trục đối xứng là trục hoành hay trục tung, chúng ta có biểu diễn của phép đối xứng qua trục hoành, trục tung lần lượt là:
Biến dạng theo phương trục x sẽ làm thay đổi hoành độ còn tung độ vẫn giữ nguyên
sh M
Trang 19Nếu ta thực hiện phép tịnh tiến lên P x y được P( , ) ′, rồi lại thực
hiện tiếp một phép tịnh tiến khác lên P′, ta được điểm Q x y( ′ ′, ) Như vậy,
Q là ảnh của phép biến đổi kết hợp hai phép tịnh tiến liên tiếp
Trang 20Vậy kết hợp hai phép tỉ lệ là một phép tỉ lệ Dễ dàng mở rộng cho kết quả : kết hợp của nhiều phép tỉ lệ cũng là một phép tỉ lệ.
2.4 Phép quay có tâm quay là điểm bất kì
Giả sử tâm quay có tọa độ I x y , ta có thể xem phép quay quanh ( R, R)tâm I một góc α được kết hợp từ các phép biến đồi cơ sở sau :
- Tịnh tiến theo vector tịnh tiến (− −x R, y R) để dịch chuyển tâm quay về gốc tọa độ
- Quay quanh gốc tọa độ một góc α
- Tịnh tiến theo vector tịnh tiến ( x y để đưa tâm quay về vị trí R, R)ban đầu
Ta có ma trận của phép biến đổi:
Trang 21KHÔNG GIAN 3 CHIỀU
Các phép biến đổi trong đồ họa ba chiều là sự mở rộng của các phép biến đổi trong đồ họa hai chiều bằng cách thêm vào việc xem xét tọa độ thứ ba, tọa độ z
Cũng như các phép biến đổi trong đồ họa hai chiều, ta sẽ khảo sát các phép biến đổi trong đồ họa ba chiều dưới dạng ma trận Một chuỗi bất
Trang 22kì các phép biến đổi sẽ được biểu diễn bằng một ma trận duy nhất là tích của các ma trận tương ứng với các phép biến đổi thành phần.
Phép quay quanh một trục tọa độ:
Khác với phép quay trong 2 chiều quanh một điểm bất kì, trong 3 chiều ta có phép quay quanh một trục tọa độ Ở đây ta sử dụng hệ tọa độ theo quy ước bàn tay phải và quy định chiều dương là ngược chiều kim đồng hồ
Quy ước bàn tay phải:
Hệ tọa độ 3 chiều theo quy ước bàn tay phải là hệ tọa độ có các trục x,
y, z thỏa mãn điều kiện: Nếu để bàn tay phải sao cho ngón cái hướng cùng chiều với trục z, khi nắm bàn tay lại, chiều của các ngón tay chuyển động theo hướng từ trục x đến trục y
Quy định chiều quay dương được định nghĩa như sau:
+ Quay quanh trục x: từ trục dương y đến trục dương x
0 0 1 0
0 0 0 1
) , , (
z y x
z y x
tr tr tr
tr tr tr tr
0 0
0
0 0 0
0 0 0
) , , (
z y x z y x
s s
s s s s S
Trang 23+ Quay quanh trục y: từ trục dương z đến trục dương x.
+ Quay quanh trục z: từ trục dương x đến trục dương y
0
0 1 0
0
0 0 cos
sin
0 0 sin
0
0 cos sin
0
0 sin cos
0
0 0 0
1
) , (
θ θ
θ θ
θ
x R
0 cos 0 sin
0 0 1 0
0 sin 0 cos
) , (
θ θ
θ θ
θ
y R
Trang 24Biến dạng theo bất kì trục tọa độ nào cũng bị ảnh hưởng bởi tọa độ ứng với hai trục còn lại.
Ma trận của phép biến dạng như sau:
00
01
01
01
yz xz
zy xy
zx yx
h h
h h
h h
Sh
CÁC THUẬT TOÁN XÉN HÌNH
1 Thuật toán Cohen-Sutherland
Thuật toán Cohen-Sutherland giải quyết bài toán làm thế nào để xác định được phần đoạn thẳng có trong mặt phẳng chiếu Nói một cách khác làm thế nào để xác định phần đường thẳng cho trước có trong Viewport
Theo Cohen-Sutherland một cửa sổ sẽ chia hình thành 9 phần mỗi phần ứng với một mã gồm 4 bit
Trang 25Một điểm P bất kỳ thuộc mặt phẳng chiếu sẽ ứng với một mã gọi là Kod(P).
Kod(P) = b4b3b2b1
+ Bit 1: trái (LEFT)
+ Bit 2: phải (RIGHT)
+ Bit 3: trên (TOP)
+ Bit 4: dưới (BOTTOM)
Giá trị tương ứng với vị trí bit nào trong mã vùng sẽ chỉ ra rằng điểm
đó ở vị trí tương ứng, ngược lại bit đó sẽ đặt bằng 0 Mô tả thuật toán Cohen-sutherland như sau:
Gán mã vùng tương ứng cho các điểm đầu cuối của P1 và P2 của đoạn thẳng cần xén là c1 và c2 Dựa vào giá trị của c1 và c2, ta có các trường hợp sau:
Trường hợp 1: Các đoạn thẳng nằm hoàn toàn bên trong cửa sổ sẽ có c1 = c2 = 0000, các đoạn thẳng này sau khi xén sẽ là chính nó nên thuật toán dừng tại đây
Trường hợp 2: Các đoạn thẳng nằm ngoài biên cửa sổ sẽ có đặc điểm sau: Tồn tại bit thứ k (k=1, ,4) sao cho c1 và c2 cùng có giá trị 1 tại bit thứ k
Ví dụ,nếu k = 1 thì đoạn thẳng sẽ nằm ngoài biên trái của cửa sổ Đoạn thẳng này sẽ bị loại bỏ sau khi xén, cho nên thuật toán dừng tại đây.Khi cài đặt, chúng ta chỉ cần sử dụng phép toán AND của bit đối với c1và c2 Nếu kết quả khác 0, đoạn thẳng sẽ nằm ngoài biên cửa sổ
Trường hợp 3: Nếu c1 và c2 không thuộc hai trường hợp trên, chắc chắn rằng đoạn thẳng sẽ cắt biên cửa sổ Chúng ta sẽ xác định giao điểm
Trang 26này Trong trường hợp này, sẽ có ít nhất 1 đầu đoạn thẳng nằm ngoài cửa
sổ, không mất tính tổng quát chúng ta giả sử đó là P1
+ Xác định giao điểm của đoạn thẳng và cửa sổ xén: bằng cách xét mã vùng c1 của P1 , ta xác định đoạn thẳng cắt biên nào và tiến hành xác định giao điểm P’1 của đoạn thẳng với biên đó
Sơ đồ khối giả thuật Cohen-Sutherland:
Trang 272 Thuật toán Liang – Barsky:
Thuật toán liang-barsky được phát triển dựa vào việc phân tích dạng tham số của phương trình đoạn thẳng:
x= x1 + t(x2- x1) = x1 + tDx, Dx = x2 – x1 (0 ≤ t ≤ 1)
y= y1 + t(y2 – y1) = y1 + tDy, Dy = y2- y1
Ứng với mỗi giá trị t, ta sẽ có một điểm P tương ứng thuộc đường thẳng + Các điểm ứng với t ≥ 1 sẽ thuộc về tia P2x
+ Các điểm ứng với 0 ≤ t ≤ 1 sẽ thuộc về đoạn thẳng P1P2
+ Các điểm ứng với t ≤ 0 sẽ thuộc về tia P1 x’
Hình 1: Phương trình tham số của đoạn thẳng.
Trang 28Tập hợp các điểm thuộc về phần giao của đoạn thẳng và cửa sổ ứng với các giá trị t thỏa mãn hệ bất phương trình:
+ Nếu k ∈ {1,2,3,4}: (pk ≠ 0) ˅ (qk ≥ 0) thì với các bất phương trình
mà ứng với pk = 0 là các bất phương trình hiển nhiên, lúc này hệ bất phương trình cần giải tương đương với hệ bất phương trình có pk ≠0
Trang 29
{ } { }
k k k
q
p q
3 Thuật toán xén đa giác Sutherland-Hodgeman:
Là một kỹ thuật sử dụng cho việc xén đa giác được phát triển bởi Suntherland và Hodgman, thực hiện việc xén bằng cách so sánh đa giác với lần lượt mỗi biên cửa sổ Kết quả trả về của bài toán là một tập các đỉnh định nghĩa vùng bị cắt, vùng này được tô với một màu nào đó
Thuật toán này sẽ tiến hành xén đa giác lần lượt với các biên cửa sổ Đầu tiên, đa giác sẽ được xén dọc theo biên trái của cửa sổ, kết quả sau bước này sẽ được dùng để xén tiếp biên phải, rồi cứ tương tự như vậy cho các biên trên, dưới Sau khi xén hết với bốn biên của cửa sổ, ta được kết quả cuối cùng
Với mỗi lần xén đa giác dọc theo một biên nào đó của cửa sổ, nếu gọi vi , vi+1 là hai đỉnh kề cạnh vivi+1 , ta có 4 trường hợp có thể xảy ra khi xét từng cặp đỉnh của đa giác ban đầu với biên của cửa sổ như sau:
+ Nếu vi nằm ngoài, vi+1 nằm trong, ta lưu giao điểm I của vi vi+1với biên của cửa sổ và vi+1
+ Nếu cả vi vi+1 đều nằm trong, ta sẽ lưu cả vi vi+1
Trang 30+ Nếu vi nằm trong, vi+1 nằm ngoài, ta sẽ lưu vi và I
+ Nếu cả , đều nằm ngoài, ta không lưu gì cả
Trang 31Sơ đồ khối giả thuật Sutherland-Hodgeman:
Trang 32Chúng ta minh họa phương pháp này bằng việc xử lí vùng trong hình vẽ dưới đây khi xem xét với biên bên trái của cửa sổ Đỉnh 1 và 2 được xác định là nằm bên ngoài của biên Đi qua đến đỉnh 3, đang nằm bên trong, chúng ta tính giao điểm và lưu lại cả hai giao điểm và đỉnh 3 Đỉnh 4 và 5 được xác định là nằm trong, và chúng nó cũng được lưu lại Đỉnh thứ sáu và đỉnh cuối cùng thì nằm ngoài, vì vậy chúng ta tính và lưu giao điểm Dùng năm điểm vừa được lưu, chúng ta lặp lại quá trình này khi xem xét với biên kế tiếp của cửa sổ.
Cài đặt các thuật toán vừa được mô tả đòi hỏi phải dùng không gian lưu trữ ngoài để lưu các điểm Điều có thể tránh được nếu chúng ta quản lý được mỗi điểm (điểm sắp sửa được lưu và đi nhanh qua nó để kiểm tra tiếp), cùng với các lệnh (instructions) để cắt nó khỏi biên kế tiếp của cửa sổ Chúng ta lưu một điểm (dù là một đỉnh nguyên thuỷ của đa giác hay một đỉnh có được khi tính giao điểm) chỉ sau khi nó được xử lí khi xem xét với tất cả các biên Như thể chúng ta có một đường ống chứa
một chuỗi các động tác clipping Một điểm nằm bên trong hay nằm trên
1 2
3
4
5 6
3’
4’
5’