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

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

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 (80.29 KB, 5 trang )

ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 16/22
• Chọn điểm bắt đầu để vẽ là điểm (0,R).
• Dựa vào hình vẽ, nếu
(
)
ii
y
x
,
là điểm nguyên đã tìm
được ở bước thứ i, thì điểm
(
)
11
,
++ ii
y
x
ở bước thứ
(i+1) là sự lựa chọn giữa S và P.
• Như vậy :
{ }



−∈
+=
+
+
1,


1
1
1
iii
ii
yyy
xx
• Đặt
(
)
222
, RyxyxF −+=
, ta có :
( )
(
)
( )
( )





>
=
<
tròn. đường ngoài nằm yx, nếu,0
tròn đường trên nằm yx, nếu,0
tròn đường trong nằm yx, nếu,0
, yxF

S
P
MidPoint
y
i
y
i
-1
x
i
x
i
+1
Q(x
i
+1, y)
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 17/22
• Xét
( )






−+==
2
1
,1MidPoint

iii
yxFFp
. Ta có :
♦ Nếu
0
<
i
p
, điểm MidPoint nằm trong đường tròn. Lúc
này điểm thực Q gần S hơn nên ta chọn S, tức

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

i
p
, điểm MidPoint nằm ngoài đường
tròn. Lúc này điểm thực Q gần P hơn nên ta chọn P, tức

1
1

=
+ ii

y
y
.
• Mặt khác :






−+−






−+=−
+++
2
1
,1
2
1
,1
111 iiiiii
yxFyxFpp
( ) ( )
















−++−















−++=−⇔

+++
2
2
2
2
2
1
2
11
2
1
1
2
1
1 RyxRyxpp
iiiiii
(
)
(
)
iiiiiii
yyyyxpp −−−++=−⇔
+++ 1
22
11
32
• Vậy :

3
2

1
+
+
=
+ iii
x
p
p
, nếu
0
<
i
p
do ta chọn
ii
y
y
=
+1
.

5
2
2
1
+

+
=
+ iiii

y
x
p
p
, nếu
0

i
p
do ta chọn
1
1
−=
+ ii
y
y
.

0
p

ứng với điểm ban đầu
(
)
(
)
R
y
x
,

0
,
00
=
.
RRFyxFp −=






−=






−+=
4
5
2
1
,1
2
1
,1
000
ĐỒ HỌA MÁY TÍNH

Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 18/22
Lưu đồ thuật toán MidPoint vẽ đường tròn
Begin
p=5/4-R;
x=0;
y=R;
Put8Pixel(x, y, c);
x<y
Yes
No
p<0
Yes
p=p+2*x+3;
No
p=p+2(x-y)+5;
y=y-1
x=x+1;
Put8Pixel(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 19/22
Cài đặt minh họa thuật toán MidPoint vẽ đường tròn
void CircleMidPoint (int R)
{
int x, y;
x = 0;
y = R;
Put8Pixel(x, y);
p = 1 - R; // 5/4-R
while (x < y)

{
if (p < 0)
p += 2*x + 3;
else
{
p += 2*(x -y) + 5;
y ;
}
x++;
Put8Pixel(x, y);
}
} // CircleMidPoint
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 20/22
• Ví dụ : Vẽ đường tròn tâm I(0,0), bán kính R=15.
i
i
x
x
i
i
y
y
I
I
p
p
i
i
D

D
e
e
l
l
t
t
a
a
1
1
D
D
e
e
l
l
t
t
a
a
2
2
0
0
0
0
1
1
5

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

5
-
-
1
1
1
1
-
-
1
1
4
4
+
+
2
2
*
*
(
(
0
0
)
)
+
+
3
3
5

5
-
-
2
2
3
3
2
2
2
2
1
1
5
5
-
-
6
6
-
-
1
1
1
1
+
+
2
2
*

*
(
(
1
1
)
)
+
+
3
3
7
7
-
-
2
2
1
1
3
3
3
3
1
1
5
5
1
1
-

-
6
6
+
+
2
2
*
*
(
(
2
2
)
)
+
+
3
3
9
9
-
-
1
1
9
9
4
4
4

4
1
1
4
4
-
-
1
1
8
8
1
1
+
+
2
2
*
*
(
(
3
3
-
-
1
1
5
5
)

)
+
+
5
5
1
1
1
1
-
-
1
1
5
5
5
5
5
5
1
1
4
4
-
-
7
7
-
-
1

1
8
8
+
+
2
2
*
*
(
(
4
4
)
)
+
+
3
3
1
1
3
3
-
-
1
1
3
3
6

6
6
6
1
1
4
4
6
6
-
-
7
7
+
+
2
2
*
*
(
(
5
5
)
)
+
+
3
3
1

1
5
5
-
-
1
1
1
1
7
7
7
7
1
1
3
3
-
-
5
5
6
6
+
+
2
2
(
(
6

6
-
-
1
1
4
4
)
)
+
+
5
5
1
1
7
7
-
-
7
7
8
8
8
8
1
1
3
3
1

1
2
2
-
-
5
5
+
+
2
2
(
(
7
7
)
)
+
+
3
3
1
1
9
9
-
-
5
5
9

9
9
9
1
1
2
2
7
7
1
1
2
2
+
+
2
2
(
(
8
8
-
-
1
1
3
3
)
)
+

+
5
5
2
2
1
1
-
-
1
1
1
1
0
0
1
1
0
0
1
1
1
1
6
6
7
7
+
+
2

2
(
(
9
9
-
-
1
1
2
2
)
)
+
+
5
5
2
2
3
3
3
3
1
1
1
1
1
1
1

1
1
1
0
0
9
9
6
6
+
+
2
2
(
(
1
1
0
0
-
-
1
1
1
1
)
)
+
+
5

5
2
2
5
5
7
7
Nhận xét :
• Nếu đặt Delta1 = 2*x+3, Delta2 = 2*(x-y)+5 thì
♦ Do mỗi bước đều tăng x nên sau mỗi lần lặp giá trò
Delta1 luôn tăng 2.
♦ Do y bò giảm 1 khi gặp p≥0 và giữ nguyên giá trò trong
trường hợp ngược lại nên nếu lần lặp trước giá trò p≥0
thì giá trò Delta2 sẽ được tăng 4 và nếu lần lặp trước giá
trò p<0 thì giá trò Delta2 sẽ được tăng 2 mà thôi.
• Hãy tối ưu hóa cài đặt thuật toán MidPoint vẽ đường
tròn từ nhận xét trên.

×