ố ượ ố ượ

ồ ọ ơ ở ồ ọ ơ ở

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