Đồ họa máy tính và các thuật toán cơ sở
Trang 1BÀI GIẢNG
ĐỒ HỌA MÁY TÍNH
GV: Vũ Đức Huy SĐT: 0912316373
Bộ môn: HTTT-ĐHCNHN EMail: huyhaui@gmail.com
Trang 3Tài liệu tham khảo
[1] James D.Foley, Andrie van Dam, Steven K.Feiner, Jonhn F Hughes, Computer Graphics Principles and Practice, Addison Wesley, 1994.
[2] Hoàng Kiếm, Dương Anh Đức, Lê Đình Duy, Vũ Hải Quân Giáo trình cơ sở Đồ hoạ Máy tính, NXB Giáo dục, 2000.
[3] Lê Tấn Hùng, Huỳnh Quyết Thắng Kỹ thuật đồ hoạ máy tính, NXB khoa học và kỹ thuật, 2002.
[4] Học viện công nghệ bưu chính viễn thông Kỹ thuật đồ họa (lưu hành nội bộ)
[5] Lương Chi Mai Nhập môn Đồ họa máy tính, NXB Khoa học và
Trang 4CHƯƠNG 2 CÁC THUẬT TOÁN CƠ SỞ
Trang 52.1 CÁC THUẬT TOÁN VẼ ĐƯỜNG THẲNG
Trang 62.1.1 Một số khái niệm
hệ tọa độ Đối với hệ tọa độ hai chiều mỗi điểm được xác định bởi cặp tọa độ (x, y)
màu sắc
Trang 72.1.1 Một số khái niệm
Q(x2,y2):
(y-y1)/( x-x1) = ( y2-y1)/( x2-x1) (y-y 1 )(x 2 -x 1 )=(x-x 1 )(y 2 -y 1 )
Trang 9Tổng quát: Ax + By + C = 0 Với:
A = (y2-y1)
B = -(x2-x1 )
C = x2y1 - x1y2
Trang 112.1.2 Giải thuật làm tròn
Trang 172.1.3 Giải thuật DDA
thẳng d: y = mx+b
m = (y2-y1)/(x2-x1)
Trang 182.1.3 Giải thuật DDA
Giả sử vẽ được (xi,yi)
Tiếp theo, chọn yi+1 là yi
hay yi+1 dựa vào phương
trình của đường thẳng d
Trang 192.1.3 Giải thuật DDA
Thay xi+1 vào phương
trình đường thẳng d:
y i+1 = y i + m
Trang 202.1.3 Giải thuật DDA
Trang 212.1.3 Giải thuật DDA
Trang 22chệch hướng với đường thẳng thực khi đường thẳng dài.
Trang 232.1.4 Giải thuật Bresenham
toán
Trang 242.1.4 Giải thuật Bresenham
Trang 252.1.4 Giải thuật Bresenham
Trang 262.1.4 Giải thuật Bresenham
Trang 272.1.4 Giải thuật Bresenham
R
Trang 28R
Trang 292.1.4 Giải thuật Bresenham
Trang 312.1.4 Giải thuật Bresenham
Đặt Pi = dx(d1-d2)
Pi là tham số quyết định để chọn điểm tiếp theo
là P hay S dựa vào dấu của nó.
Trang 322.1.4 Giải thuật Bresenham
Pi = dx((m(xi+1)+b-yi)-(yi+1-m(xi+1)-b))
Pi = dx(2(m(xi+1)+b)-2yi+1) (*)
Thay m = dy/dx vào phương trình (*)
Pi =2dyxi – 2dxyi + 2dy + (2b-1)dx
Trang 332.1.4 Giải thuật Bresenham
được Pi+1.
Tính Pi+1:
Pi+1 = 2dyxi+1 – 2dxyi+1 + c
P i+1 = 2dy(xi+1) – 2dxyi+1 + c
Xét mối liên hệ giữa Pi+1 và Pi
P i+1 -P i = 2dy–2dx(y i+1 -y i )
Trang 352.1.4 Giải thuật Bresenham
Tính P1: Thay điểm (x1,y1) vào Pi
với c = 2dy + (2b-1)dx
b = y1- mx1
m = dy/dx
P 1 =2dy - dx
Trang 362.1.4 Giải thuật Bresenham
Trang 372.1.4 Giải thuật Bresenham
Trang 382.1.4 Giải thuật Bresenham
Trang 392.1.5 Giải thuật MidPoint
Cho hai điểm (x1,y1) và
Đặt F(x,y) = Ax + By + C
Trang 402.1.5 Giải thuật MidPoint
Midpoint đưa ra cách chọn
điểm yp+1 là yp hay yp+1 dựa
vào so sánh điểm thực
Q(xp+1,y) với trung điểm
M(xp+1,yp+1/2) của ENE.
Trang 412.1.5 Giải thuật MidPoint
<0 nếu (x,y) nằm phía trên đường thẳng
>0 nếu (x,y) nằm phía dưới đường thẳng
Trang 422.1.5 Giải thuật MidPoint
Cách thực hiện: Đặt Pp = F(M) = F(xp+1,yp+1/2)
chọn NE
Pp gọi là tham số quyết
định Dấu của nó sẽ quyết
định lựa chọn điểm tiếp
theo.
Trang 432.1.5 Giải thuật MidPoint
Tính Pp:
P old = A(x p +1)+B(y p +1/2)+C
Nếu chọn E thì trung điểm mới:Mnew(xp+2,yp+1/2)
P = P + dy (vì A= dy)
Trang 442.1.5 Giải thuật MidPoint
Nếu chọn NE thì trung điểm mới:Mnew(xp+2,yp+3/2)
PnewNE = A(xp+2)+B(yp+3/2)+C
PnewNE = A(xp+1)+B(yp+1/2)+C + A + B
P newNE = P old + dy – dx (vì A= dy, B = -dx)
Trang 452.1.5 Giải thuật MidPoint
Trang 462.1.5 Giải thuật MidPoint
Trang 472.1.5 Giải thuật MidPoint
Trang 482.1.5 Giải thuật MidPoint
Trang 492.2 THUẬT TOÁN VẼ ĐƯỜNG TRÒN
Trang 502.2.1 Một số vấn đề
Trang 512
2 x r
y
Trang 522.2.2 Thuật toán làm tròn
Trang 532.2.2 Thuật toán làm tròn
Trang 552.2.3 Thuật toán lượng giác
Trang 572.2.3 Thuật toán lượng giác
Trang 582.2.3 Thuật toán lượng giác
Trang 592.2.3 Thuật toán lượng giác
Trang 612.2.4 Thuật toán MidPoint
Giả sử đã vẽ được điểm (xp,yp)
là E hay SE
Trang 62<0 nếu (x,y) nằm trong đường tròn
>0 nếu (x,y) nằm ngoài đường tròn
Trang 632.2.4 Thuật toán MidPoint
Trang 642.2.4 Thuật toán MidPoint
Điểm khởi tạo (0,r), M(1,r-1/2)
p1 = 12 +(r-1/2)2-r2
p1 =5/4 - r
Vì chỉ xét dấu, đặt h = d1 – ¼
h=1-r
Trang 652.2.4 Thuật toán MidPoint
Trang 662.2.4 Thuật toán MidPoint
Trang 672.2.4 Thuật toán MidPoint
Tốc độ cao, tiết kiệm bộ nhớ
Trang 692.2.5 Thuật toán Bresenham
Trang 712.2.5 Thuật toán Bresenham
Đặt Pi = d1 - d2
Pi là tham số quyết định chọn S1 hoặc S2 dựa
vào dấu của nó
Pi = (yi)2 -(R2- (xi + 1)2 )-((R2- (xi + 1)2)-(yi - 1))2
Pi = (yi)2 -R2+ (xi + 1)2-R2+ (xi + 1)2+(yi - 1)2
Pi = (yi)2 -2R2+ 2(xi + 1)2+(yi - 1)2
Trang 722.2.5 Thuật toán Bresenham
Tính Pi+1 - Pi
P i+1 = (yi+1)2 -2R2+ 2(xi+1 + 1)2+(yi+1 - 1)2
P i+1 = 2(yi+1)2 -2R2+ 2(xi)2+8xi+8 -2yi+1 + 1
Trang 732.2.5 Thuật toán Bresenham
Nếu chọn S1 yi+1 = yi
Pi+1 = Pi + 4xi+6
Nếu chọn S2 yi+1 = yi-1
Pi+1 = Pi + 4(xi-yi)+10
Trang 742.2.5 Thuật toán Bresenham
Điểm đầu tiên (0,R)
P1 = (R)2 -2R2+ 2(0 + 1)2 +(R - 1)2
P1 = R2 -2R2+ 2 + R2 -2R +1
Trang 752.2.5 Thuật toán Bresenham
Trang 762.2.5 Thuật toán Bresenham
Trang 772.2.5 Thuật toán Bresenham
Trang 782.2.6 Thuật toán xấp xỉ
Sinh viên tự tìm hiểu
Trang 792.3 THUẬT TOÁN VẼ ELIPSE
Trang 802
21
a
x b
y
Trang 822.3.1 Thuật toán làm tròn
Trang 832.3.1 Thuật toán làm tròn
Trang 862.3.2 Thuật toán lượng giác
Trang 872.3.2 Thuật toán lượng giác
Trang 892.3.3 Thuật toán Vanaken
Phương trình elip có tâm tại gốc tọa độ
F(x,y)=b2x2 + a2y2 - a2b2=0
Trang 902.3.3 Thuật toán Vanaken
Tìm ranh giới giữa hai miền trong ¼ elip
Vecto vuông góc với tiếp tuyến tại tiếp điểm -> gradient
Tại P các thành phần i và j của vecto gradient có cùng độ lớn
j y a i
x b j
i y
( 2 2
Trang 912.3.3 Thuật toán Vanaken
Trang 932.3.3 Thuật toán Vanaken
p i = b 2 (x i +1) 2 + a 2 (y i -1/2) 2 -a 2 b 2
pi+1 = b 2 (x i+1 +1) 2 + a 2 (y i+1 -1/2) 2 -a 2 b 2
Tính pi+1 - pi
pi+1 - pi = b2((xi+1+1)2 - (xi+1)2 )+ a2((yi+1-1/2)2 - (yi-1/2)2 )
p i+1 = p i + 2b 2 x i+1 + b 2 + a 2 ((y i+1 -1/2) 2 - (y i -1/2) 2 )
Trang 952.3.3 Thuật toán Vanaken
Trang 972.3.3 Thuật toán Vanaken
trị ban đầu cho phần 2
S(xj,yj-1) hoặcSE(xj+1, yj-1)
Trang 992.3.3 Thuật toán Vanaken
Trang 1012.3.3 Thuật toán Vanaken
q 1 = b 2 (x k +1/2) 2 + a 2 (y k -1) 2 -a 2 b 2
Trang 1022.3.3 Thuật toán Vanaken
Trang 1032.3.3 Thuật toán Vanaken
Trang 1042.3.3 Thuật toán Vanaken
Trang 1052.3.3 Thuật toán Bresenham
Sinh viên tự tìm hiểu
Trang 1062.4 Giải thuật sinh đa giác
Trang 1072.4 Thuật toán sinh đa giác
Trang 1082.4 Thuật toán sinh đa giác
Các loại đa giác
Là đa giác có đường thẳng nối bất ký 2 điểm bên trong nào của đa giác đều nằm trọn trong đa giác
Là đa giác không lồi
Trang 1092.4 Thuật toán sinh đa giác
Xác định đa giác cần biết
Trang 1112.5 Thuật toán xén hình
(clipping)
Trang 1132.5.1 Một số khái niệm
Trang 1152.5.1 Một số khái niệm
x1,x2>xmax; y1,y2>ymax
x1,x2<xmin; y1,y2<ymin
trường hợp trên
Trang 1162.5.1 Một số khái niệm
Trang 1172.5.2 Thuật toán CohenSutherland
cắt
mỗi phần ứng với mã số 4 bit
Trang 1182.5.2 Thuật toán CohenSutherland
Giả sử có điểm P(x,y) P ứng với mã số 4 bit gọi
Trang 1192.5.2 Thuật toán CohenSutherland
b1 là dấu của x-xmin
b2 là dấu của xmax-x
b3 là dấu của y-ymin
Trang 1202.5.2 Thuật toán CohenSutherland
Kod(P) =0000
Cho P1P2, các trường hợp xảy ra
(Kod(P2<>0000))
Trang 1212.5.2 Thuật toán CohenSutherland
cửa sổ sau đó bỏ phần không thuộc cửa sổ
Cho cửa sổ V(xmin,ymin,xmax,ymax), P1(x1,y1), P2(x2,y2)
Nhảy tới B5
ngoài V Nhảy tới B6
Trang 1222.5.2 Thuật toán CohenSutherland
B4.1: Nếu Kod(P1) = 0000 thì hoán vị P1 với P2 để Kod(P1)<>0000 Đặt b1b2b3b4 = Kod(P1)
Nếu b 1 =1 thì y 1new = y 1 +(x min -x 1 )*(y 2 -y 1 )/(x 2 -x 1 )
Trang 1232.5.2 Thuật toán CohenSutherland
Trang 1242.5.2 Thuật toán CohenSutherland
Trang 1252.5.2 Thuật toán CohenSutherland
Trang 1272.5.3 Thuật toán Liang-Basky
Cho P1(x1,y1), P2(x2,y2)
x = x1 + tdx y= y1+tdy
Trang 1292.5.3 Thuật toán Liang-Basky
Trang 1302.5.3 Thuật toán Liang-Basky
Từ (*) suy ra
song với cạnh cửa sổ cắt
t2 = Min{1,Min(qk/pk)} với các pk>0
Trang 1312.5.3 Thuật toán Liang-Basky
Trang 1322.5.3 Thuật toán Liang-Basky
Trang 1332.5.3 Thuật toán Liang-Basky
Trang 1342.5.3 Thuật toán Liang-Basky
Trang 1352.5.3 Thuật toán Liang-Basky
Trang 1372.5.4 Thuật toán chia nhỏ trung điểm
Trang 1381(vẽ) hoặc loại 2 (hủy bỏ)
Trang 1392.5.4 Thuật toán chia nhỏ trung điểm
Số lần chia
Trang 1412.5.5 Thuật toán xén vùng
Duyệt lần lượt (theo chiều kim đồng hồ) các cạnh đa giác
Nếu đỉnh duyệt xuất phát từ trong cửa sổ theo cạnh đa giác đi ra ngoài cửa sổ: lưu trữ giao của cạnh đa giác với biên cửa sổ
Nếu đường đi từ ngoài vào trong cửa sổ: lưu trữ đỉnh đa giác và giao điểm
Ví dụ xét hai đỉnh đa giác S và P:
Trang 1422.6 Thuật toán tô màu
Trang 1432.6.1 Một số khái niệm
nếu chúng kề nhau theo đường thẳng
đứng hoặc nằm ngang
nếu chúng kề nhau theo đường thẳng
đứng, ngang và đường chéo
Trang 1442.6.2 Thuật toán tô màu loang
Cb.Tô kín V bằng mầu tô Ct
Cho điểm P(x,y) Є V
P nếu không phải là biên và
chưa được tô
hết V
Trang 1452.6.2 Thuật toán tô màu loang
Trang 1472.6.2 Thuật toán tô màu loang
Cải tiến
để quyết định số lần gọi đệ quy
Trang 1482.6.3 Thuật toán tô màu biên
Cho miền kín V có mầu biên Cb.Tô kín V bằng mầu tô Ct
Cho điểm P(x,y) Є V
Trang 1492.6.3 Thuật toán tô màu biên
và lặp lại quá trình trên cho
nửa thứ nhất
và lặp lại quá trình trên cho
nửa thứ hai
Trang 1512.6.3 Thuật toán tô màu biên
Trang 1522.6.4 Tô màu đường tròn
Xác định điểm trên bên trái (xc-r, yc-r)
Xác định điểm dưới bên phải (xc+r, yc+r)
Trang 1532.6.4 Tô màu đường tròn
Cho j đi từ yc-r đến yc+r
Tính khoảng cách d giữa hai điểm (i,j) và tâm (xc,yc)
Nếu d<r thì tô điểm (i,j) với màu muốn tô
Trang 1542.6.4 Tô màu đường tròn
Trang 1552.6.4 Tô màu hình thang cơ bản
Trang 1572.6.4 Tô màu hình thang cơ bản
Trang 1582.6.5 Tô màu đa giác
song với hai trục tọa độ chứa đa giác cần tô dựa
các đỉnh của đa giác
các đỉnh của đa giác
Trang 1592.6.5 Tô màu đa giác
Xét điểm P(x,y) có thuộc đa giác không ?Nếu đúng thì tô với màu cần tô
Trang 1602.6.5 Tô màu đa giác
phát từ điểm đó cắt biên của đa giác phải là một
số lẻ lần
một giao điểm phải được tính 2 lần
chọn tia qua phải
Trang 1612.6.5 Tô màu đa giác
Cho đa giác W và P là điểm bất kỳ
Thuật toán1
hướng sang phải
các cạnh của đa giác
nằm ngoài đa giác
Trang 1622.6.5 Tô màu đa giác
max(xi,xi+1)<x0
min(xi,xi+1)>x0(y-y0)(yi+1-y0)<0
Trang 1632.6.5 Tô màu đa giác
của đa giác
giác
Thuật toán này không phải là thuật toán tổng quát để xác định điểm P nằm trong hay ngoài đa giác
Trang 1642.6.5 Tô màu đa giác
Thuật toán 2
góc theo thứ tự ngược chiều kim đồng hồ
đo
Nếu tổng các góc bằng 0 thì P nằm ngoài đa giác
Nếu tổng các góc bằng 360 o thì P nằm trong đa giác
Trang 1652.6.5 Tô màu đa giác
Thuật toán 2
Trang 1662.6.5 Tô màu đa giác
Trang 1672.6.5 Tô màu đa giác
P i y < Min ( P i+1 y, P i-1 y) P i là đỉnh cực trị (cực tiểu)
Pi.y > Max ( Pi+1.y, Pi-1.y) P i là đỉnh cực trị (cực đại )
Pi-1.y < Pi.y < Pi+1.y hay Pi-1 > Pi.y > Pi+1.y
Trang 1682.6.5 Tô màu đa giác
Tư tưởng
qui ước như sau: nếu là đỉnh cực trị hay đoạn cực trị thì đánh số 0 Nếu là đỉnh đơn điệu hay đoạn đơn điệu thì đánh dấu 1
cần xét với biên của đa giác Nếu số giao điểm là chẵn thì kết luận điểm không thụôc đa giác Ngược lại, số giao điểm là lẻ thì điểm thuộc đa giác
Trang 1692.6.6 Tô màu dòng quét
quét để nhận ra pixel có trong đa giác?
Trang 1702.6.6 Tô màu dòng quét
điểm vào hay điểm ra đa giác
màu C
Trang 1712.6.6 Tô màu dòng quét
Trang 1722.6.6 Tô màu dòng quét
có giao nhau
i i+1
xi+1
Trang 1732.6.6 Tô màu dòng quét
và chỉ khi tọa độ y thấp hơn của đoạn thẳng
Trang 1742.6.6 Tô màu dòng quét
Tọa độ y lớn hơn của cạnh (đường quét lớn nhất còn cắt cạnh)
Tọa độ x của điểm thấp hơn (tọa độ x của điểm ymin)
Số gia của x (tăng theo đường quét liền nhau)
Con trỏ trỏ tới phần tử tiếp theo (nếu cần)
Trang 1752.6.6 Tô màu dòng quét
sẽ được đưa vào trong danh sách cạnh kích hoạt, cạnh không còn cắt sẽ bị loại bỏ (có thể cần sắp xếp)
được sắp theo chiều tăng x
Trang 1762.6.6 Tô màu dòng quét
Begin
Xây dựng danh sách các cạnh (EL)
Danh sách cạnh kích hoạt AEL = null
For y:=y min to y max do
Hòa nhập EL[y] vào AEL và sắp xếp theo giá trị x
Tô màu đoạn nằm giữa cặp x trong AEL
For each edge trong AEL
If edge.ymax = y then
Loại edge khỏi AET
Else
Edge.x=edge.x + dx/dy
Sắp xếp AET theo giá trị x
End;
Trang 1772.6.6 Tô màu dòng quét
Trang 178Xin chân thành cảm ơn!