ố ượ ố ượ
ồ ọ ơ ở ồ ọ ơ ở
Các đ i t Các đ i t
ng đ h a c s ng đ h a c s
11
Phan Phúc Doãn Phan Phúc Doãn
ệ ọ ộ ự ệ ọ ộ ự
ệ ọ ộ ệ ọ ộ
H t a đ th c và h t a đ thi H t a đ th c và h t a đ thi
ế ị ế ị t b t b
ỏ ỏ
ế ị ế ị t b : t b :
ả ả
ộ ộ i h n trong m t kho ng nào đó i h n trong m t kho ng nào đó
ế ị ế ị
ướ ướ
t b qui t b qui
c bàn tay trái c bàn tay trái
22
• H t a đ th c: ệ ọ ộ ự ệ ọ ộ ự H t a đ th c: – T a đ là s th c, liên t c ụ ố ự ọ ộ ố ự ụ ọ ộ T a đ là s th c, liên t c – L n, nh tùy ý ớ ớ L n, nh tùy ý • H t a đ thi ệ ọ ộ ệ ọ ộ H t a đ thi – T a đ nguyên, r i r c ờ ạ ọ ộ ọ ộ ờ ạ T a đ nguyên, r i r c – T a đ b gi ọ ộ ị ớ ạ ọ ộ ị ớ ạ T a đ b gi – X thu c [0, 639] ộ ộ X thu c [0, 639] – H t a đ thi ệ ọ ộ ệ ọ ộ H t a đ thi
Đi mểĐi mể
33
ọ ộ ọ ộ • Là thành ph n c s ầ ơ ở ầ ơ ở Là thành ph n c s • T a đ , màu s c ắ ắ T a đ , màu s c
ườ ườ
ẳ ẳ
ườ ườ
ấ ấ
- - - - ắ ắ ạ ạ ươ ươ
x
y
ng g p khúc ng g p khúc y
(
)(
)(
(
)
ng trình đo n ch n: ng trình đo n ch n: • Ph Ph
Đ ng th ng, đ Đ ng th ng, đ x 1
2
= y ) 1
x 2
y 1
x 1
ươ ươ ổ ổ • Ph Ph ng trình t ng quát: Ax + By + C = 0 ng trình t ng quát: Ax + By + C = 0
(cid:0)
x
(cid:0) ươ ươ ố ố • Ph Ph ng trình tham s : ng trình tham s : (cid:0)
y
tx 2 ty
= - (1 = - (1
+ t x ) 1 + t y ) 1
2
ố ố ậ ậ ẳ ẳ ấ ấ ị ị
44
• Đ ng g p khúc là t p các đo n th ng n i nhau xác đ nh b i ở ạ ườ ở ạ ườ Đ ng g p khúc là t p các đo n th ng n i nhau xác đ nh b i các đ nhỉ các đ nhỉ
ườ ườ
ẳ ẳ
ườ ườ
ấ ấ
Đ ng th ng, đ Đ ng th ng, đ
ng g p khúc (tt) ng g p khúc (tt)
• Màu s cắMàu s cắ
ộ ộ ộ ộ ẽ ẽ • Đ r ng nét v Đ r ng nét v
55
ẽ ề ẽ ề ứ ứ ể ể • Ki u nét v : li n, đ t,.. Ki u nét v : li n, đ t,..
Vùng tô Vùng tô
ườ • Đ ng biên và vùng bên trong ườĐ ng biên và vùng bên trong
ườ ườ ẳ ẳ ạ ạ • Đ ng biên: gi ng đo n th ng ố ố Đ ng biên: gi ng đo n th ng
66
• Vùng bên trong: màu tô và m u tôẫ Vùng bên trong: màu tô và m u tôẫ
ự ự
ự ự
Kí t Kí t
ỗ ỗ , chu i kí t , chu i kí t
• Màu s cắMàu s cắ
• Font chữ Font chữ
• Kích th Kích th cướ cướ
ữ ữ ả ả ự ự • Kho ng cách gi a các kí t Kho ng cách gi a các kí t
ự ự ỉ ỉ • S canh ch nh S canh ch nh
ị ầ ự ị ầ ự ự ự • Cách hi n th tu n t ể ể Cách hi n th tu n t các kí t các kí t
77
ướ ướ ủ ủ ự ự • H ng c a kí t H ng c a kí t
ẽ ườ ẽ ườ
ẳ ẳ
V đ V đ
ng th ng ng th ng
88
ườ ườ
ẳ ẳ
Đ ng th ng trên màn hình Đ ng th ng trên màn hình
ẳ ẳ Đ ng th ng đ Đ ng th ng đ c hình thành c hình thành
ể ể ượ ượ ờ ạ ờ ạ các đi m r i r c các đi m r i r c ườ ườ ừ ừ t t
ượ ượ Các đi m đ Các đi m đ
ị ị c xác đ nh t c xác đ nh t ủ ườ ủ ườ ng trình c a đ ng trình c a đ ừ ừ ng ng
Ideal Line Ideal Line Rasterized line Rasterized line
99
ể ể ươ ươ ph ph th ngẳth ngẳ
ủ ườ ủ ườ
ặ ặ
ẳ ẳ
ể ể Đ c đi m c a đ Đ c đi m c a đ
ng th ng nguyên ng th ng nguyên
ấ ỉ ườ ấ ỉ ườ ẳ ẳ X p x đ X p x đ ự ự ng th ng th c ng th ng th c
Không liên t cụ Không liên t cụ
ạ ạ ậ ậ ư ư D ng răng c a (hình b c D ng răng c a (hình b c
thang) thang)
ơ ả ơ ả ố ượ ố ượ ể ể Nhanh – Thao tác c b n đ Nhanh – Thao tác c b n đ ng ng
1010
ạ ạ t o thành các đ i t t o thành các đ i t khác khác
ươ ươ
ườ ườ
ẳ ẳ
Ph Ph
ng trình đ ng trình đ
ự ự ng th ng th c ng th ng th c
(x1,y1)
Dy
Dx
(x2,y2)
(cid:0) (cid:0) (cid:0) y y (cid:0) mm (cid:0) x (cid:0) x bb
(cid:0) (cid:0) (cid:0)
(cid:0) (cid:0) (cid:0)
(cid:0)
1111
(cid:0) (cid:0) (cid:0) Dx Dx (cid:0) Dy Dy (cid:0) mm (cid:0) bb (cid:0) (cid:0) xx22 (cid:0) x x11 (cid:0) yy22 (cid:0) y y11 Dy / Dx Dy / Dx mm (cid:0) x x11 y y11 (cid:0)
ậ
ậThu t toán Slope Intercept Thu t toán Slope Intercept SlopeInterceptLine(int x1, int y1, int x2, int y2, int color) { SlopeInterceptLine(int x1, int y1, int x2, int y2, int color) {
int Dx = x2 – x1; int Dx = x2 – x1; int Dy = y2 – y1; int Dy = y2 – y1; int x = x1, y = y1; int x = x1, y = y1;
putpixel(x, y, color); putpixel(x, y, color); if (Dx != 0) { if (Dx != 0) { float m = (float)Dy / (float)Dx; float m = (float)Dy / (float)Dx; float b = y1 - m*x1; float b = y1 - m*x1; int stepX = (x2 > x1) ? 1 : -1; int stepX = (x2 > x1) ? 1 : -1;
while (x != x2) { while (x != x2) { x += stepX; x += stepX; y = round(m*x + b); y = round(m*x + b); putpixel(x, y, color); putpixel(x, y, color); }} }} }}
1212
L u ýưL u ýư
ớ ơ ớ ơ
ng th ng l n h n ng th ng l n h n ờ ạ ờ ạ ẳ ẳ ộ ớ ủ ệ ố ộ ớ ủ ệ ố Khi đ l n c a h s góc đ Khi đ l n c a h s góc đ ườ ể ườ ể 1 thì các đi m trên đ 1 thì các đi m trên đ ẳ ườ ườ ẳ ng th ng r i r c. ng th ng r i r c.
(x2,y2)
ọ ộ ọ ộ ụ ụ Kh c ph c:Tính t a đ x theo y, nghĩa là x = Kh c ph c:Tính t a đ x theo y, nghĩa là x =
ắ ắ g(y)g(y)
Dy
Dx (x1,y1)
1313
ImprovedSlopeInterceptLine(int x1, int y1, int ImprovedSlopeInterceptLine(int x1, int y1, int
ả ế ả ế
ậ ậ
Thu t toán c i ti n Thu t toán c i ti n
x2, int y2, int color) { x2, int y2, int color) { int Dx = x2 – x1; int Dx = x2 – x1; int Dy = y2 – y1; int Dy = y2 – y1; int x = x1, y = y1; int x = x1, y = y1; putpixel(x, y, color); putpixel(x, y, color);
if (abs(Dx) > abs(Dy)) { if (abs(Dx) > abs(Dy)) { float m = (float)Dy / (float)Dx; float m = (float)Dy / (float)Dx; float b = y1 - m*x1; float b = y1 - m*x1; int stepX = (Dx < 0) ? -1 : 1; int stepX = (Dx < 0) ? -1 : 1;
1414
while (x != x2) { while (x != x2) { x += stepX; x += stepX; putpixel(x, round(m*x + b), color); putpixel(x, round(m*x + b), color); }} } else if (Dy != 0) { } else if (Dy != 0) { float m = (float)Dx / (float)Dy; float m = (float)Dx / (float)Dy; float b = x - m*y; float b = x - m*y; int stepY = (Dy < 0) ? -1 : 1; int stepY = (Dy < 0) ? -1 : 1; while (y != y2) { while (y != y2) { y += stepY; y += stepY; putpixel(round(m*y + b), y, color); putpixel(round(m*y + b), y, color); }} }} }}
ả ế ả ế C i ti n C i ti n
ặ ặ Vòng l p bên trong: Vòng l p bên trong:
while (x != x2) { while (x != x2) { x += stepX; x += stepX; putpixel(x, round(m*x + b), color); putpixel(x, round(m*x + b), color); }}
ượ ượ ự ế ừ ươ ự ế ừ ươ ị ủ ị ủ Giá tr c a y đ Giá tr c a y đ c tính tr c ti p t c tính tr c ti p t ph ph ng trình ng trình
ị ủ ị ủ ể ể ằ ằ Chúng ta có th tính giá tr c a y b ng cách khác: Chúng ta có th tính giá tr c a y b ng cách khác:
float t = m * x + b + 0.5; float t = m * x + b + 0.5;
while (x != x2) { while (x != x2) { x += stepX; x += stepX; t += m; t += m; putpixel(x, (int)t, color); putpixel(x, (int)t, color); }}
1515
Digital Differential Analyzer Digital Differential Analyzer
DDALine(int x1, int y1, int x2, int y2, int color) { DDALine(int x1, int y1, int x2, int y2, int color) { int Dx = x2 – x1; int Dx = x2 – x1; int Dy = y2 – y1; int Dy = y2 – y1; float t = 0.5; float t = 0.5; int x = x1, y = y1; int x = x1, y = y1;
putpixel(x, y, color); putpixel(x, y, color);
if (abs(Dx) > abs(Dy)) { if (abs(Dx) > abs(Dy)) { float m = (float)Dy / (float)Dx; float m = (float)Dy / (float)Dx; float b = y - m*x; float b = y - m*x; int stepX = (Dx < 0) ? -1 : 1; int stepX = (Dx < 0) ? -1 : 1;
t += b + m*x; t += b + m*x; m *= (float)stepX; m *= (float)stepX; while (x != x2) { while (x != x2) { x += stepX; x += stepX; t += m; t += m; putpixel(x, (int)t, color); putpixel(x, (int)t, color); }} } else if (Dy != 0) { } else if (Dy != 0) { // swap x & y to do other slopes // swap x & y to do other slopes }} }}
1616