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

giáo trình lí thuyết đồ họa

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 (8.17 MB, 144 trang )

Trường Đại học Khoa học Huế
Khoa CNTT
WX








Giáo trình






















Huãú, thaïng 10 nàm 2008
Trang 1
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
Chương I: Các yếu tố cơ sở của đồ hoạ


I. Các khái niệm cơ bản
I.1. Thiết bị đồ hoạ và điểm ảnh (Pixel)
Các thiết bị đồ hoạ thông dụng như màn hình máy tính, máy in,… cho phép
chúng ta biểu diễn các hình vẽ trên đó. Các thiết bị đồ hoạ này tạo ra mặt phẳng,
đó là một tập hữu hạn các điểm mà mỗi điểm được đánh một cặp chỉ số nguyên gọi
là toạ độ, thông thường mặt phẳng đồ hoạ do thiết bị tạo ra là một ma trận điểm,
mỗ
i điểm gọi là một Pixel có các thành phần toạ độ là x và y.


(Hình I.1)
I.2. Điểm và Đoạn thẳng trong mặt phẳng
Về mặt toán học thì một đoạn thẳng bao gồm một tập vô hạn các điểm trong mặt
phẳng với cặp toạ độ thực. Song do đặc điểm của các thiết bị hiển thị nên khi biểu
diễn trên thiết bị hiển thị của máy tính (như màn hình, máy in,…) thì được nguyên
hoá thành một tập hữu hạn các cặp toạ độ nguyên (Hình I.1).
Trang 2
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
II. Cỏc thut toỏn v on thng
Phng trỡnh tng quỏt ca mt ng thng c vit di dng:
y=a*x+b
vi

a: l h s gúc hay cũn gi l dc, nú phn ỏnh mi tng quan gia 2
bin s x v y.
b: l khong chn trờn trc honh
Phng trỡnh ng thng i qua 2 im A(x
a
,y
a
) v B(x
b
,y
b
) l:
ab
a
ab
a
xx
xx
yy
yy


=


(II.a)
(vi x
a
<>x
b

v y
a
<>y
b
.
Khi x
a
=x
b
thỡ phng trỡnh l x=x
a

cũn khi y
a
=y
b
phng trỡnh l y=y
a
)
t
thỡ (II.a) tr thnh
ab
ab
yyy
xxx
=
=
aa
yx
x

y
x
x
y
y +





=

baxy +=
vi





+=


=
aa
yaxb
x
y
a
(II.b)
II.1. V on thng da vo phng trỡnh

Khi bit c phng trỡnh ca mt ng chỳng ta hon ton cú th v
c ng biu din cho ng ú nh vo cỏc tớnh toỏn trờn phng trỡnh.
õy ng m ta cn biu din l mt on thng AB vi A(x
a
,y
a
) v B(x
b
,y
b
).
Phng trỡnh biu din c cho bi (II.b) vi
[][
baba
yyyxxx ,;,
]

Quy trỡnh cú th túm tt nh sau:
Nu
xy
: ngha l bin s x bin thiờn nhanh hn bin s y, lỳc ny
m bo tớnh liờn tc ca cỏc im v ta cho bin s x thay i tun t v tớnh
bin s y qua phng trỡnh. C th nh sau:
Trang 3
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
Cho x nhận các giá trị nguyên lần lượt từ x
a
đến x
b
, với mỗi giá trị x ta thực hiện:

¾ Tính y=ax+b thông qua phương trình
¾ Vẽ điểm (x,Round(y)).
Ở đây điểm trên đoạn thẳng có toạ độ là (x,y) song ta không thể vẽ điểm đó
vì giá trị y là một giá trị thực, mà như đã nói ở mục I là các hệ thống biểu
diễn đồ hoạ chỉ có hữu hạn điểm và mỗi điểm có toạ
độ nguyên, Vì thể ta
buột phải minh hoạ cho điểm (x,y) trên đường thẳng thực bởi một điểm trên
hệ thống thiết bị đồ hoạ gần với nó nhất đó là điểm có toạ độ (x,round(y)).

 Ngược lại: nghĩa là biến số y biến thiên nhanh hơn biến số x, lúc này để đảm
bảo tính liên tục của các điểm vẽ ta cho biến số
y thay đổi tuần tự và tính biến
số x qua phương trình. Cụ thể như sau:
Cho y nhận các giá trị nguyên lần lượt từ y
a
đến y
b
, với mỗi giá trị y ta thực hiện:
¾ Tính x=
a
by

(hay
aa
xy
y
x
y
y
x

x +





= )
¾ Vẽ điểm (Round(x),y).

Ví dụ: Cho A(5,4) đến B(10,7) để vẽ đoạn thẳng AB ta thực hiện các bước sau:
Tính

347
5510
=−=−=∆
=−=−=∆
ab
ab
yyy
xxx





=+−=
=


=

1
5
3
aa
yaxb
x
y
a


xy ∆≤∆
nên ta thực hiện theo cách 1 là cho x nhận các giá trị nguyên lần lượt
từ x
a
đến x
b
, với mỗi giá trị x ta thực hiện:
¾ Tính y=ax+b thông qua phương trình
¾ Vẽ điểm (x,Round(y)).
Cụ thể như sau:
Khi x = x
a
= 5: => y = ax+b = 4; Vẽ điểm (5,4)
Khi x = 6: => y = 23/5 = 4.6; Vẽ điểm (6,5)
Khi x = 7: => y = 26/5 = 5.2; Vẽ điểm (7,5)
Trang 4
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
Khi x = 8: => y = 29/5 = 5.8; Vẽ điểm (8,6)
Khi x = 9: => y = 32/5 = 6.4; Vẽ điểm (9,6)
Khi x = 10: => y = 7; Vẽ điểm (10,7)


Kết quả ta có hình vẽ đoạn thẳng AB có thể minh họa như sau:

5 6 7 8 9 10
4 5 6 7
Hình ảnh minh họa một đoạn thẳng từ A(5,4) đến B(10,7)
II.2. Vẽ đoạn thẳng dựa vào thuật toán Bresenham
Từ quy trình vẽ đoạn thẳng trên (II.1) ta thấy đoạn thẳng AB có thể được vẽ
một cách dễ dàng. Song số phép tính cần phải thực hiện trong mỗi bước vẽ còn
lớn, cụ thể là ta còn phải tính 1 phép nhân và 1 phép cộng trên trường số thực và
một phép tính làm tròn (Round). Cũng với tư tưởng như trên song thuật toán
Bresenham hướng tới một sự phân tích bài toán sâu sắc hơn để tìm ra một quy
trình vẽ được các đ
iểm song ít tính toán hơn.
Trong phần này ta chỉ trình bày giải thuật trong trường hợp hệ số góc của
đoạn thẳng
[
]
1,0∈a
. Các trường hợp còn lại của hệ số góc như
[]
+
∞∈ ,1a
;
;
[]
1,−∞−∈a
[
]
0,1


∈a chúng ta có thể lấy đối xứng đoạn thẳng qua các đường phân
giác, OX, hay OY để quy về trường hợp
[
]
1,0

a
.
Trang 5
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
Rừ rng l vỡ
[
]
1,0a
nờn quy trỡnh õy l cho x nhn cỏc giỏ tr nguyờn ln lt
t x
a
n x
b
, vi mi giỏ tr x ta cn phi tỡm ra mt giỏ tr y nguyờn (x,y) chớnh
l to ca im cn minh ho trờn thit b, song giỏ tr y tỡm ra õy phi thụng
qua ớt phộp tớnh toỏn hn quy trỡnh II.1.
Gi thit vi hai im u mỳt A(x
a
,y
a
) v B(x
b
,y

b
) cú to nguyờn v x
a
<x
b
. Rừ
rng im u tiờn cn biu din trờn thit b ú l im cú to (x
a
,y
a
). Nu gi
im chn c u tiờn l (x
0
,y
0
) thỡ
(x
0
,y
0
)= (x
a
,y
a
)
theo lp lun quy np ta:
Gi thit rng n bc th i ta ó chn c im th i, hay núi cỏch khỏc l
im chn th i l (x
i
,y

i
) ó c xỏc nh giỏ tr.
Vy n bc tip theo (i+1) ta s chn im no? Hay núi cỏch khỏc l im
chn th (i+1) l (x
i+1
,y
i+1
) s cú to bng bao nhiờu.
(Chỳ ý: x
i
,y
i
l tờn gi ca to im chn th i, vớ d nh (x
0
,y
0
) l tờn gi ca
im chn u tiờn (i=0) v nú cú giỏ tr l (x
a
,y
a
))
tr li cõu hi ny ta cn da vo mt s lp lun sau:
Nh trờn ó trỡnh by thỡ im chn th i+1 s phi cú honh x bng honh
ca im trc ú cng thờm 1:
Hay x
i+1
=x
i
+1

Gi M l im thuc AB sao cho x
M
=x
i+1
=x
i
+1
thỡ y
M
= ax
M
+b=a(x
i
+1)+b= (ax
i
+b)+a
vy im tip theo thuc on thng m ta cn tỡm minh ho trờn thit b l
M(x
i
+1, (ax
i
+b)+a). Cõu hi t ra l ta s chn im no trong 2 im P(x
i
+1,y
i
)
v Q(x
i
+1,y
i

+1) minh ho cho M trờn thit b ho.
Trang 6
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
x
i

Để trả lời câu hỏi này ta đi xét một biểu thức trung gian:
Đặt d
1
=y
M
-y
P
; và d
2
=y
Q
-y
M
Xét biểu thức:
d
1
-d
2
=(y
M
-y
P
)-( y
Q

-y
M
)=2y
M
-(y
P
+y
Q
) =






+

2
2
QP
M
yy
y

Nếu gọi I là trung điểm của QP thì:
[
]
IM
yydd


=

2
21

Rõ ràng là:
 Nếu d
1
-d
2
<0 thì điểm y
M
<y
I
, suy ra P gần điểm M hơn Q, vậy ta sẽ chọn điểm P
là điểm minh họa cho M trên thiết bị đồ hoạ
 Nếu d
1
-d
2
>0 thì điểm y
M
>y
I
, suy ra Q gần điểm M hơn P, vậy ta sẽ chọn điểm
Q là điểm minh họa cho M trên thiết bị đồ hoạ
 Nếu d
1
-d
2

=0 thì điểm y
M
=y
I
, suy ra khả năng lựa chọn P và Q là như nhau,
song ta phải quyết định chọn một điểm. Trong tình huống này ta quyết định
chọn điểm Q.
Vậy để tìm được điểm minh hoạ tiếp theo ta cần xét dấu của biểu thức d
1
-d
2
. Song
ta thấy biểu thức d
1
-d
2
còn khá phức tạp và phải thực hiện tính toán trên trường số
thực do trong đó có xuất hiện phép chia:
y
M
=(ax
i
+b)+a
x
y
yx
x
y
x
x

y
ayaxax
aaiaai


++





=++−+= ))((
(*)
Để tránh tính biểu thức d
1
-d
2
trên trường số thực người ta hướng tới một biểu thức
tương đương về dấu đó là
)(
21
ddxP
i


=

d
2
d

1
x
i
+1
P
y
i
+1
y
i
I
M
Q
Trang 7
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
Việc đưa vào nhằm loại bỏ mẫu số trong biểu thức (d
x∆
1
-d
2
) để thu được biểu
thức P
i
tính trên trường số nguyên. Thật vậy:
xxyxyP
yyxyyyxyyyxddxP
iMi
iMiiMQPMi
∆−∆−∆=


−∆
=
+
+


=
+
−∆
=
−∆=
22
)122())1(2())(2()(
21

Thay y
M
bởi giá trị ở (*) ta được:
xyxyyxxyyx
xxyyxyyxyxP
aaii
iaaii
∆−∆+∆+∆−∆−∆=




∆+∆
+
∆−∆=

22222
22222
(a)
Ta thấy biểu thức P
i
được xác lập từ toạ độ của điểm chọn thứ i là (x
i
,y
i
).
Vậy P
i+1
sẽ được xác lập từ điểm chọn thứ i+1 là (x
i+1
,y
i+1
) như sau:
xyxyyxxyyxP
aaiii



+

+

−∆−∆=
+++
22222
111

(b)
Vì dấu của P
i
và dấu của (d
1
-d
2
) là tương đương nên có thể tóm tắt quy tắc
chọn điểm tiếp theo như sau:
 Nếu P
i
<0: Thì chọn điểm P làm điểm minh họa cho M trên thiết bị đồ hoạ
Hay nói cách khác là điểm chọn thứ i+1 là (x
i+1
,y
i+1
) sẽ có giá trị bằng P
Nghĩa là: (x
i+1
,y
i+1
)=(x
i
+1,y
i
)
Thay vào (b) ta có:

yP
xyxyyxxyxyP

i
aaiii
∆+=



+

+


∆−+∆=
+
2
2222)1(2
1

 Nếu
: Thì chọn điểm Q là điểm minh họa cho M trên thiết bị đồ hoạ 0≥
i
P
Hay nói cách khác là điểm chọn thứ i+1 là (x
i+1
,y
i+1
) sẽ có giá trị bằng Q
Nghĩa là: (x
i+1
,y
i+1

)=(x
i
+1,y
i
+1)
Thay vào (b) ta có:

xyP
xyxyyxyxxyP
i
aaiii
∆−∆+=



+

+


+
∆−+∆=
+
22
222)1(2)1(2
1

Khi i=0 thì ta có (x
0
,y

0
)=(x
a
,y
a
) thay vào (a) ta có:
xy
xyxyyxxyyxP
aa
∆−∆=
∆−∆+∆+∆−∆−∆=
2
22222
000

Trang 8
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
Vậy từ đây ta thấy được quy trình chọn ra các điểm trên thiết bị để minh hoạ cho
đoạn thẳng AB theo thuật toán Bresenham như sau:
 Điểm chọn đầu tiên (i=0) là (x
0
,y
0
)=(x
a
,y
a
) và giá trị xyP ∆−

=

2
0

 Dựa vào giá trị của P
0
là âm hay dương mà ta lại chọn được điểm tiếp theo
(x
1
,y
1
) và tính được giá trị P
1

 Dựa vào giá trị của P
1
là âm hay dương mà ta lại chọn được điểm tiếp theo
(x
2
,y
2
) và tính được giá trị P
2

 Cứ như vậy ta tìm ra được tập các điểm trên thiết bị đồ hoạ để minh hoạ cho
đoạn thẳng AB.
II.2.a. Tóm tắt thuật toán Bresenham:

Bước 1:
Tính ∆x;∆y
Const1=2∆y; Const2=2∆y-2∆x

P
0
=2∆y-∆x; (x
0
, y
0
) = (x
a
,

y
a
)
Vẽ điểm (x
0
, y
0
)

Bước 2: Với mỗi giá trị i (i=0,1,2,…) ta xét dấu P
i

¾ Nếu P
i
<0: thì chọn điểm tiếp theo là
(x
i+1
,y
i+1
)=(x

i
+1,y
i
)
P
i+1
=P
i
+Const1
¾ Ngược lại (tức Pi ≥ 0): thì chọn điểm tiếp theo là
(x
i+1
,y
i+1
)=(x
i
+1,y
i
+1)
P
i+1
=P
i
+Const2
Vẽ điểm (x
i+1
,y
i+1
) vừa tìm được


Bước 3: Lặp lại bước 2 với những giá trị i tiếp theo, cho đến khi điểm tìm được
trùng với B, nghĩa là x
i+1
=x
b
thì thuật toán kết thúc.
II.2.b. Ví dụ:
Cho đoạn thẳng AB với A(5,6) và B(10,10). Sử dụng thuật toán Bresenham chúng ta có
thể tìm được các Pixel cần vẽ để biểu diễn đoạn AB trên màn hình như sau:

Bước 1:
∆x = 10-5 = 5; ∆y = 10-6 = 4;
Trang 9
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
Const1 = 2∆y = 8; Const2 = 2∆y-2∆x = 8-10 = -2;
P
0
= 2∆y-∆x = 8-5 = 3; (x
0
, y
0
) = (x
a
,

y
a
) = (5,6)
Vẽ điểm (x
0

, y
0
)

Bước 2: Bước lặp:
i = 0:
Ta có P
0
= 3≥0 nên:
(x
1
,y
1
) = (x
0
+1,y
0
+1) = (6,7)
P
1
=P
0
+Const2 = 3+(-2)=1
Vẽ điểm (x
1
, y
1
) = (6,7)
i = 1:
Ta có P

1
= 1≥0 nên:
(x
2
,y
2
) = (x
1
+1,y
1
+1) = (7,8)
P
2
=P
1
+Const2 = 1+(-2)= -1
Vẽ điểm (x
2
, y
2
) = (7,8)
i = 2:
Ta có P
2
= -1<0 nên:
(x
3
,y
3
) = (x

2
+1,y
2
) = (8,8)
P
3
=P
2
+Const1 = -1+8 = 7
Vẽ điểm (x
3
, y
3
) = (8,8)
i = 3:
Ta có P
3
= 7≥0 nên:
(x
4
,y
4
) = (x
3
+1,y
3
+1) = (9,9)
P
4
=P

3
+Const2 = 7+(-2) = 5
Vẽ điểm (x
4
, y
4
) = (9,9)
i = 4:
Ta có P
4
= 5≥0 nên:
(x
5
,y
5
) = (x
4
+1,y
4
+1) = (10,10)
P
5
=P
4
+Const2 = 5+(-2) = 3
Vẽ điểm (x
5
, y
5
) = (10,10)

Vì x
5
= x
b
= 10 nên kết thúc vòng lặp và cũng là kết thúc thuật toán.

Hình vẽ minh họa:
Trang 10
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi

(Cỏc Pixel vuụng mu chớnh l hỡnh nh th hin ca on thng AB
trờn mn hỡnh mỏy tớnh)
5 6 7 8 9 10
6 7 8
9
10
II.2.c. Hng dn cho cỏc trng hp h s gúc ngoi khong [0,1]
Gi s cho A(0,50), B(100,10) dng on thng AB ta cn tin hnh mt s
phõn tớch:
x = x
b
x
a
= 100 0 = 100
y = y
b
y
a
= 10 50 = -40
Suy ra h s gúc a = y/x = -0.4 [-1,0)

Lỳc ny ta cn ly i xng ca AB qua trc OX c CD vi C(0,-50) D(100,-
10) nờn xột trờn on thng CD ta cú
x = x
d
x
c
= 100 0 = 100
y = y
d
y
c
= -10 (-50) = 40
Suy ra h s gúc a = y/x = 0.4 [1,0] tha món iu khin ca thut toỏn
Bresenham. T ú chỳng ta cú th ỏp dng thut toỏn Bresenham tớnh toỏn ra
cỏc im cn v trờn CD nhng chỳng ta s khụng v nú (vỡ mc ớch chỳng ta l
Trang 11
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
vẽ AB) mà lại lấy đối xứng qua trục OX (tức đối xứng ngược lại với lúc đầu) rồi
mới vẽ, thì lúc này các điểm vẽ ra sẽ là hình ảnh của đoạn thẳng AB. Như thế CD
chỉ đóng vai trò trung gian để áp dụng được thuật toán còn kết quả sau cùng ta thu
được vẫn là hình ảnh minh họa cho đoạn AB.
Áp dụng tương tự:
+ trường hợp hệ số góc
),1(
+
∞∈a
, lúc này chúng ta cần lấy đối xứng qua đường
phân giác của góc phần tư thứ nhất để hệ số góc được quy về [0,1].
+ trường hợp hệ số góc
)1,(


−∞∈a , lúc này chúng ta cần lấy 2 lần đối xứng. Đối
xứng qua OX rồi tiếp đến đối xứng qua đường phân giác.
Xét điểm M(x,y). Đối xứng qua OX ta được tọa độ mới là (x,-y). tiếp đến
lấy đối xứng qua tia phân giác góc phần tư thứ nhất ta được (-y,x).
II.2.d. Cài đặt thuật toán
 Sinh viên cần xây dựng một thủ tục vẽ đoạn thẳng AB với giả thiết đầ
u vào
thoả hệ số góc thuộc đoạn [0,1]
 Sinh viên cần xây dựng một thủ tục vẽ đoạn thẳng tổng quát cho phép vẽ đoạn
thẳng AB trong mọi trường hợp, và một chương trình minh hoạ có sử dụng thủ
tục này.

III. Các thuật toán vẽ đường tròn
Phương trình đường tròn tâm O (gốc toạ
độ) bán kính R (nguyên)là:
X
2
+Y
2
=R
2
Trong mục này ta chỉ cần tìm
phương pháp vẽ đường tròn tâm tại gốc
toạ độ. Nếu ta vẽ được đường tròn tâm
tại gốc toạ độ thì bằng cách thêm vào
phép tịnh tiến ta được đường tròn tâm
(x,y) bất kỳ.
Ở đây ta thấy để vẽ được đường tròn
tâm gốc toạ độ ta chỉ cần tìm phương

pháp vẽ cung một phần tám AB, và với các phép lấy đối xứng ta sẽ có các phầ
n
còn lại của đường tròn.
B
A
Trang 12
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
Vi cung AB thỡ rừ rng dc ca nú thuc on [-1,0]. iu ny ta cú th
d dng thy qua gúc ca tip tuyn vi cung AB hay qua o hm phng
trỡnh biu din cung AB.
Vỡ cung AB cú dc trong khong [-1,0], nờn ta suy ra rng trờn ton b
cung AB khi bin s x tng thỡ bin s y gim, v tc thay i ca y chm
hn ca x. T õy ta cú th ra mt quy trỡnh dng cung AB l:
Cho bin s x nh
n ln lt cỏc giỏ tr nguyờn t x
a
n x
b
. Vi mi giỏ tr x ta
thc hin:
ắ Tỡm giỏ tr y nguyờn tng ng im cú to nguyờn (x,y) s l im
gn nht im (x,y
circle
) thuc ng trũn
ắ V im (x,y) tỡm c v cỏc i xng ca nú cú c ng trũn
Trong mc ny ta s i tỡm hiu 2 thut toỏn cho phộp dng ng trũn (thc
cht l dng cung AB v cỏc i xng ca nú) mt cỏch hiu qu v mt tc
.
III.1. Thut toỏn v ng trũn MidPoint
Thut toỏn MidPoint hay cũn gi l thut toỏn xột im gia.

im u tiờn c chn v s l im A(0,R), ngha l: (x
0
,y
0
)=(0,R)
Gi s n bc th i ta ó chn c im (x
i
,y
i
) v. Cõu hi t ra l n
bc th i+1 ta s chn im (x
i+1
,y
i+1
) cú giỏ tr bng bao nhiờu?
Vỡ im tip theo s chn theo quy tc ó núi trờn, nờn cú honh x tng
mt giỏ so vi giỏ tr ca im chn trc, hay núi cỏch khỏc l:
x
i+1
=x
i
+1
ng thi vỡ trờn cung AB khi x tng thỡ y gim v tc thay i ca y
chm hn ca x, nờn rừ rng ta thy l vi giỏ tr x tng 1 thỡ giỏ tr y s gim
i mt lng -1y0. M im chn bc trc l (x
i
,y
i
) nờn im chn tip
theo (x

i+1
,y
i+1
) ch cú th l mt trong hai im P(x
i
+1,y
i
) v Q(x
i
+1,y
i
-1).

x
i
x
i
+1
Q
y
i
-1
I
y
i
P
Cung AB
Trang 13
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi


quyt nh c im chn l P hay Q chỳng ta hng n mt biu thc
m du ca nú cho phộp chỳng ta ra quyt nh chn im no.
Trc ht chỳng ta xột hm:
Vi mt im M(x,y) thỡ rừ rng ta cú:

circle
(M) = (x,y) = x + y R <0 khi v

y) = x + y R >0 khi v

y) = x + y R =0 khi v
T kt qu trờn, nu ta gi I l trung im ca PQ thỡ I(x
i
+1,y
i
-0.5) v:
t P
i
=
circle
(I)=
circle
(x
i
+1,y
i
-0.5)=(x
i
+1) + (y
i

-0.5) R (a)
Khi P
i
=
circle
(I) <0 thỡ im I nm trong ng trũn (tõm O bỏn kớnh R), vỡ th

) >0 thỡ im I nm ngoi ng trũn, vỡ th im Q s gn vi

a chn P
Vy t õy ta thy cú th da vo du ca biu thc P
i
ra quyt nh chn im
hut toỏn c n gin ngi ta ti u hoỏ vic tớnh P
i
theo cụng thc
uy h
+1,y
i+1
-0.5)=(x
i+1
+1)
2
+ (y
i+1
-0.5)
2
R
2
(b)

gha l (x
i+1
,y
i+1
)=(x
i
+1,y
i
).
5)
2
R
2
= P
i
+ 2(x
i
+1)+1 = P
i
+ 2x
i
+3
N
,y
i+1
)=(x
i
+1,y
i
-

hay vo (b) ta c:
222
),( Ryxyxf
circle
+=
2 2 2
K
>0
ch khi im M nm trong ng trũn (tõm
O bỏn kớnh R)

circle
(M) = (x,
2 2 2
M
<0
ch khi im M nm ngoi ng trũn (tõm
O bỏn kớnh R)

circle
(M) = (x,
2 2 2
R
ch khi im M nm trờn ng trũn
2 2 2
im P s gn vi ng trũn hn im Q, do ú ta s chn im P lm im
biu din (v).
Khi P
i
=

circle
(I
ng trũn hn im P, do ú ta s chn im Q lm im biu din.
Khi P
i
=
circle
(I) =0 thỡ im I nm trờn ng trũn, suy ra kh nng l
v Q l nh nhau, song ta phi quyt nh chn mt im. Trong tỡnh hung
ny thut toỏn quy nh chn im Q.
tip theo.
t
tr i:
P
i+1
=(x
i+1
Du ca P
i
s quyt nh giỏ tr P
i+1
c th nh sau:
Nu P
i
<0: thỡ im chn tip theo l P(x
i
+1,y
i
), n
Thay vo (b) ta c:

P
i+1
=(x
i
+1+1)
2
+ (y
i
-0.
u P
i
0: thỡ im chn tip theo l Q(x
i
+1,y
i
-1), ngha l (x
i+1
1).
T
Trang 14
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
P
i+1
=(x
i
+1+1)
2
+ (y
i
-1 - 0.5)

2
– R
2
= P
i
+ 2(x
i
+1)+1-2(y
i
-0.5)+1 = P
i
+ 2(x
i


Đầu tiên ta chọn điểm A(0,R), nghĩa là (x
0
,y
0
)=(0,R), Thay vào (a) ta có:
y
i
) +5
RRP −=+−=
51
1

44
0
Vậy quy trình vẽ được thực hiện như sau:

0 0 0
ợc điểm vẽ tiếp theo (x
1
,y
1
) và giá trị P
1

nhất
 m đáng chú ý ở đây các giá trị P tiếp theo có được bằng cách cộng với
 Tính P
, vẽ điểm (x ,y )=(0,R)
 Dựa vào dấu của P
0
ta lại chọn đư
 Dựa vào dấu của P
1
ta lại chọn được điểm vẽ tiếp theo (x
2
,y
2
) và giá trị P
2

 Quá trình trên được lặp đi lặp lại cho đến khi ta vẽ được điểm nguyên gần
với B.
Một điể
giá trị P trước đó với một lượng nguyên 2x
i
+3 hoặc 2(x

i
–y
i
) +5 tuỳ theo dấu
của P. Song nếu giá trị P khởi đầu là
4
1
1
0
+−= RP là một giá trị thực sẽ làm
cho việc tính các giá trị P tiếp theo cũ lý trên trường số thực. Một
điều dễ thấy là nếu ta thay đổi giá trị P
ng phải xử
III ng tròn MidPoint :
0
khởi đầu là 1-R thì dấu của P
0
và các P
i

có được sau đó không hề thay đổi về dấu (mặt dù có bị giảm một lượng 0.25)
do đó kết quả thuật toán không hề bị thay đổi, song các tính toán giá trị P chỉ
phải tính trên trường số nguyên.
.1.a. Tóm tắt thuật toán vẽ đườ

Bước 1: P = 1 – R; (x ,y )=(0,R)
0 0 0
0 0



Vẽ điểm (x
,y )
ớc 2: Với mỗi giá trị i (i=0,1,2,…) ta xét dấu P
i

¾ Ngược
thì chọn điểm tiếp theo là
i+1 i
Vẽ điể
i+1 i+1
ợc
¾ Nếu P
i
<0: thì chọn điểm tiếp theo là
(x
i+1
,y
i+1
)=(x
i
+1,y
i
)
P
i+1
=P
i
+ 2x
i
+3

lại (tức P
i
≥ 0):
(x
i+1
,y
i+1
)=(x
i
+1,y
i
-1)
P
=P
i
+ 2(x
i
- y ) +5
m (x
,y ) vừa tìm đư
Trang 15
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
 Bước 3: Lặp lại bước 2 với những giá trị i tiếp theo, cho đến khi ta vẽ được
điểm nguyên gần nhất với B, nghĩa là x
i+1
= Trunc(x
b
) = )
2
(

R
Trunc
thì thuật
toán kết thúc.
III.1.b. Cài đặt
 Sinh viên cần xây dựng một thủ tục vẽ đường tròn theo thuật toán đã trình bày
trên.

(Hình vẽ minh họa)
Trang 16
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
III.2. Thut toỏn v ng trũn Bresenham
Lp lun tng t thut toỏn trờn song khụng dựng hm
circle
m dựng biu
thc (d
1
d
2
). Cú th trỡnh by thut gii nh sau:
im u tiờn c chn v s l im A(0,R), ngha l: (x
0
,y
0
)=(0,R)
Gi s n bc th i ta ó chn c im (x
i
,y
i
) v. Cõu hi t ra l n

bc th i+1 ta s chn im (x
i+1
,y
i+1
) cú giỏ tr bng bao nhiờu?
Vỡ im tip theo s chn theo quy tc ó núi trờn s cú honh x tng
mt giỏ so vi giỏ tr ca im chn trc, hay núi cỏch khỏc l:
x
i+1
=x
i
+1
ng thi vỡ trờn cung AB khi x tng thỡ y gim v tc thay i ca y
chm hn ca x, nờn rừ rng ta thy l vi giỏ tr x tng 1 thỡ giỏ tr y s gim
i mt lng -1y0. M im chn bc trc l (x
i
,y
i
) nờn im chn tip
theo (x
i+1
,y
i+1
) ch cú th l mt trong hai im P(x
i
+1,y
i
) v Q(x
i
+1,y

i
-1).
quyt nh c im chn l P hay Q chỳng ta hng n mt biu thc
m du ca nú cho phộp chỳng ta ra quyt nh chn im no.
t: d
1
=y
P
2
- y
2
v d
2
=y
2
- y
Q
2


(giỏ tr y õy chớnh l tung ca cung AB ng vi honh x = x
i
+1)
t P
i
= d
1
d
2
= y

P
2
+ y
Q
2
- 2y
2
= y
i
2
+ (y
i
-1)
2
- 2(R
2
- x
i+1
2

)= y
i
2
+ (y
i
-
1)
2
- 2(R
2

- (x
i
+1)
2
)
= y
i
2
+ (y
i
-1)
2
- 2R
2
+ 2(x
i
+1)
2
(a)
Du ca biu thc P
i
cho phộp xỏc nh im chn tip theo l P hay Q.
Khi P
i
<0: thỡ im P s gn vi ng trũn hn im Q, do ú ta s chn im
P lm im biu din (v).
Khi P
i
>0: thỡ im Q s gn vi ng trũn hn im P, do ú ta s chn im
Q lm im biu din.

Khi P
i
=0: khong cỏch t P v Q n ng trũn u bng nhau, nờn ta cú th
chn P hay Q u c. Trong tỡnh hung ny thut toỏn quy c chn im Q
lm im biu din.
Vy t õy ta thy cú th da vo du ca biu thc P
i
ra quyt nh chn im
tip theo.
thut toỏn c n gin ngi ta ti u hoỏ vic tớnh P
i
theo cụng thc
truy hi:
Trang 17
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
P
i+1
= y
i+1
2
+ (y
i+1
-1)
2
- 2R
2
+ 2(x
i+1
+1)
2

(b)
Dấu của P
i
sẽ quyết định giá trị P
i+1
cụ thể như sau:
 Nếu P
i
<0: thì điểm chọn tiếp theo là P(x
i
+1,y
i
), nghĩa là (x
i+1
,y
i+1
)=(x
i
+1,y
i
).
Thay vào (b) ta được:
P
i+1
= y
i
2
+ (y
i
-1)

2
- 2R
2
+ 2((x
i
+1)+1)
2
= P
i
+ 2(2(x
i
+1)+1) = P
i
+4x
i
+6
 Nếu P
i
≥0: thì điểm chọn tiếp theo là Q(x
i
+1,y
i
-1), nghĩa là (x
i+1
,y
i+1
)=(x
i
+1,y
i

-
1).
Thay vào (b) ta được:
P
i+1
= (y
i
-1)
2
+ (y
i
-2)
2
- 2R
2
+ 2((x
i
+1)+1)
2
= P
i
+( -4y
i
+4) + 2(2(x
i
+1)+1)
= P
i
+ 4(x
i

- y
i
) +10
Đầu tiên ta chọn điểm A(0,R), nghĩa là (x
0
,y
0
)=(0,R), Thay vào (a) ta có:
P
0
= y
0
2
+ (y
0
-1)
2
- 2R
2
+ 2(x
0
+1)
2
= R
2
+ (R-1)
2
-2R
2
+ 2

= R
2
+ R
2
-2R +1 -2R
2
+ 2 = 3 - 2R
Vậy quy trình vẽ được thực hiện như sau:
 Tính P
0
, vẽ điểm (x
0
,y
0
)=(0,R)
 Dựa vào dấu của P
0
ta lại chọn được điểm vẽ tiếp theo (x
1
,y
1
) và giá trị P
1

 Dựa vào dấu của P
1
ta lại chọn được điểm vẽ tiếp theo (x
2
,y
2

) và giá trị P
2

 Quá trình trên được lặp đi lặp lại cho đến khi ta vẽ được điểm nguyên gần nhất
với B.
III.2.a. Tóm tắt thuật toán vẽ đường tròn Bresenham :

Bước 1: P
0
= 3 - 2R; (x
0
,y
0
)=(0,R)
Vẽ điểm (x
0
,y
0
)

Bước 2: Với mỗi giá trị i (i=0,1,2,…) ta xét dấu P
i

¾ Nếu P
i
<0: thì chọn điểm tiếp theo là
(x
i+1
,y
i+1

)=(x
i
+1,y
i
)
P
i+1
=P
i
+ 4x
i
+6
¾ Ngược lại (tức P
i
≥ 0): thì chọn điểm tiếp theo là
Trang 18
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
(x
i+1
,y
i+1
)=(x
i
+1,y
i
-1)
P
i+1
=P
i

+ 4(x
i
- y
i
) +10
V im (x
i+1
,y
i+1
) va tỡm c

Bc 3: Lp li bc 2 vi nhng giỏ tr i tip theo, cho n khi ta v c
im nguyờn gn nht vi B, ngha l x
i+1
= Trunc(x
b
) = )
2
(
R
Trunc
thỡ thut
toỏn kt thỳc.
III.2.b. Ci t
Sinh viờn cn ci t mt th tc v ng trũn theo thut toỏn Bresenham v
chng trỡnh s dng th tc v cỏc ng trũn ngu nhiờn.
IV. Thut toỏn v Ellipse
Phng trỡnh chớnh tc ca Ellipse cú dng: 1
2
2

2
2
=+
b
y
a
x
(I)

dng c ellipse rừ rng
l ta ch cn tỡm cỏch dng
cung AB, cũn cỏc phn cũn
li d dng cú c bng
cỏch ly i xng. Song vi
t tng chung dng mt
ng bt k l cn phi xỏc
nh ra cỏc min m trờn
ton min ú mt bin s
bin thiờn nhanh hn mt
bin s khỏc.
A(0,b)
C(x
0
, y
0
)
B(a,0)
Rừ rng trờn cung AB thỡ dc gim liờn tc t im A ( d
c bng 0) n B
( dc tin n -). Xột v tc bin thiờn ca 2 bin s thỡ:

Tc bin thiờn ca bin s X gim dn t A n B.
Tc bin thiờn ca bin s Y tng dn t A n B.
Rừ rng trờn cung AB phi cú mt im m ti ú tc bin thiờn ca X v Y l
bng nhau (song x t
ng thỡ y gim), ú chớnh l im m ti ú cú dc bng -1.
Gi C(x
0
,y
0
) l im nm trờn cung AB ca ellipse m tip tuyn ti ú cú dc
bng -1. Khi ú tip tuyn d ca ellipse s cú dng:
Trang 19
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
1
2
0
2
0
=+
b
yy
a
xx

Mt khỏc do dc ca d l:
1
2
0
2
0

=
ay
bx
nờn ta suy ra
0
2
2
0
x
a
b
y = ( õy ta cú x
0
0) =>
2
0
4
4
2
0
x
a
b
y = (a)
mt khỏc do C thuc ellipse nờn ta cú:
1
2
2
0
2

2
0
=+
b
y
a
x
(b)
T (a) v (b) ta suy ra:
22
2
0
ba
a
x
+
=
v
22
2
0
ba
b
y
+
=

Ta s trỡnh by gi thut v cung AC (i t A n C theo chiu kim ng h).
Cung CB c thc hin mt cỏch tng t khi ta i vai trũ ca x v y. Cỏc phn
cũn li ca ellipse cú c bng cỏch ly i xng.

Trờn cung AC dc nm trong on [0,-1], ngha l x tng thỡ y gim v tc
bin thiờn ca x ln hn ca y. Vy nờn t tng ca thut gi
i dng cung
AC s l cho tham s x bin thiờn tun t t x
a
n x
c
vi cỏc giỏ tr nguyờn, v
vi mi giỏ tr x nh vy ta tỡm mt giỏ tr y nguyờn gn nht vi giỏ tr y thc
ca ellipse tng ng vi x.
Sau õy chỳng ta s tỡm hiu thut toỏn Bresenham ỏp dng cho dng ellipse.
IV.1. Thut toỏn Bresenham cho v hỡnh Ellipse
Rừ rng im u tiờn c chn v s l im A(0,b), ngha l:
(x
0
,y
0
)=(0,b)
Gi s n bc th i ta ó chn c im (x
i
,y
i
) v. Cõu hi t ra l n
bc th i+1 ta s chn im (x
i+1
,y
i+1
) cú giỏ tr bng bao nhiờu?
Vỡ im tip theo s cú honh x tng mt giỏ tr so vi giỏ tr ca im
chn trc, hay núi cỏch khỏc l:

x
i+1
=x
i
+1
ng thi vỡ trờn cung AC khi x tng thỡ y gim v tc thay i ca y
chm hn ca x, nờn rừ rng ta thy l vi giỏ tr x tng 1 thỡ giỏ tr y s gim
i mt lng -1y0. M im chn bc trc l (x
i
,y
i
) nờn im chn tip
theo (x
i+1
,y
i+1
) ch cú th l mt trong hai im P(x
i
+1,y
i
) v Q(x
i
+1,y
i
-1).
Trang 20
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
quyt nh c im chn l P hay Q chỳng ta hng n mt biu thc
m du ca nú cho phộp chỳng ta ra quyt nh chn im no.
t: d

1
=y
P
2
- y
2
v d
2
=y
2
- y
Q
2


(giỏ tr y õy l tung ca cung AC ng vi honh ang xột x
i+1
)
t P
i
= (d
1
d
2
).a
2

= [y
P
2

+ y
Q
2
- 2y
2
]a
2
= [ y
i
2
+ (y
i
-1)
2
- 2(
2
2
1
22
)(
a
xab
i+


)]a
2
= [y
i
2

+
(y
i
-1)
2
-
2
222
))1((2
a
xab
i
+
]a
2

= y
i
2
.a
2
+ (y
i
-1)
2
.a
2
- 2b
2
[a

2
(x
i
+1)
2
]
= y
i
2
.a
2
+ (y
i
-1)
2
.a
2
- 2b
2
a
2
+ 2b
2
(x
i
+1)
2
(a)
(lng a
2

c a vo nhm mc ớch kh mu ca (d
1
-d
2
) song khụng lm cho
P
i
v (d
1
- d
2
) khỏc du )
Du ca biu thc P
i
cho phộp xỏc nh im chn tip theo l P hay Q.
Khi P
i
<0: thỡ im P s sỏt vi cung AC hn im Q, do ú ta s chn im P
lm im biu din (v).
Khi P
i
>0: thỡ im Q s sỏt vi cung AC hn im P, do ú ta s chn im Q
lm im biu din.
Khi P
i
=0: khong cỏch t P v Q n cung AC u bng nhau, nờn ta cú th
chn P hay Q u c. Trong tỡnh hung ny thut toỏn quy c chn im Q
lm im biu din
Vy t õy ta thy cú th da vo du ca biu thc P
i

ra quyt nh chn im
tip theo.
thut toỏn c n gin ngi ta ti u hoỏ vic tớnh P
i
theo cụng thc
truy hi:
P
i+1
= y
i+1
2
.a
2
+ (y
i+1
-1)
2
.a
2
- 2b
2
a
2
+ 2b
2
(x
i+1
+1)
2
(b)

Du ca P
i
s quyt nh giỏ tr P
i+1
c th nh sau:
Nu P
i
<0: thỡ im chn tip theo l P(x
i
+1,y
i
), ngha l (x
i+1
,y
i+1
)=(x
i
+1,y
i
).
Thay vo (b) ta c:
P
i+1
= y
i
2
.a
2
+ (y
i

-1)
2
.a
2
- 2b
2
a
2
+ 2b
2
[(x
i
+1)+1]
2
Trang 21
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
= P
i
+2b
2
[2(x
i
+1)+1]
= P
i
+ 2b
2
(2x
i
+ 3)

 Nếu P
i
≥0: thì điểm chọn tiếp theo là Q(x
i
+1,y
i
-1), nghĩa là (x
i+1
,y
i+1
)=(x
i
+1,y
i
-
1).
Thay vào (b) ta được:
P
i+1
= (y
i
-1)
2
.a
2
+ (y
i
-2)
2
.a

2
- 2b
2
a
2
+ 2b
2
[(x
i
+1)+1]
2
= P
i
+ a
2
(-4y
i
+4) + 2b
2
[2(x
i
+1)+1]
= P
i
+ 4a
2
(1-y
i
) + 2b
2

(2x
i
+ 3)
= P
i
+ 2b
2
(2x
i
+ 3) + 4a
2
(1-y
i
)
Đầu tiên ta chọn điểm A(0,b), nghĩa là (x
0
,y
0
)=(0,b), Thay vào (a) ta có:
P
0
= y
0
2
.a
2
+ (y
0
-1)
2

.a
2
- 2b
2
a
2
+ 2b
2
(x
0
+1)
2
=b
2
a
2
+(b-1)
2
a
2
-2a
2
b
2
+ 2b
2
= b
2
a
2

+a
2
b
2
-2a
2
b +a
2
-2a
2
b
2
+2b
2
= -2a
2
b +a
2
+2b
2

= a
2
(1-2b) + 2b
2
Vậy quy trình vẽ được thực hiện như sau:
 Tính P
0
, vẽ điểm (x
0

,y
0
)=(0,b)
 Dựa vào dấu của P
0
ta lại chọn được điểm vẽ tiếp theo (x
1
,y
1
) và giá trị P
1

 Dựa vào dấu của P
1
ta lại chọn được điểm vẽ tiếp theo (x
2
,y
2
) và giá trị P
2

 Quá trình trên được lặp đi lặp lại cho đến khi ta vẽ được điểm nguyên gần nhất
với C.
IV.1.a. Tóm tắt thuật toán Bresenham cho vẽ Ellipse:

Bước 1: P
0
= a
2
(1-2b) + 2b

2
; (x
0
,y
0
)=(0,b)
Vẽ điểm (x
0
,y
0
)

Bước 2: Với mỗi giá trị i (i=0,1,2,…) ta xét dấu P
i

¾ Nếu P
i
<0: thì chọn điểm tiếp theo là
(x
i+1
,y
i+1
)=(x
i
+1,y
i
)
P
i+1
=P

i
+ 2b
2
(2x
i
+ 3)
¾ Ngược lại (tức P
i
≥ 0): thì chọn điểm tiếp theo là
Trang 22
Chổồng 1: Caùc yóỳu tọỳ cồ sồớ cuớa õọử hoỹa - Nguyóựn Hổợu Taỡi
(x
i+1
,y
i+1
)=(x
i
+1,y
i
-1)
P
i+1
=P
i
+ 2b
2
(2x
i
+ 3) + 4a
2

(1-y
i
)
V im (x
i+1
,y
i+1
) va tỡm c

Bc 3: Lp li bc 2 vi nhng giỏ tr i tip theo, cho n khi ta v c
im nguyờn gn nht vi C, ngha l x
i+1
= Trunc(x
C
) =
)(
22
2
ba
a
Trunc
+
thỡ
thut toỏn kt thỳc.

Chỳ ý:
Túm tt thut toỏn trờn ch ỏp dng cho on AC. dng on BC ta cn
cú s thay i vai trũ ca ca x v y cng nh a v b. C th dng c
cung BC cn hoỏn i trong ton b thut toỏn: x thnh y v y ngc li
thnh x, a thnh b v b ngc li thnh a.

Vỡ thut toỏn ch v n Trunc(x
c
) nờn nu phn l ca x
c
ln hn 0.5 (vớ d
Trunc(x
c
=7.65)=7). Nu iu ny c thc hin trờn c 2 cung AC v BC
thỡ s dn n hỡnh nh ghộp ni ca 2 cung l cung AB s thiu 1 im ti
C. trỏnh trỡnh trng ny thỡ chỳng ta cú th ỏp dng Trunc() trờn mt
cung, cũn cung cũn li ỏp dung Round().
IV.1.b. Ci t thut toỏn Bresenham cho dng Ellipse
Sau õy l mt chng trỡnh vớ d cho thut toỏn. Chng trỡnh ci t th tc v
Ellipse cú tờn l Bre_Ellipse theo thut toỏn trỡnh by trờn, v chng trỡnh s
dng th tc Bre_Ellipse v
cỏc hỡnh Ellipse mt cỏch ngu nhiờn.
uses graph,crt;

procedure init;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,' ');
ErrCode := GraphResult;
if ErrCode <> grOk then
begin Writeln('Graphics error:', GraphErrorMsg(ErrCode));readln;halt end;
end;

procedure Bre_Ellipse(xt,yt:Integer;A,B:longint);
var x,y,P,Const1, Const2:longint; color:byte;
Trang 23
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi

Procedure Put(x,y:integer);
begin
putpixel(x+xt,-y+yt,color);
putpixel(x+xt,y+yt,color);
putpixel(-x+xt,-y+yt,color);
putpixel(-x+xt,y+yt,color);
end;
begin
Color:=Getcolor;

{Ve cung AC}
const1:=trunc(sqr(a) / sqrt(sqr(a)+sqr(b)));
x:=0;y:=b;P:=a*a*(1-2*b)-2*b*b;put(x,y);
repeat
if p<0 then
p:=p+2*b*b*(2*x+3)
else
begin
p:=p+2*b*b*(2*x+3)+4*a*a*(1-y);
y:=y-1;
end;
x:=x+1;
put(x,y);
until x=const1;


{Ve cung BC}
{const2:=trunc(sqr(b) / sqrt(sqr(a)+sqr(b)));}
Const2:=Const1+1;

{
Thay vì quá trình lặp được xét trên y, chúng ta có thể làm điều tượng tự bằng cách
xét trên x. Biết rằng trên toàn bộ cung AB thì x sẽ biến thiên từ 0 đến a, mà trước đó
khi dựng cung AC ta đã cho x biến thiên trong đoạn [0, Const1], vậy trên cung BC x
phải biến thiên trong đoạn [Const1+1, a ] thì sẽ đảm bảo hai cung AC và CB ghép nối
liên tục với nhau.
}

y:=0;x:=a;P:=b*b*(1-2*a)-2*a*a;put(x,y);
repeat
if p<0 then
p:=p+2*a*a*(2*y+3)
else
begin
p:=p+2*a*a*(2*y+3)+4*b*b*(1-x);
x:=x-1;
end;
y:=y+1;
put(x,y);
until x=const2;
end;
var a,b:longint;
Trang 24
Chæång 1: Caïc yãúu täú cå såí cuía âäö hoüa - Nguyãùn Hæîu Taìi
BEGIN
init;

randomize;
repeat
a:=random(100)+50;b:=random(100)+50;
setcolor(random(15)+1);
Bre_Ellipse(getmaxx div 2,getmaxy div 2,a,b);
until readkey=#27;
closegraph;
END.
V. Bài tập cuối chương
1. Cho điểm A(5,7) và B(15,15). Sử dụng thuật toán Bresenham đã cho để tìm
toạ độ các điểm vẽ (x
i
, y
i
).
2. Cài đặt một thủ tục vẽ đường thẳng tổng quát (xử lý được với tất cả mọi tình
huống) theo thuật toán Bresenham.
3. Sử dụng thuật toán vẽ đường tròn Midpoint để tính giá trị các điểm vẽ (x
i
,
y
i
) biết rằng R=20.
4. Cài đặt một thủ tục vẽ đường tròn theo thuật toán MidPoint.
5. Cài đặt một thủ tục cho phép tô màu phần diện tích bên trong của đường
tròn. Thủ tục có dạng FillCircle(x,y:integer; R:word; FillColor: byte);
6. Cài đặt một thủ tục tô màu phần bên trong của một Ellipse.
7. Hãy xây dựng một thuật toán để dựng đường cong bậc 2 (Parabol) dạng
tổng quát:
y = ax

2
+ bx + c
trên một khoảng xác định [x
1
,x
2
]
8. Viết chương trình vẽ Parabol:
9. Hãy xây dựng một thư viện đồ hoạ riêng với các thủ tục vẽ các đường cơ
bản do bạn tự viết.
Trang 25

×