Tải bản đầy đủ (.pdf) (5 trang)

Bài giảng đồ họa : Các thuật toán vẽ đường part 2 ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (81.92 KB, 5 trang )

ĐỒ 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
(
)
y
x
i
,
1
+
là điểm thuộc đoạn thẳng. Ta có:
(
)
b
x
m

y
i
+
+
=
1
.
• Đặt
( )
yyd
y
y
d
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

1
+
i
y
, việc chọn điểm
(

)
11
,
++ ii
y
x
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
d
d

:
♦ Nếu
0
21
<−
d
d
, ta sẽ chọn điểm S, tức là
ii
y
y
=
+1
.

♦ Ngược lại, nếu
0
21


d
d
, ta sẽ chọn điểm P, tức là
1
1
+=
+ ii
y
y
• Xét
(
)
(
)
1
2
2
21
−−=−=
ii
y
y
Dx
d
d

Dx
p
(
)
(
)
[
]
1
2
1
2


+
+
=

iii
y
b
x
m
Dx
p
(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 :
c
Dxy
Dyx
p
iii
+−=
2
2

, với
(
)
Dx
b
Dy
c
1
2
2

+
=
.
• 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ó :
(
)
(
)
c
Dxy
Dyx
c
Dxy

Dyx
p
p
iiiiii
+


+

=

+++
2
2
2
2
111
(
)
(
)
iiiiii
y
y
Dx
x
x
Dy
p
p




=


+++ 111
2
2
(
)
1

do

,
2
2
111
+
=


=


+++ iiiiii
x
x
y

y
Dx
Dy
p
p
• 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ì
Dy
p
p
ii
2
1
+
=
+
do ta chọn
ii
y

y
=
+1
.
♦ Ngược lại, nếu
0

i
p
, thì
Dx
Dy
p
p
ii
2
2
1

+
=
+
, do
ta chọn
1
1
+
=
+ ii
y

y
.
• Giá trò
0
p
được tính từ điểm vẽ đầu tiên
(
)
00
,
y
x
theo công thức :
(
)
Dx
b
Dy
Dxy
Dyx
c
Dxy
Dyx
p
1
2
2
2
2
2

2
00000
−−+−=+−=
• Do
(
)
00
,
y
x
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 :
Dx
Dy
p
−=
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
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 9/22
• Ví dụ : Cho A(12, 20) và B(22, 27),
• Ta có
♦ Dx = 22-12 = 10, Dy=27-20=7
♦ Const1 = 2Dy = 14, Const2 = 2(Dy – Dx) = -6
♦ p
0
= 2Dy – Dx = 14-10 = 4
i
i
x

x
i
i
y
y
i
i
p
p
i
i
0
0
1
1
2
2
2
2
0
0
4
4
1
1
1
1
3
3
2

2
1
1
-
-
2
2
2
2
1
1
4
4
2
2
1
1
1
1
2
2
3
3
1
1
5
5
2
2
2

2
6
6
4
4
1
1
6
6
2
2
3
3
0
0
5
5
1
1
7
7
2
2
4
4
-
-
6
6
6

6
1
1
8
8
2
2
4
4
8
8
7
7
1
1
9
9
2
2
5
5
2
2
8
8
2
2
0
0
2

2
6
6
-
-
4
4
9
9
2
2
1
1
2
2
6
6
1
1
0
0
1
1
0
0
2
2
2
2
2

2
7
7
4
4
• Nhận xét
♦ Thuật toán Bresenham chỉ làm việc trên số nguyên và
các thao tác trên số nguyên chỉ là phép cộng và phép
dòch bit (phép nhân 2) điều này là một cải tiến làm tăng
tốc độ đáng kể so với thuật toán DDA. Ý tưởng chính của
thuật toán nằm ở chỗ xét dấu
i
p
để quyết đònh điểm kế
tiếp, và sử dụng công thức truy hồi
ii
p
p

+1
để tính
i
p
bằng các phép toán đơn giản trên số nguyên.
♦ Thuật toán này cho kết quả tương tự như thuật toán
DDA.
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 10/22
• Cài đặt minh họa thuật toán Bresenham
void LineBres (int x1, int y1, int x2, int y2)

{
int Dx, Dy, p, Const1, Const2;
int x, y;
Dx = x2 - x1;
Dy = y2 - y1;
p = 2*Dy - Dx; // Dy <<1 - Dx
Const1 = 2*Dy; // Dy <<1
Const2 = 2*(Dy-Dx); // (Dy-Dx) <<1
x = x1;
y = y1;
putpixel(x, y, Color);
for(i=x1; i<x2; i++)
{
if (p<0)
p += Const1;
else
{
p += Const2;
y++;
}
x++;
putpixel(x, y, Color);
}
} // LineBres

×