ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 1/22
C
C
a
a
ù
ù
c
c
t
t
h
h
u
u
a
a
ä
ä
t
t
t
t
o
o
a
a
ù
ù
n
n
v
v
e
e
õ
õ
đ
đ
ư
ư
ơ
ơ
ø
ø
n
n
g
g
D
D
a
a
ã
ã
n
n
n
n
h
h
a
a
ä
ä
p
p
• 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à
( )
,...0,, =iyx
ii
. Đâ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
( )
ii
yx ,
là tọa độ
nguyên xác đònh ở bước thứ i, điểm nguyên tiếp theo
( )
11
,
++ ii
yx
sẽ được xác đònh như thế nào.
• Đối tượng hiển thò trên lưới nguyên được liền nét,
các điểm mà
( )
11
,
++ ii
yx
có thể chọn chỉ là một trong
tám điểm được đánh số từ 1 đến 8 trong hình sau
(điểm đen chính là
( )
ii
yx ,
).Hay nói cách khác :
( ) ( )
1,1,
11
±±=
++ iiii
yxyx
.
• Dáng điệu của đường sẽ cho ta gợi ý khi chọn một
trong tám điểm trên. Cách chọ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 độ.
1
23
876
5
4
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 2/22
T
T
h
h
u
u
a
a
ä
ä
t
t
t
t
o
o
a
a
ù
ù
n
n
v
v
e
e
õ
õ
đ
đ
ư
ư
ơ
ơ
ø
ø
n
n
g
g
t
t
h
h
a
a
ú
ú
n
n
g
g
• Xét đoạn thẳng có hệ số góc
10 << m
và
0>Dx
.
• Với các đoạn thẳng dạng này, nếu
( )
ii
yx ,
là điểm
đã xác đònh được ở bước thứ i (điểm màu đen) thì
điểm cần chọn
( )
11
,
++ ii
yx
ở bước thứ (i+1) sẽ là một
trong hai trường hợp như hình vẽ sau :
{ }
+∈
+=
+
+
1,
1
1
1
iii
ii
yyy
xx
• 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 độ.
(x
i
+1, y
i
+1)
1
2
(x
i
+1, y
i
)
x
i
y
i
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 3/22
T
T
h
h
u
u
a
a
ä
ä
t
t
t
t
o
o
a
a
ù
ù
n
n
D
D
D
D
A
A
(
(
D
D
i
i
g
g
i
i
t
t
a
a
l
l
D
D
i
i
f
f
f
f
e
e
r
r
e
e
n
n
t
t
i
i
a
a
l
l
A
A
n
n
a
a
l
l
y
y
z
z
e
e
r
r
)
)
• Việc quyết đònh chọn
1+i
y
là
i
y
hay
1+
i
y
, dựa vào
phương trình của đoạn thẳng
bmxy +=
. Nghóa là,
ta sẽ tính tọa độ của điểm
( )
yx
i
,1+
thuộc về đoạn
thẳng thực. Tiếp đó,
1+i
y
sẽ là giá trò sau khi làm
tròn giá trò tung độ y.
• Như vậy :
( )
( )
yRoundy
bxmy
i
i
=
++=
+1
1
• Nếu tính trực tiếp giá trò thực y ở mỗi bước từ
phương trình
bmxy +=
thì phải 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 :
• Nhận xét rằng :
( )
bxmbmxy
iisau
++=+=
+
1
1
bmxy
itrước
+=
myy
trướcsau
+=⇒
(x
i
, y
i
)
(x
i
+1, y)
(x
i
+1, Round(y))
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 4/22
Lưu đồ thuật toán DDA
Begin
m=Dy/Dx;
x=x1;
y=y1;
putpixel(x, Round(y), c);
x<x2
Yes
No
x=x+1;
y=y+m;
putpixel(x, Round(y),c);
End
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 5/22
• Ví dụ : Cho A(12, 20) và B(22, 27), ta có m= 0.7
i
i
x
x
i
i
y
y
i
i
y
y
0
0
1
1
2
2
2
2
0
0
2
2
0
0
1
1
1
1
3
3
2
2
1
1
2
2
0
0
.
.
7
7
2
2
1
1
4
4
2
2
1
1
2
2
1
1
.
.
4
4
3
3
1
1
5
5
2
2
2
2
2
2
2
2
.
.
1
1
4
4
1
1
6
6
5
5
1
1
7
7
6
6
1
1
8
8
7
7
1
1
9
9
8
8
2
2
0
0
9
9
2
2
1
1
1
1
0
0
2
2
2
2
2
2
7
7
• Cài đặt minh họa thuật toán DDA
#define Round(a) int(a+0.5)
int Color = GREEN;
void LineDDA (int x1, int y1, int x2, int y2)
{
int x = x1;
float y = y1;
float m = float(y2-y1)/(x2-x1);
putpixel(x, Round(y), Color);
for(int i=x1; i<x2; i++)
{
x++;
y +=m;
putpixel(x, Round(y), Color);
}
} // LineDDA
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 6/22
T
T
h
h
u
u
a
a
ä
ä
t
t
t
t
o
o
a
a
ù
ù
n
n
B
B
r
r
e
e
s
s
e
e
n
n
h
h
a
a
m
m
• Gọi
( )
yx
i
,1+
là điểm thuộc đoạn thẳng. Ta có:
( )
bxmy
i
++= 1
.
• Đặt
( )
yyd
yyd
i
i
−+=
−=
1
2
1
• Xét tất cả các vò trí tương đối của y so với
i
y
và
1+
i
y
, việc chọn điểm
( )
11
,
++ ii
yx
là S hay P phụ thuộc
vào việc so sánh d
1
và d
2
hay dấu của
21
dd −
:
♦ Nếu
0
21
<− dd
, ta sẽ chọn điểm S, tức là
ii
yy =
+1
.
♦ Ngược lại, nếu
0
21
≥− dd
, ta sẽ chọn điểm P, tức là
1
1
+=
+ ii
yy
• Xét
( ) ( )
122
21
−−=−=
ii
yyDxddDxp
( )( )
[ ]
1212 −−++=⇒
iii
ybxmDxp
(x
i
+1, y)
P
S
x
i
x
i
+1
y
i
y
i
+1
y
d
1
d
2
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 7/22
• Thay
Dx
Dy
m =
vào phương trình trên ta được :
cDxyDyxp
iii
+−= 22
, với
( )
DxbDyc 122 −+=
.
• Nhận xét rằng nếu tại bước thứ i ta xác đònh được
dấu của
i
p
thì xem như ta xác đònh được điểm cần
chọn ở bước (i+1).
• Ta có :
( ) ( )
cDxyDyxcDxyDyxpp
iiiiii
+−−+−=−
+++
2222
111
( ) ( )
iiiiii
yyDxxxDypp −−−=−⇔
+++ 111
22
( )
1 do ,22
111
+=−−=−⇔
+++ iiiiii
xxyyDxDypp
• Từ đây ta có thể suy ra cách tính
1+i
p
từ
i
p
như sau :
♦ Nếu
0<
i
p
thì
Dypp
ii
2
1
+=
+
do ta chọn
ii
yy =
+1
.
♦ Ngược lại, nếu
0≥
i
p
, thì
DxDypp
ii
22
1
−+=
+
, do
ta chọn
1
1
+=
+ ii
yy
.
• Giá trò
0
p
được tính từ điểm vẽ đầu tiên
( )
00
, yx
theo công thức :
( )
DxbDyDxyDyxcDxyDyxp 1222222
00000
−−+−=+−=
• Do
( )
00
, yx
là điểm nguyên thuộc về đoạn thẳng
nên ta có
bx
Dx
Dy
bmxy +=+=
000
. Thế vào phương
trình trên ta suy ra :
DxDyp −= 2
0
.
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 8/22
Lưu đồ thuật toán Bresenham
Begin
p=2Dy-Dx;
Const1=2Dy;
Const2=2(Dy-Dx);
x=x1;
y=y1;
putpixel(x, y, c);
x<x2
Yes
No
p<0
Yes
p=p+Const1;
No
p=p+Const2;
y=y+1
x=x+1;
putpixel(x,y,c);
End