lOMoARcPSD| 58490434
DDA
TH2: Hệ số gốc 0 <m ≤ 1 và dx < 0
- Xét đoạn thẳng có hệ số góc 0 < m dx < 0
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
i + i
, y
i+1
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình
vẽ sau:
- Với thuật toán DDA việc quyết định chọn y
i+1
y
i
hay y
i
+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x
i
-1, y) thuộc về đường thẳng thực và
y
i+1
sẽ là giá trị làm tròn của giá trị tung độ y thực.
- Như vậy o y = mx +b o yI = mxI + b o y = m(x
i
-1) +b o y = mx
i
m +b o y = (mx
i
+ b) m
o y
sau
= y
trước
m
- Lưu đồ thuật toán
lOMoARcPSD| 58490434
- Ví dụ A(8, 5) và B(4, 3) ta có m =0.5
-
o d
x
= 4 8 = -4 o d
y
= 3 - 5 = -
2 o m = d
y
/ d
x
= -2/-4 = 0.5
o x
s
= x
t
-1 o y
s
= y
t
m
TH3: Hệ số gốc m>1 và dy > 0
- Xét đoạn thẳng có hệ số góc m>1 và dy > 0
i
x
i
y
i
y
thực
0
8
5
5
1
7
5
4.5
2
6
4
4
3
5
4
3.5
4
4
3
3
Đ
S
BD
dx = x2 - x1
dy = y2 y1
m = (float) dy/dx
x = x1
y = y1
Putpixel(x,int(y +0.5), color)
x > x2
KT
x = x - 1
y = y - m
Putpixel(x, int(y +0.5), color)
lOMoARcPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
i + i
, y
i+1
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình
vẽ sau:
- Với thuật toán DDA việc quyết định chọn x
i+1
x
i
hay x
i
+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, y
i
+1) thuộc về đường thẳng thực và
x
i+1
sẽ là giá trị làm tròn của giá trị hoành độ x thực.
- Như vậy o y = mx +b o yI = mxI + b o x
I
= (y
i
b)/m o x = (y
i
+1 b) /m o xsau =
xtrước + 1/m
- Lưu đồ thuật toán
lOMoARcPSD| 58490434
Ví d: A(2,5), B(6,10) vi m= 1.25
- d
x
= 6 2 =4
- d
y
= 10 -5 = 5
- m = 5/4 = 1.25
- x
s
= x
t
+1/m
- y
s
= y
t
+ 1
TH4: H s gc m>1 và dy < 0
i
x
i
y
i
x
thực
0
2
5
2
1
3
6
2.8
2
4
7
3.6
3
4
8
4.4
4
5
9
5.2
5
6
10
6
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,int(y +0.5), color)
y < y2
KT
y = y +1
x = x + 1/m
Putpixel(x, int(y +0.5), color)
m = (float) dy/dx
lOMoARcPSD| 58490434
- Xét đoạn thẳng có hệ số góc m>1 và dy < 0
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
i + i
, y
i+1
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình
vẽ sau:
- Với thuật toán DDA việc quyết định chọn x
i+1
x
i
hay x
i
-1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, y
i
- 1) thuộc về đường thẳng thực và
x
i+1
sẽ là giá trị làm tròn của giá trị hoành độ x thực.
- Như vậy o y = mx + b
o y
i
= mx
i
+ b
o x
I
= (y
I
b)/m
o x = (y
i
1
b)/m o xsau =
xtrước 1/m
- Lưu đồ thuật toán
lOMoARcPSD| 58490434
dx = 1 5 = -4 dy = 4 9 = -5
m = -5/-4 = 1.25 Xs = Xt 1/m
Ys = Yt - 1
TH5: Hệ số gốc -1<m ≤ 0 và dx > 0
- Xét đoạn thẳng có hệ số góc -1<m ≤ 0 và dx > 0
i
x
i
y
i
x
thực
0
5
9
5
1
4
8
4.2
2
3
7
3.4
3
3
6
2.6
4
2
5
1.8
5
1
4
1
-
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,int(y +0.5), color)
y > y2
KT
y = y - 1
x = x - 1/m
Putpixel(x, int(y +0.5), color)
x1, y1, x2, y2, color
m = (float) dy/dx
lOMoARcPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
i + i
, y
i+1
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ
sau:
- Với thuật toán DDA việc quyết định chọn y
i+1
y
i
hay y
i
-1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x
i
+1, y) thuộc về đường thẳng thực và y
i+1
sẽ là giá trị làm tròn của giá trị tung độ y thực.
- Như vậy
o Y = mx + b
o y
I
= mx
I
+ b
o y = m(x
i
+1 ) + b
o y = mx
i
+ m
+ b
o ysau = ytrước + m
lOMoARcPSD| 58490434
TH6: Hệ số gốc -1<m ≤ 0 và dx <0
- Xét đoạn thẳng có hệ số góc -1<m ≤ 0 và dx <0
Lưu đồ thuật toán
-
-
o
o
o
o
o
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,int(y +0.5), color)
x < x2
KT
x=x + 1
y = y + m
Putpixel(x, int(y +0.5), color)
x1, y1, x2, y2, color
m = (float) dy/dx
i
x
i
y
i
Ythực
lOMoARcPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
i + i
, y
i+1
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ
sau:
- Với thuật toán DDA việc quyết định chọn y
i+1
y
i
hay y
i
+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x
i
-1, y) thuộc về đường thẳng thực và y
i+1
sẽ là giá trị làm tròn của giá trị tung độ y thực.
- Như vậy o y = mx +b
o yI = mxI + b o y = m(x
i
-1) +b o y = mx
i
m
+b
o ysau = ytrước - m
- Lưu đồ thuật toán
lOMoARcPSD| 58490434
- Ví dụ A(7,6) và B(2,10) với m = -0.8 o dx = 2
- 7 = -5 o dy = 10 6 = 4 o m = dy/dx = 4/-5
= -0.8 o Xs = Xt 1 o Ys = Yt - m
TH7: Hệ số gốc m < -1 và dy >
0
- Xét đoạn thẳng có hệ số góc m < -1 và dy > 0
i
x
i
y
i
Ythực
0
7
6
6
1
6
6
6.8
2
5
7
7.6
3
4
8
8.4
4
3
9
9.2
5
2
10
10
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,int(y +0.5), color)
KT
x = x - 1
y = y - m
Putpixel(x, int(y +0.5), color)
x > x2
m = (float) dy/dx
lOMoARcPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
i + i
, y
i+1
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ
sau:
- Với thuật toán DDA việc quyết định chọn x
i+1
x
i
hay x
i
-1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, y
i
+1) thuộc về đường thẳng thực và x
i+1
sẽ là giá trị làm tròn của giá trị hoành độ x thực.
- Như vậy o y = mx + b o yI = mxI + b
o x
I
= (y
I
b )/m o x = (y
i
+
1 - b)/m o x = (y
i
b)/m +1/m o xsau =
xtrước + 1/m
lOMoARcPSD| 58490434
- Lưu đồ thuật toán
- Ví dụ A(5,4) và B(1, 9) với m = -1.25 o dx = 1 5 =
-4 o dy = 9 4 = 5
o m = 5/ -4 = -1,25 o Xs = Xt + 1/m o Ys = Yt +
1
TH8: Hệ số gốc m<-1 và dy<0
- Xét đoạn thẳng có hệ số góc m<-1 và dy<0
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
i + i
, y
i+1
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ
sau:
i
x
i
y
i
Xthực
0
5
4
5
1
4
5
4.2
2
3
6
3.4
3
3
7
2.6
4
2
8
1.8
5
1
9
1
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,int(y +0.5), color)
y < y2
KT
y = y +1
x = x + 1/m
Putpixel(x, int(y +0.5), color)
m = (float) dy/dx
lOMoARcPSD| 58490434
- Với thuật toán DDA việc quyết định chọn x
i+1
x
i
hay x
i
+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, y
i
-1) thuộc về đường thẳng thực và x
i+1
sẽ là giá trị làm tròn của giá trị hoành độ x thực.
- Như vậy o y = mx +b o y
I
= mx
I
+ b o x
I
= (y
I
b )/m o x = (y
i
1 b )/ m
o x = (y
i
b)/m 1/m o xsau
= Xtrước 1/m
- Lưu đồ thuật toán
lOMoARcPSD| 58490434
- Ví dụ A(1,9) và B(5,4) với m o dx = 5 1 = 4 o dy = 4 9 = -5 o m = dy/dx = -5/4 = -
1.25
o Xs = Xt 1/m o Ys = Yt - 1
BRESENHAM
TH2: Hệ số gốc 0 <m ≤ 1 và
dx < 0
- Bresenham vẽ đoạn thẳng đi qua 2 điểm (x1 ,y1 ), (x2 ,y2 ) có 0 < m < 1 và dx > 0
i
x
i
y
i
Xthực
0
1
9
1
1
2
8
1.8
2
3
7
2.6
3
3
6
3.4
4
4
5
4.2
5
5
4
5
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,int(y +0.5), color)
y > y2
KT
y = y - 1
x = x - 1/m
Putpixel(x, int(y +0.5), color)
x1, y1, x2, y2, color
m = (float) dy/dx
lOMoARcPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi, yi) là điểm đã xác định ở 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) là 1 trong 2 trường hợp của hình
vẽ sau:
- Với thuật toán Bresenham, việc quyết định chọn y
i+1
y
i
hay y
i
-1 được dựa vào vị trí
tương đối của điểm I so với điểm S hay điểm P
- Đặt
o d1 = SI = y
i
y o d2 =
IP = y y
i
+ 1
- Việc chọn điểm vẽ (x
i+1
, y
i+1
) là điểm S hay P được dựa vào việc so sánh d1 và d2 o
Nếu d1 < d2: Chọn S o Nếu d1 ≥ d2: chọn P - Ta có:
o d1 d2 = y
i
y ( y y
i
+ 1) o d1 - d2 = y
i
y y
+ y
i
-1
o d1 d2 = -2y + 2y
i
-1
- Với y = mx + b
o d1 d2 = -2(mx + b) + 2y
i
- 1 o d1 d2 = -2mx -2b
+ 2y
i
- 1
- Ta thấy m là số thực nên việc tính toán chậm. Do đó thay vì xét dấu d1 – d2 ta xét dấu đại
lượng có giá trị nguyên khác có quan hệ với d1 – d2 và khử Dx
- Đặt p
i
= dx(d1 d2) o p
i
= dx(-2y + 2y
i
-1)
- Mà y = mx + b
o y
I
= mx
I
+ b
o y = m(x
i
- 1) +b
o y = dy/dx(x
i
1) + b
- Suy ra
lOMoARcPSD| 58490434
o p
i =
dx(-2y + 2y
i
-1)
o p
i
= -2dxy + 2dx y
i
- dx dy
o p
i
= -2dx(
dx
(x
i
-1) +b) + 2dxy
i
- dx o
p
i
= -2dyx
i
+ 2dy - 2bdx + 2dxy
i
- dx
o p
i
= -2dyx
i
+ 2dxy
i
+ C (với C = 2dy
+ 2bdx - dx) I(x
i
-1, y)
- Ta có
o p
i
= -2dyx
i
+ 2dxy
i
+ C (1)
o pi+1 = -2dyxi+1 + 2dxyi+1 + C (2)
- Lấy (2) – (1) ta được
o pi+1 - pi = 2dx(yi+1 - yi ) 2dy(xi+1 - xi ) o pi+1 - pi = 2dx(yi+1 - yi ) 2dy(xi -1 - xi ) o
pi+1 = pi + 2dy + 2dx(yi+1 - yi )
- Từ đây ta suy ra được cách tính p
i+1
từ p
i
như sau:
o Nếu p
i
< 0 thì dx(d1-d2) < 0
d1-d2 > 0 => d1 > d2
=> Chọn P => y
i+1
= y
i
1
p
i+1
= p
i
+ 2dy -
2dx o Nếu p
i
0 thì dx(d1-d2) 0
d1 - d2 0 => d1 d2
=> Chọn S => y
i+1
= y
i
p
i+1
= p
i
+2dy
- Giá trị p
0
được tính từ điểm vẽ đầu tiên là (x1, y1)
o p
i
= -2dyx
i
+ 2dy - 2bdx + 2dxy
i
- dx o p
0
= -2dyx
1
+ 2dy -
2bdx + 2dxy
1
- dx o p
0
= -2dyx
1
+ 2dy - 2bdx + 2dx(mx
1
+b)
-
dx o p
0
= -2dyx
1
+ 2dy - 2bdx + 2dxmx
1
+ 2bdx -dx
o p
0
= -2dyx
1
+ 2dy - 2bdx + 2dyx
1 +
2bdx dx(với m = dy/dx
=> dy = mdx) o p
0
= 2dy -dx
lOMoARcPSD| 58490434
- Ví dụ vẽ đoạn thẳng AB, A(9,5) và B(4,3) o Ta có
dx = 4 -9 = -5
dy = 3 -5 = -2
p
o
= 2dy -dx =2(-2) + 5 =1
const1 = 2dy -2dx = 2(-2) -2(-5) =6
const2 = 2dy = 2*-2 = -4
i
pi
x
i
y
i
(x,y)
0
1
9
5
(9,5)
-
Lưu đồ thuật toán
S
Đ
Đ
S
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,y, color)
KT
p += 2dy -2dx
y = y - 1
Putpixel(x, y, color)
p = 2dy - dx
x > x2
p < 0
p += 2dy
x = x- 1
lOMoARcPSD| 58490434
1
-3
8
5
(8,5)
2
3
7
4
(7,4)
3
-1
6
4
(6,4)
4
5
5
3
(5,3)
5
1
4
3
(4,3)
TH3: Hệ số gốc m>1 và dy > 0
- Bresenham vẽ đoạn thẳng đi qua 2 điểm (x1 ,y1 ), (x2 ,y2 ) có m>1 và dy > 0
- Với các đoạn thẳng dạng này, nếu (xi, yi) là điểm đã xác định ở 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) là 1 trong 2 trường hợp của hình
vẽ sau:
- Với thuật toán Bresenham, việc quyết định chọn x
i+1
x
i
hay x
i
+1 được dựa vào vị trí
tương đối của điểm I so với điểm S hay điểm P
- Đặt
o d1 = IS = x - x
i
o d2 = PI = x
i
+ 1 x
- Việc chọn điểm vẽ (x
i+1
, y
i+1
) là điểm S hay P được dựa vào việc so sánh d1 và d2 o
Nếu d1 < d2: Chọn S o Nếu d1 ≥ d2: chọn P - Ta có:
o d1 d2 = x - x
i
- (y
i
+ 1 x) o d1 -
d2 = x - x
i
- x
i
-1 + x o d1 d2 = 2x -
2x
i
- 1
- Với y = mx + b => x = (y – b )/m o d1 d2 = 2( y
m
b
) - 2x
i
- 1
lOMoARcPSD| 58490434
- Ta thấy m là số thực nên việc tính toán chậm. Do đó thay vì xét dấu d1 – d2 ta xét dấu
đại lượng có giá trị nguyên khác có quan hệ với d1 – d2 và khử Dy
- Đặt p
i
= dy(d1 d2) o p
i
= dy(2x -2x
i
- 1)
- Mà y = mx + b => x = (y b )/m o y
I
= mx
I
+ b o x
I
= (y
I
b )/m o x = (y
i
+1 b)/m o
x = yi+dy1bdx
- Suy ra
o pi = dy(2x -2xi - 1) o p
i
= 2dyx
2dyx
i
dy o p
i
= 2dy( yi
+
dy
1
b
dx) -
2dyx
i
dy o p
i
= 2dx(y
i
+1 b) -
2dyx
i
dy o p
i
= 2dxy
i
+ 2dx 2dbx
- 2dyx
i
dy o p
i
= 2dxy
i
-
2dyx
i
+ C
(Với C= 2dx – 2dxb - dy ) I(x, y
i+1
)
- Ta có
o p
i
= 2dxy
i
-
2dyx
i
+ C (1)
o pi+1 = 2dxyi+1 - 2dyxi +1 + C (2)
- Lấy (2) – (1) ta được
o pi+1 - pi = 2dx(yi+1 - yi ) 2dy(xi +1 - xi
) o pi+1 - pi = 2dx(yi +1 - yi )
2dy(xi +1 - xi ) o pi+1 = pi + 2dx -
2dy(xi +1 - xi )
- Từ đây ta suy ra được cách tính p
i+1
từ p
i
như sau:
o Nếu pi < 0 thì dy(d1-d2) < 0
d1- d2 < 0 => d1 < d2
=> Chọn S => x
i +1
= x
i
pi+1 = pi + 2dx o Nếu p
i
0 thì dy(d1-d2) 0
d1 - d2 0 => d1 d2
=> Chọn P => x
i +1
= x
i
+1
p
i+1
= p
i
+2dx 2dy
- Giá trị p
o
được tính từ điểm vẽ đầu tiên là (x1, y1) o p
i
= 2dxy
i
+ 2dx 2dbx - 2dyx
i
dy o p
o =
2dxy
1
+ 2dx 2dbx - 2dyx
1
dy o p
o
= 2dx(mx
1
+ b) + 2dx 2dbx - 2dyx
1
dy o p
o
= 2dyx
1
+ 2bdx + 2dx 2dbx - 2dyx
1
dy ( với m = dy/dx => dx = dy/m) o p
o
= 2dx dy
lOMoARcPSD| 58490434
-
Lưu đồ thuật toán
Đ
S
Đ
S
BD
dx = x2 - x1
dy = y2 y1
x = x1
y = y1
Putpixel(x,y, color)
KT
p += 2dx -2dy
x = x + 1
p = 2dx - dy
y < y2
p < 0
p += 2dx

Preview text:

lOMoAR cPSD| 58490434 DDA TH2: Hệ số gốc 0
- Xét đoạn thẳng có hệ số góc 0 < m dx < 0
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình i + i , yi+1 vẽ sau:
- Với thuật toán DDA việc quyết định chọn yi+1 yi hay yi+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (xi-1, y) thuộc về đường thẳng thực và y
sẽ là giá trị làm tròn của giá trị tung độ y thực. i+1
- Như vậy o y = mx +b o yI = mxI + b o y = m(xi -1) +b o y = mxi – m +b o y = (mxi + b) – m o ysau = ytrước – m - Lưu đồ thuật toán lOMoAR cPSD| 58490434 BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 m = (float) dy/dx x = x1 y = y1
Putpixel(x,int(y +0.5), color) S Đ x > x2 KT x = x - 1 y = y - m
Putpixel(x, int(y +0.5), color) i - xi yi ythực
Ví dụ A(8, 5) và B(4, 3) ta có m =0.5 0 8 5 5 - 1 7 5 4.5
o dx = 4 – 8 = -4 o dy = 3 - 5 = - 2 6 4 4 2 o m = dy / dx = -2/-4 = 0.5 3 5 4 3.5 o 4 4 3 3 xs = xt -1 o ys = yt – m
TH3: Hệ số gốc m>1 và dy > 0
- Xét đoạn thẳng có hệ số góc m>1 và dy > 0 lOMoAR cPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình i + i , yi+1 vẽ sau:
- Với thuật toán DDA việc quyết định chọn xi+1 xi hay xi+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, yi +1) thuộc về đường thẳng thực và x
sẽ là giá trị làm tròn của giá trị hoành độ x thực. i+1
- Như vậy o y = mx +b o yI = mxI + b o x –
I = (yi b)/m o x = (yi +1 – b) /m o xsau = xtrước + 1/m - Lưu đồ thuật toán lOMoAR cPSD| 58490434 BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 m = (float) dy/dx x = x1 y = y1
Putpixel(x,int(y +0.5), color) y < y2 KT y = y +1 x = x + 1/m
Putpixel(x, int(y +0.5), color)
Ví dụ: A(2,5), B(6,10) với m= 1.25 - d i xi yi xthực x = 6 – 2 =4 - 0 2 5 2 dy = 10 -5 = 5 1 3 6 2.8 - m = 5/4 = 1.25 2 4 7 3.6 3 4 8 4.4 - x 4 5 9 5.2 s = xt +1/m 5 6 10 6 - ys = yt + 1
TH4: Hệ số gốc m>1 và dy < 0 lOMoAR cPSD| 58490434
- Xét đoạn thẳng có hệ số góc m>1 và dy < 0
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình i + i , yi+1 vẽ sau:
- Với thuật toán DDA việc quyết định chọn xi+1 xi hay xi-1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, yi - 1) thuộc về đường thẳng thực và x sẽ là giá trị i+1
làm tròn của giá trị hoành độ x thực. - Như vậy o y = mx + b o yi = mxi + b o xI = (yI – b)/m o x = (y – i 1 – b)/m o xsau = xtrước – 1/m - Lưu đồ thuật toán lOMoAR cPSD| 58490434 BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 m = (float) dy/dx x = x1 y = y1
Putpixel(x,int(y +0.5), color) y > y2 KT y = y - 1 x = x - 1/m
Putpixel(x, int(y +0.5), color) -
dx = 1 – 5 = -4 dy = 4 – 9 = -5 i xi yi xthực
m = -5/-4 = 1.25 Xs = Xt – 1/m 0 5 9 5 1 4 8 4.2 Ys = Yt - 1 2 3 7 3.4 3 3 6 2.6 4 2 5 1.8 5 1 4 1
TH5: Hệ số gốc -1 0
- Xét đoạn thẳng có hệ số góc -1 0 lOMoAR cPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ i + i , yi+1 sau:
- Với thuật toán DDA việc quyết định chọn yi+1 yi hay yi-1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (xi +1, y) thuộc về đường thẳng thực và yi+1
sẽ là giá trị làm tròn của giá trị tung độ y thực. - Như vậy o Y = mx + b o yI = mxI + b o y = m(xi +1 ) + b o y = mxi + m + b o ysau = ytrước + m lOMoAR cPSD| 58490434 - Lưu đồ thuật toán BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 m = (float) dy/dx x = x1 y = y1
Putpixel(x,int(y +0.5), color) x < x2 KT x=x + 1 y = y + m
Putpixel(x, int(y +0.5), color) i - x i y i Ythực o o o o o TH6: Hệ số gốc -1
- Xét đoạn thẳng có hệ số góc -1 lOMoAR cPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ i + i , yi+1 sau:
- Với thuật toán DDA việc quyết định chọn yi+1 yi hay yi+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (xi -1, y) thuộc về đường thẳng thực và yi+1
sẽ là giá trị làm tròn của giá trị tung độ y thực. - Như vậy o y = mx +b
o yI = mxI + b o y = m(xi -1) +b o y = mxi – m +b o ysau = ytrước - m - Lưu đồ thuật toán lOMoAR cPSD| 58490434 BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 m = (float) dy/dx x = x1 y = y1
Putpixel(x,int(y +0.5), color) x > x2 KT x = x - 1 y = y - m
Putpixel(x, int(y +0.5), color)
- Ví dụ A(7,6) và B(2,10) với m = -0.8 o dx = 2 i xi yi Ythực
- 7 = -5 o dy = 10 – 6 = 4 o m = dy/dx = 4/-5 0 7 6 6
= -0.8 o Xs = Xt – 1 o Ys = Yt - m 1 6 6 6.8
TH7: Hệ số gốc m < 2 5 7 7.6 -1 và dy > 3 4 8 8.4 0 4 3 9 9.2 5 2 10 10
- Xét đoạn thẳng có hệ số góc m < -1 và dy > 0 lOMoAR cPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ i + i , yi+1 sau:
- Với thuật toán DDA việc quyết định chọn xi+1 xi hay xi-1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, yi +1) thuộc về đường thẳng thực và xi+1
sẽ là giá trị làm tròn của giá trị hoành độ x thực.
- Như vậy o y = mx + b o yI = mxI + b o x – I = (yI b )/m o x = (yi + 1 - b)/m o x = (yi – b)/m +1/m o xsau = xtrước + 1/m lOMoAR cPSD| 58490434 - Lưu đồ thuật toán BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 m = (float) dy/dx x = x1 y = y1
Putpixel(x,int(y +0.5), color) y < y2 KT y = y +1 x = x + 1/m
Putpixel(x, int(y +0.5), color)
- Ví dụ A(5,4) và B(1, 9) với m = -1.25 o dx = 1 i xi yi Xthực – 5 = -4 o dy = 9 – 4 = 5 0 5 4 5
o m = 5/ -4 = -1,25 o Xs = Xt + 1/m o Ys = Yt 1 4 5 4.2 + 1 2 3 6 3.4
TH8: Hệ số gốc m< 3 3 7 2.6 -1 và dy<0 4 2 8 1.8
- Xét đoạn thẳng có hệ số góc m<-1 và dy<0 5 1 9 1
- Với các đoạn thẳng dạng này, nếu (xi , yi ) là điểm đã xác định ở bước thứ i (điểm màu
đen) thì điểm cần chọn (x
) ở bước thứ (i + 1) là 1 trong 2 trường hợp của hình vẽ i + i , yi+1 sau: lOMoAR cPSD| 58490434
- Với thuật toán DDA việc quyết định chọn xi+1 xi hay xi+1 được dựa vào phương trình
đường thẳng y = mx + b. Nghĩa là ta sẽ tính: I (x, yi -1) thuộc về đường thẳng thực và xi+1
sẽ là giá trị làm tròn của giá trị hoành độ x thực. - Như vậy o y = mx +b o y – –
I = mxI + b o xI = (yI b )/m o x = (yi 1 – b )/ m
o x = (yi – b)/m – 1/m o xsau = Xtrước – 1/m - Lưu đồ thuật toán lOMoAR cPSD| 58490434 BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 m = (float) dy/dx x = x1 y = y1
Putpixel(x,int(y +0.5), color) y > y2 KT y = y - 1 x = x - 1/m
Putpixel(x, int(y +0.5), color)
- Ví dụ A(1,9) và B(5,4) với m o dx = 5 – 1 = 4 o dy = 4 – 9 = -5 o m = dy/dx = -5/4 = - 1.25 i xi yi Xthực
o Xs = Xt – 1/m o Ys = Yt - 1 0 1 9 1 1 2 8 1.8 BRESENHAM 2 3 7 2.6 3 3 6 3.4 TH2: Hệ số gốc 0 4 4 5 4.2 dx < 0 5 5 4 5
- Bresenham vẽ đoạn thẳng đi qua 2 điểm (x1 ,y1 ), (x2 ,y2 ) có 0 < m < 1 và dx > 0 lOMoAR cPSD| 58490434
- Với các đoạn thẳng dạng này, nếu (xi, yi) là điểm đã xác định ở 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) là 1 trong 2 trường hợp của hình vẽ sau:
- Với thuật toán Bresenham, việc quyết định chọn yi+1yi hay yi -1 được dựa vào vị trí
tương đối của điểm I so với điểm S hay điểm P - Đặt o d1 = SI = yi – y o d2 = IP = y – yi + 1
- Việc chọn điểm vẽ (x
) là điểm S hay P được dựa vào việc so sánh d1 và d2 o i+1 , yi+1
Nếu d1 < d2: Chọn S o Nếu d1 ≥ d2: chọn P - Ta có:
o d1 – d2 = yi – y –( y – yi
+ 1) o d1 - d2 = yi – y – y + yi -1 o d1 – d2 = -2y + 2yi -1 - Với y = mx + b
o d1 – d2 = -2(mx + b) + 2yi - 1 o d1 – d2 = -2mx -2b + 2yi - 1
- Ta thấy m là số thực nên việc tính toán chậm. Do đó thay vì xét dấu d1 – d2 ta xét dấu đại
lượng có giá trị nguyên khác có quan hệ với d1 – d2 và khử Dx
- Đặt pi = dx(d1 – d2) o pi = dx(-2y + 2yi -1) - Mà y = mx + b o yI = mxI + b o y = m(xi - 1) +b o y = dy/dx(xi – 1) + b - Suy ra lOMoAR cPSD| 58490434 o pi = dx(-2y + 2yi -1)
o pi = -2dxy + 2dx yi - dx dy
o pi = -2dx(dx(xi -1) +b) + 2dxyi - dx o
pi = -2dyxi + 2dy - 2bdx + 2dxyi - dx o p + C (với C = 2dy i = -2dyxi + 2dxyi
+ 2bdx - dx) I(xi-1, y) - Ta có o pi = -2dyxi + 2dxyi + C (1)
o pi+1 = -2dyxi+1 + 2dxyi+1 + C (2)
- Lấy (2) – (1) ta được
o pi+1 - pi = 2dx(yi+1 - yi ) – 2dy(xi+1 - xi ) o pi+1 - pi = 2dx(yi+1 - yi ) – 2dy(xi -1 - xi ) o
pi+1 = pi + 2dy + 2dx(yi+1 - yi )
- Từ đây ta suy ra được cách tính pi+1 từ pi như sau:
o Nếu pi < 0 thì dx(d1-d2) < 0
d1-d2 > 0 => d1 > d2
=> Chọn P => yi+1 = yi – 1
pi+1 = pi + 2dy - 2dx o Nếu pi 0 thì dx(d1-d2) 0
d1 - d2 0 => d1 d2
=> Chọn S => yi+1= yi pi+1 = pi +2dy
- Giá trị p0 được tính từ điểm vẽ đầu tiên là (x1, y1)
o pi = -2dyxi + 2dy - 2bdx + 2dxyi - dx o p0 = -2dyx1 + 2dy -
2bdx + 2dxy1 - dx o p0 = -2dyx1 + 2dy - 2bdx + 2dx(mx1+b) -
dx o p0 = -2dyx1 + 2dy - 2bdx + 2dxmx1 + 2bdx -dx
o p0 = -2dyx1 + 2dy - 2bdx + 2dyx1 + 2bdx – dx(với m = dy/dx
=> dy = mdx) o p0 = 2dy -dx lOMoAR cPSD| 58490434 - Lưu đồ thuật toán BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 p = 2dy - dx x = x1 y = y1 Putpixel(x,y, color) S Đ p < 0 S Đ x > x2 p += 2dy -2dx p += 2dy KT y = y - 1 x = x- 1 Putpixel(x, y, color) -
Ví dụ vẽ đoạn thẳng AB, A(9,5) và B(4,3) o Ta có dx = 4 -9 = -5 dy = 3 -5 = -2 po = 2dy -dx =2(-2) + 5 =1
const1 = 2dy -2dx = 2(-2) -2(-5) =6 const2 = 2dy = 2*-2 = -4 i pi xi yi (x,y) 0 1 9 5 (9,5) lOMoAR cPSD| 58490434 1 -3 8 5 (8,5) 2 3 7 4 (7,4) 3 -1 6 4 (6,4) 4 5 5 3 (5,3) 5 1 4 3 (4,3)
TH3: Hệ số gốc m>1 và dy > 0 -
Bresenham vẽ đoạn thẳng đi qua 2 điểm (x1 ,y1 ), (x2 ,y2 ) có m>1 và dy > 0 -
Với các đoạn thẳng dạng này, nếu (xi, yi) là điểm đã xác định ở 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) là 1 trong 2 trường hợp của hình vẽ sa u: -
Với thuật toán Bresenham, việc quyết định chọn xi+1xi hay xi +1 được dựa vào vị trí
tương đối của điểm I so với điểm S hay điểm P - Đặt o d1 = IS = x - x o i d2 = PI = xi + 1 – x - Việc chọn điểm vẽ (x
) là điểm S hay P được dựa vào việc s i+1 , yi+1 o sánh d1 và d2 o
Nếu d1 < d2: Chọn S o Nếu d1 ≥ d2: chọn P - Ta có:
o d1 – d2 = x - xi - (yi + 1 – x) o d1 -
d2 = x - xi - xi -1 + x o d1 – d2 = 2x - 2xi - 1 b -
Với y = mx + b => x = (y – b )/m o d1 – d2 = 2( ym ) - 2xi - 1 lOMoAR cPSD| 58490434 -
Ta thấy m là số thực nên việc tính toán chậm. Do đó thay vì xét dấu d1 – d2 ta xét dấu
đại lượng có giá trị nguyên khác có quan hệ với d1 – d2 và khử Dy -
Đặt pi = dy(d1 – d2) o pi = dy(2x -2xi - 1) -
Mà y = mx + b => x = (y – b )/m o y –
I = mxI + b o xI = (yI b )/m o x = (yi +1 – b)/m o
x = yi+dy1−bdx - Suy ra
o pi = dy(2x -2xi - 1) o pi = 2dyx – 1−b 2dyx –
i dy o pi = 2dy( yi+dy dx) - 2dyx –
i dy o pi = 2dx(yi +1 – b) - 2dyx –
i dy o pi = 2dxyi + 2dx – 2dbx - 2dyx –
i dy o pi = 2dxyi - 2dyxi + C
(Với C= 2dx – 2dxb - dy ) I(x, yi+1) - Ta có
o pi = 2dxyi - 2dyxi + C (1)
o pi+1 = 2dxyi+1 - 2dyxi +1 + C (2) - Lấy (2) – (1) ta được
o pi+1 - pi = 2dx(yi+1 - yi ) 2dy(xi +1 - xi
) o pi+1 - pi = 2dx(yi +1 - yi ) –
2dy(xi +1 - xi ) o pi+1 = pi + 2dx - 2dy(xi +1 - xi ) -
Từ đây ta suy ra được cách tính pi+1 từ pi như sau:
o Nếu pi < 0 thì dy(d1-d2) < 0
d1- d2 < 0 => d1 < d2
=> Chọn S => xi +1 = xi
pi+1 = pi + 2dx o Nếu pi 0 thì dy(d1-d2) 0
d1 - d2 0 => d1 d2
=> Chọn P => xi +1 = xi +1
pi+1 = pi +2dx – 2dy -
Giá trị p được tính từ điểm vẽ đầu tiên là (x1, y1) o – o
pi = 2dxyi + 2dx – 2dbx - 2dyxi dy o p – –
o = 2dxy1 + 2dx – 2dbx - 2dyx1 dy o po = 2dx(mx1 + b) + 2dx – 2dbx - 2dyx1 dy o p –
o = 2dyx1 + 2bdx + 2dx – 2dbx - 2dyx1 dy ( với m = dy/dx => dx = dy/m) o po = 2dx – dy lOMoAR cPSD| 58490434 -
Lưu đồ thuật toán BD x1, y1, x2, y2, color dx = x2 - x1 dy = y2 – y1 p = 2dx - dy x = x1 y = y1 Putpixel(x,y, color) S Đ p < 0 S y < y2 Đ p += 2dx p += 2dx -2dy KT x = x + 1