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

Tài liệu Bài giảng về đồ họa - LineDrawing docx

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 (160.77 KB, 22 trang )

ĐỒ 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
,
,
=
i
y
x
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
y
x
,
là tọa độ
nguyên xác đònh ở bước thứ i, điểm nguyên tiếp theo
(
)
11
,
++ ii
y
x
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
y
x
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
y
x
,
).Hay nói cách khác :
(
)
(
)
1
,
1
,
11
±
±
=
++ iiii
y
x
y
x
.
• 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
1
0
<
<
m

0
>
Dx
.
• Với các đoạn thẳng dạng này, nếu
(
)
ii
y
x
,
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
y
x
ở 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

i
y
hay
1
+
i
y

, dựa vào
phương trình của đoạn thẳng
b
mx
y
+
=
. Nghóa là,
ta sẽ tính tọa độ của điểm
(
)
y
x
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
b
x

m
y
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
b
mx
y
+
=
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 :
(
)
b
x
m
b
mx
y
iisau
++=+=

+
1
1
b
mx
y
itrước
+
=
m
y
y
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
(
)
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
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 11/22
T
T
h
h
u
u
a
a
ä
ä
t
t


t
t
o
o
a
a
ù
ù
n
n



M
M
i
i
d
d
P
P
o
o
i
i
n
n
t
t
• Thuật toán MidPoint đưa ra cách chọn
1+i
y

i
y
hay
1
+
i
y
bằng cách so sánh điểm thực Q

(
)
y
x
i
,
1
+
với điểm MidPoint là trung điểm của S và P. Ta có :
♦ Nếu điểm Q nằm dưới điểm MidPoint, ta chọn S.
♦ Nếu điểm Q nằm trên điểm MidPoint ta chọn P.
• Ta có dạng tổng quát của phương trình đường thẳng :
0
=
+
+
C
By
Ax
với
(
)
21121212
,
,
y
x
y
x
C

x
x
B
y
y
A
−=−−=−=
• Đặt
(
)
C
By
Ax
y
x
F
+
+
=
,
, ta có nhận xét :
( )
(
)
( )
( )






>
=
<
thẳng. đường dưới phía nằm yx, nếu,0
thẳng đường vềthuộc yx, nếu,0
thẳng đường trên phía nằm yx, nếu,0
, yxF
Q(x
i
+1, y)
P
S
x
i
x
i
+1
y
i
y
i
+1
MidPoint
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 12/22
• Lúc này việc chọn các điểm S, P ở trên được đưa về
việc xét dấu của
( )







++==
2
1
,12MidPoint2
iii
yxFFp
.
♦ Nếu
0
<
i
p
, điểm MidPoint nằm phía trên đoạn thẳng.
Lúc này điểm thực Q nằm dưới điểm MidPoint nên ta
chọn S, tức là
ii
y
y
=
+1
.
♦ Ngược lại, nếu
0

i

p
, điểm MidPoint nằm phía dưới
đoạn thẳng. Lúc này điểm thực Q nằm trên điểm
MidPoint nên ta chọn P, tức là
1
1
+
=
+ ii
y
y
.
• Mặt khác :






++−






++=−
+++
2
1

,12
2
1
,12
111 iiiiii
yxFyxFpp
( ) ( )






+






+++−






+







+++=−⇔
+++
CyBxACyBxApp
iiiiii
2
1
12
2
1
12
111
(
)
(
)
iiiiii
y
y
Dx
Dy
y
y
B
A
p
p



=

+
=


+++ 111
2
2
2
2
• Như vậy :

Dy
p
p
ii
2
1
+
=
+
, nếu
0
<
i
p
do ta chọn

ii
y
y
=
+1
.

Dx
Dy
p
p
ii
2
2
1
−+=
+
, nếu
0

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

• Ta tính giá trò
0
p

ứng với điểm ban đầu
(
)
00
,
y
x
, với
nhận xét rằng
(
)
00
,
y
x
là điểm thuộc về đoạn thẳng,
tức là có :
0
00
=++
C
By
Ax
( )







+






+++=






++= CyBxAyxFp
2
1
12
2
1
,12
00000
(
)
Dx
Dy

B
A
B
A
C
By
Ax
p
−=+=++++=⇒
2
2
2
2
000
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 13/22
C
C
a
a
â
â
u
u


h
h
o
o

û
û
i
i


k
k
i
i
e
e
å
å
m
m


t
t
r
r
a
a
• Xét thuật toán Bresenham, với cách đặt d
1
và d
2
như
trên, có khi nào d

1
hay d
2
âm hay không ? Cho ví dụ
minh họa.
• Tại sao phải so sánh giá trò p
i
với 0 trong các thuật
toán MidPoint và Bresenham, bản chất của việc so
sánh này là gì ?
• Tại sao phải nhân F(MidPoint) với 2 khi gán cho p
i
theo công thức p
i
=2*F(MidPoint) ?
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 14/22
• Cài đặt thuật toán cho trường hợp 0 ≤ m ≤ 1, Dx<0.
Ta sử dụng thuật toán với trường hợp 0 ≤ m ≤ 1,
Dx>0 đã cài đặt cộng thêm một số thay đổi sau :
♦ Thay biểu thức x=x+1 bằng x=x-1 và y=y+1 bằng y=y-1 vì
trong trường hợp này x và y đều giảm dần.
♦ Nhận xét rằng khi p<0 ta gán p=p+Const1, như vậy để
hướng đến sự cân bằng Const1 phải là một giá trò dương.
Tương tự như vậy, khi p≥0 ta gán p=p+Const2, Const2
phải là giá trò âm.
♦ Từ nhận xét trên, trong các công thức ta sẽ thay Dx
bằng abs(Dx), Dy bằng abs(Dy).
• Mở rộng thuật toán trên để vẽ đoạn thẳng trong
trường hợp m bất kì.

♦ Trường hợp đặc biệt m=∞ : Đoạn thẳng song song trục
tung nên rất đơn giản khi vẽ.
♦ Trường hợp –1 ≤ m ≤ 1 : Sử dụng các công thức của thuật
toán vẽ trong trường hợp 0≤ m ≤ 1, Dx>0 và thay đổi một
số điểm sau :
v Nếu Dx<0 thì bước nhảy của x sẽ thay bằng –1.
Tương tự nếu Dy<0, bước nhảy của y cũng sẽ là –1.
v Thay Dx bằng abs(Dx), Dy=abs(Dy) trong tất cả các
công thức có chứa Dx, Dy.
♦ Trường hợp m ≤ -1 hay m ≥ 1 :
v Thay đổi vai trò của x và y, nghóa là thay x bằng y, y
bằng x, Dx bằng Dy, Dy bằng Dx trong tất cả các
công thức.
v Thực hiện nguyên tắc về bước nhảy, thay đổi công
thức Dx, Dy như trong trường hợp –1 ≤ m ≤ 1
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 15/22
V
V
e
e
õ
õ


đ
đ
ư
ư
ơ

ơ
ø
ø
n
n
g
g


t
t
r
r
o
o
ø
ø
n
n


b
b
a
a
è
è
n
n
g

g


t
t
h
h
u
u
a
a
ä
ä
t
t


t
t
o
o
a
a
ù
ù
n
n


M

M
i
i
d
d
P
P
o
o
i
i
n
n
t
t
• Do tính đối xứng của đường tròn (C) nên ta chỉ cần
vẽ cung (C
1/8
) là cung 1/8 đường tròn, sau đó lấy đối
xứng. Cung (C
1/8
) được mô tả như sau (cung của phần
tô xám trong hình vẽ) :








≤≤
≤≤
RyR
Rx
2
2
2
2
0
• Như vậy nếu có (x, y) ∈ (C
1/8
) thì các điểm : (y, x), (y,-
x), (x,-y), (-x,-y), (-y,-x), (-y,x), (-x,y) sẽ thuộc (C).
2
R
(x,y)(-x,y)
(y,x)
(-y,x)
(x,-y)(-x,-y)
(-y,-x) (y,-x)
ĐỒ 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.
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 21/22
V
V
e
e
õ
õ


đ
đ
ư
ư
ơ
ơ
ø
ø
n
n
g
g



c
c
o
o
n
n
i
i
c
c
s
s


v
v
a
a
ø
ø


m
m
o
o
ä
ä

t
t


s
s
o
o
á
á


đ
đ
ư
ư
ơ
ơ
ø
ø
n
n
g
g


c
c
o
o

n
n
g
g


k
k
h
h
a
a
ù
ù
c
c
Phương trình tổng quát của các đường conics có dạng :
0
22
=+++++ FEyDxCyBxyAx
. Giá trò của các hằng
số A, B, C, D, E, F sẽ quyết đònh dạng của đường conics, cụ
thể là nếu:





>
=

==<

hyperbol. dạng ,0
parabol dạng ,0
ellipse hay ) 0B và C A(nếu tròn đường dạng ,0
4
2
ACB
Ta sẽ áp dụng ý tưởng của thuật toán MidPoint để vẽ các
đường conics và một số đường cong khác, theo các bước
tuần tự sau:
• Bước 1 : Dựa vào dáng điệu và phương trình đường
cong, để xem thử có thể rút gọn phần đường cong
cần vẽ hay không.
• Bước 2 : Tính đạo hàm để từ đó phân thành các
vùng vẽ :
♦ Nếu
1
)
(
'
0


x
f
thì
{ }




+∈
+=
+
+
(*) 1,
1
1
1
iii
ii
yyy
xx
♦ Nếu
0
)
(
'
1



x
f
thì
{ }



−∈

+=
+
+
(*) 1,
1
1
1
iii
ii
yyy
xx
♦ Nếu
1
)
(
'
>
x
f
thì
{ }



+∈
+=
+
+
(*) 1,
1

1
1
iii
ii
xxx
yy
♦ Nếu
1
)
(
'
−<
x
f
thì
{ }



−∈
+=
+
+
(*) 1,
1
1
1
iii
ii
xxx

yy
ĐỒ HỌA MÁY TÍNH
Dương Anh Đức, Lê Đình Duy Các thuật toán vẽ đường 22/22
• Bước 3 : Xác đònh công thức của
i
p
cho từng trường
hợp để quyết đònh (*) dựa trên dấu của
i
p
.
i
p
thường
là hàm được xây dựng từ phương trình đường cong để
cho
0
=
i
p
nếu
(
)
ii
y
x
,
thuộc về đường cong. Việc
chọn
i

p
cần phải chú ý sao cho thao tác tính
i
p
sau
này hạn chế phép toán trên số thực.
• Bước 4 : Tìm mối liên quan của
1+i
p

i
p
bằng
cách xét hiệu
ii
p
p

+1
.
• Bước 5 : Tính
0
p
và hoàn chỉnh thuật toán.
B
B
a
a
ø
ø

i
i


t
t
a
a
ä
ä
p
p
• Giải thích tại sao chỉ chọn cung 1/8 đường tròn để vẽ
rồi lấy đối xứng mà không mở rộng cho cung 1/16
hay 1/32.
• Giải thích tại sao có thể thay công thức p
0
=5/4-R
bằng công thức p
0
=1-R khi cài đặt.
• Hãy trình bày thuật toán MidPoint vẽ cung 1/8
đường tròn sau :








≤≤
≤≤
2
2
0
2
2
Ry
RxR
• p dụng các bước trên để vẽ đoạn thẳng trong
trường hợp tổng quát.
• Hãy trình bày khung chính của thuật toán vẽ ellipse,
parabol, hyperbol dựa vào các bước trên.

×