Tải bản đầy đủ (.docx) (150 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 (2.61 MB, 150 trang )

Trường

Đại

học

Khoa

học

Huế
Khoa

CNTT
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ố




sở

của

đồ

hoạ
I. Các

khái

niệm



bản
I.1. Thiết

bị

đồ

hoạ



đ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



Đ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:
y



y
a
y
b


y

a
=
x



x
a
x
b


x
a
(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

x

=

x
b


x
a

y

=

y
b


y
a
thỡ

(II.a) tr thnh

y =
y
x

x
y
x
x
a
+

y
a


y

x

b

=


ax
a

+

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



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
x



[
x
a
,


x
b
]
;

y



[
y
a
,

y
b
]
Quy

trỡnh



th

túm

tt

nh


sau:
Nu

y



x : 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:


y

=

ax

+

b

vi

a =
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=
y − b
a
(hay

x =
∆x
∆y
y −
∆x
∆y
y
a

+

x
a
)
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

x

=

x
b


x
a

=

10



5

=


5

y

=

y
b


y
a

=

7



4

=

3
 ∆y 3
 ∆x


∆y




∆x

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)
 a =
=
 
b

=


ax
a

+

y
a

=

1
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
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ưở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


a


[
0,1
]

.

Các

trường

hợp

còn

lại

của

hệ

số

góc

như

a



[
1,
+∞
]
;
a ∈

[
− ∞,−1
]
;

a ∈

[
−1,0
]
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

a


[
0,1
]

.

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ỡ

a


[
0,1
]

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
)




to



nguyờn

v

x
a
<x
b
.

Rừ
rng

im

u

tiờn

cn

biu

din


trờn

thit

b

ú

l

im



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



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





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
xi
xi+1
yi
I
P
d1
M
yi+1
d2
Q
Để 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:


y
P



+


y
Q

2
Nếu

gọi

I



trung

điểm

của


QP

thì:

d
1


d
2

=

2
[
y
M



y
I
]
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



Q




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



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:
(*)
∆x ∆x ∆x
Để

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à

d
1
-d
2

=(y
M
-y
P
)-(

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

=

2


y
M





y
M
=(ax
i
+b)+a

=

(ax
i

+

(

ax
a
+

y
a
))

+

a


=
x
i

x
a
+

y
a
+
∆y ∆y ∆y
P

=


x(d
1


d
2
)
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


x

vào

nhằm

loại

bỏ

mẫu

số

trong

biểu

thức

(d
1
-d
2
)


để

thu

được

biểu
thức

P
i
tính

trên

trường

số

nguyên.

Thật

vậy:
P

=


x(d

1


d
2
)

=


x(2

y
M



(

y
P
+

y
Q
))

=



x(2

y
M



(

y
i

+

y
i

+

1))

=


x(2

y
M




2

y
i



1)
P

=

2

xy
M



2

xy
i




x
Thay


y
M
bởi

giá

trị



(*)

ta

được:
P

=

2

yx
i


2

yx
a

+

2

xy
a
+

2

y



2

xy
i



x
=

2

yx
i



2

xy
i


2

yx
a
+

2

xy
a
+

2

y




x
(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




(x
i
,y
i
).
Vậy

P
i+1
sẽ

được

xác

lập

từ

điểm

chọn

thứ

i+1




(x
i+1
,y
i+1
)

như

sau:
P
+1
=

2

yx
i+1


2

xy
i+1


2

yx
a
+


2

xy
a
+

2

y




x
(b)


dấu

của

P
i


dấu

của


(d
1
-d
2
)



tương

đương

nên



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



điểm

chọn

thứ

i+1



(x
i+1
,y
i+1
)

sẽ




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ó:
P
+1

=

2

y(x
i
+


1)



2

xy
i


2

yx
a
+

2

xy
a
+

2

y





x
= P

+ 2∆y
Nếu

P

≥ 0 : Thì chọn điểm Q là điểm minh họa cho M trên thiết bị đồ hoạ
Hay

nói

cách

khác



điểm

chọn

thứ

i+1



(x

i+1
,y
i+1
)

sẽ



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ó:
P
+1

=

2

y(x
i

+

1)



2

x(

y
i

+

1)



2

yx
a

+

2

xy
a
+

2

y




x
= P

+ 2∆y − 2∆x
i
i
i
i
i
i
i
i
i
i
Khi


i=0

thì

ta



(x
0
,y
0
)=(x
a
,y
a
)

thay

vào

(a)

ta

có:
P
0


=

2

yx
0


2

xy
0


2

yx
a
+

2

xy
a
+

2

y





x
= 2∆y − ∆x
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)



(x
0
,y
0
)=(x
a

,y
a
)



giá

trị

P
0

=

2

y




x
Dựa

vào

giá

trị


của

P
0



âm

hay

dương



ta

lại

chọn

được

điểm

tiếp

theo
(x

1
,y
1
)



tính

được

giá

trị

P
1
Dựa

vào

giá

trị

của

P
1




âm

hay

dương



ta

lại

chọn

được

điểm

tiếp

theo
(x
2
,y
2
)




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


(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



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



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



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



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



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




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)


x
5
=


x
b
=

10

nên

kết

thúc

vòng

lặp



cũng



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
5 6 7 8 9 10
(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)
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
10
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

a ∈ (1,+∞) , 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

a ∈ (−∞,−1) , 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ạ
A

độ) bán kính R (nguyên)là:
B
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.
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

nhn

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 m c ny ta s i tỡm hiu 2 thut toỏ
n cho phộp dng ng trũn (thc
cht l d ng cung AB v cỏc i xng ca

nú) mt cỏc h hiu qu v mt tc
.
III.1.

Thu t

toỏn

v

ng

trũn

MidPoint
Thu t toỏn MidPoint hay cũn gi l thut
toỏn xột i m 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
)



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



th

l


mt

trong

hai

im

P(x
i
+1,y
i
)

v

Q(x
i
+1,y
i
-1).
Q
I
P
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:
K
>0
f
circle
(x,

y)

=

x
2
+

y
2


R
2
Vi mt im M(x,y) thỡ rừ rng ta cú:

circle
(M)

=


(x,y)

=

x
2

+

y
2



R
2

<0

khi

v
ch khi im M nm trong ng trũn (tõm
<0
M
R
O bỏn kớnh R)

circle
(M)


=

(x,y)

=

x
2

+

y
2



R
2

>0

khi

v
ch khi im M nm ngoi ng trũn (tõm
O bỏn kớnh R)

circle
(M)


=

(x,y)

=

x
2

+

y
2



R
2

=0

khi

v
ch khi im M nm trờn ng trũn
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)
2

+

(y
i
-0.5)
2



R
2
(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
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)

>0

thỡ

im

I

nm


ngoi

ng

trũn,

vỡ

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
=


circle
(I)


=0

thỡ

im

I

nm

trờn

ng

trũn,

suy

ra

kh

nng

la

chn

P

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.
Vy

t

õy

ta

thy



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
=(x
i+1
+1,y
i+1
-0.5)=(x
i+1
+1)
2

+


(y
i+1
-0.5)
2



R
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
).
xi xi+1
yi-1
yi
Thay vào (b) ta được:
P
i+1
=(x
i
+1+1)
2

+

(y
i
-0.5)
2




R
2

=

P
i
+

2(x
i
+1)+1

=

P
i
+

2x
i
+3
Nếu

P
i
≥0:


thì

điểm

chọn

tiếp

theo



Q(x
i
+1,y
i
-1),

nghĩa



(x
i+1
,y
i+1
)=(x
i
+1,y

i
-
1).
Thay vào (b) ta được:
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

y
i
)

+5
Đầu

tiên


ta

chọn

điểm

A(0,R),

nghĩa



(x
0
,y
0
)=(0,R),

Thay

vào

(a)

ta

có:
P
0


=

1



R

+
1
4
=
5
4
− R
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
)



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
)



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.
Một điểm đáng chú ý ở đây các giá trị P tiếp theo có được bằng cách cộng vớ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
1
4
cho việc tính các giá trị P tiếp theo cũng phải xử lý trên trường số thực. Một
điều

dễ

thấy



nếu

ta

thay

đổi

giá

trị

P
0
khởi

đầu




1-R

thì

dấu

của

P
0


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.
III.1.a. Tóm

tắt

thuật

toán


vẽ

đường

tròn

MidPoint

:
Bướ

c



1:


P
0
=

1



R;

(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


(x
i+1

,y
i+1
)=(x
i
+1,y
i
)
P
i+1
=P
i
+

2x
i
+3
Ngược

lại

(tức

P
i


0):

thì


chọn

điểm

tiếp

theo


của

P.

Song

nếu

giá

trị

P

khởi

đầu



P

0

=

1



R

+
là một giá trị thực sẽ làm
(x
i+1
,y
i+1
)=(x
i
+1,y
i
-1)
P
i+1
=P
i
+

2(x
i
-


y
i
)

+5
Vẽ

điểm

(x
i+1
,y
i+1
)

vừa

tìm

được
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



x
i+1
=

Trunc(x
b
)

=


Trunc(

R
2
)

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 ha)
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
).



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

)



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



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
P2
-

y
2
v d
2
=y
2

-

y
Q2
(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
P2
+

y
Q2
-

2y
2


=

y
i2

+

(y
i
-1)
2

-

2(R
2

-

x
i+12
)=

y
i2

+

(y
i

-
1)
2

-

2(R
2

-

(x
i
+1)
2
)
=

y
i2

+

(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:

khoảng

cách

từ

P



Q

đến

đường

tròn

đều

bằng


nhau,

nên

ta



thể
chọn P hay Q đều được. Trong tình huống này thuật toán quy ước chọn điểm Q
làm điểm biểu diễn.
Vậy

từ

đây

ta

thấy



thể

dựa

vào


dấu

của

biểu

thức

P
i
để

ra

quyết

định

chọn

điểm
tiếp theo.
Để

thuật

toán

được


đơn

giản

người

ta

tối

ưu

hoá

việc

tính

P
i
theo

công

thức
truy hồi:
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+12

+

(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



P(x
i
+1,y
i
),

nghĩa



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

i+1
=

y
i2

+

(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




Q(x
i
+1,y
i
-1),

nghĩa



(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



(x
0
,y
0
)=(0,R),

Thay

vào

(a)

ta

có:
P
0
=

y
02

+


(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
)




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
)



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


im

(x
0
,y
0
)
B

c



2:


Vi

mi

giỏ

tr

i

(i=0,1,2,)

ta


xột

du

P
i
Nu

P
i
<0:

thỡ

chn

im

tip

theo

l
(x
i+1
,y
i+1
)=(x
i

+1,y
i
)
P
i+1
=P
i
+

4x
i
+6
Ngc

li

(tc

P
i


0):

thỡ

chn

im


tip

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
B

c



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
)

=

Trunc(

R
2
)

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:
x
2
a
2
y
2
b
(I)
A(0,b)
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

bng
C(x0, y0)
B(a,0)
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.
+
2
=

1
Rõ ràng trên cung AB thì độ dốc giảm liên tục từ điểm A (độ dốc bằng 0) đến B
(độ dốc tiến đến -∞). Xét về tốc độ biến thiên của 2 biến số thì:

Tốc độ biến thiên của biến số X giảm dần từ A đến B.


Tốc độ biến thiên của biến số Y tăng dần từ A đến B.
Rõ ràng trên cung AB phải có một điểm mà tại đó tốc độ biến thiên của X và Y là
bằng nhau (song x tăng thì y giảm), đó chính là điểm mà tại đó có độ dốc bằng -1.
Gọi

C(x
0
,y
0
)



điểm

nằm

trên

cung

AB

của

ellipse



tiếp


tuyến

tại

đó



độ

dốc
bằng -1. Khi đó tiếp tuyến d của ellipse sẽ có dạng:
Trang
19
Chæång 1: Caïc yãúu täú cå såí
cuía âäö hoüa - Nguyãùn Hæîu
Taìi
xx
0
2
+
yy
0
b
2
= 1
Mặt khác do độ dốc của d là:

x

0
b
2
y
0
a
2
= −1

nên ta suy ra
b
2
a
2
a
4
(a)
mặt khác do C thuộc ellipse nên ta có:
x
0
a
2
y
0
b
Từ (a) và (b) ta suy ra:
a
2
a
2

+ b
2
b
2
a
2
+ b
2
Ta sẽ trình bày giả thuật để vẽ cung AC (Đi từ A đến C theo chiều kim đồng hồ).
Cung CB được thực hiện một cách tương tự khi ta đổi vai trò của x và y. Các phần
còn lại của ellipse có được bằng cách lấy đối xứng.
Trên cung AC độ dốc nằm trong đoạn [0,-1], nghĩa là x tăng thì y giảm và tốc
độ biến thiên của x lớn hơn của y. Vậy nên tư tưởng của thuật giải dựng cung
AC

sẽ



cho

tham

số

x

biến

thiên


tuần

tự

từ

x
a
đến

x
c
với

các

giá

trị

nguyên,


với mội giá trị x như vậy ta tìm một giá trị y nguyên gần nhất với giá trị y thực
của ellipse tương ứng với x.
Sau đây chúng ta sẽ tìm hiểu thuật toán Bresenham áp dụng cho dựng ellipse.
IV.1. Thuật

toán


Bresenham

cho

vẽ

hình

Ellipse


ràng

điểm

đầu

tiên

được

chọn

để

vẽ

sẽ




điểm

A(0,b),

nghĩa

là:
(x
0
,y
0
)=(0,b)
a
y
0

=

(ở

đây

ta



x
0

≥0)

=>

y
02

=
x
0
b
4 2
x
0
+
2
=

1

(b)
2 2
x
0

=


y
0


=
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
)



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



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
P2
-

y
2
v d
2
=y
2

-

y
Q2
(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
P2
+

y
Q2
-


2y
2

]a
2

=

[

y
i2

+

(y
i
-1)
2

-

2(
b
2
(a

2





x



+ 1

)
2
)]a
2

=

[y
i2

+
2
2b
2
(a

2



(


x
i

+

1)
2
)
2
]a
2
=

y
i2
.a
2

+

(y
i
-1)
2

.a
2

-


2b
2
[a
2



(x
i
+1)
2
]
=

y
i2
.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



th
chn P hay Q u c. Trong tỡnh hung ny thut toỏn quy c chn im Q
lm im biu din
a
(y
i
-1)

-
a
Vậy

từ

đây

ta

thấy




thể

dựa

vào

dấu

của

biểu

thức

P
i
để

ra

quyết

định

chọn

điểm

tiếp theo.
Để

thuật

toán

được

đơn

giản

người

ta

tối

ưu

hoá

việc

tính

P
i
theo


công

thức
truy hồi:
P
i+1
=

y
i+12
.a
2

+

(y
i+1
-1)
2
.a
2

-

2b
2
a
2


+

2b
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



P(x
i
+1,y
i
),

nghĩa




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

y
i2
.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



Q(x

i
+1,y
i
-1),

nghĩa



(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



(x
0
,y
0
)=(0,b),

Thay

vào

(a)

ta

có:
P
0

=

y
02
.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
)



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
)



giá

trị

P
2
Quỏ trỡnh trờn c lp i lp li cho n khi ta v c im nguyờn gn nht

vi C.
IV.1.a. Túm

tt

thut

toỏn

Bresenham

cho

v

Ellipse:
B

c



1:


P
0
=

a

2
(1-2b)

+

2b
2

;

(x
0
,y
0
)=(0,b)
V

im

(x
0
,y
0
)
B

c




2:


Vi

mi

giỏ

tr

i

(i=0,1,2,)

ta

xột

du

P
i
Nu

P
i
<0:

thỡ


chn

im

tip

theo

l
(x
i+1
,y
i+1
)=(x
i
+1,y
i
)
P
i+1
=P
i
+

2b
2
(2x
i
+


3)
Ngc

li

(tc

P
i


0):

thỡ

chn

im

tip

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
B

c



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
)

=

Trunc(
a
2
a
2
+ b
2
)

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



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
dụng thủ tục Bre_Ellipse để vẽ các hình Ellipse một cách ngẫu 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

lp

c

xột

trờn

y,


chỳng

ta



th

lm

iu

tng

t

bng

cỏch
xột

trờn

x.

Bit

rng

trờn


ton

b

cung

AB

thỡ

x

s

bin

thiờn

t

0

n

a,

m

trc


ú
khi

dng

cung

AC

ta

ó

cho

x

bin

thiờn

trong

on

[0,

Const1],


vy

trờn

cung

BC

x
phi

bin

thiờn

trong

on

[Const1+1,

a

]

thỡ

s

m


bo

hai

cung

AC

v

CB

ghộp

ni
liờn

tc

vi

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. Bi

tp

cui

chng
1.


Cho im A(5,7) v B(15,15). S dng thut toỏn Bresenham ó cho tỡm
to



cỏc

im

v

(x
i
,

y
i
).
2.

Ci t mt th tc v ng thng tng quỏt (x lý c vi tt c mi tỡnh
hung) theo thut toỏn Bresenham.
3.

S

dng

thut


toỏn

v

ng

trũn

Midpoint



tớnh

giỏ

tr

cỏc

im

v

(x
i
,
y
i

)

bit

rng

R=20.
4.

Ci t mt th tc v ng trũn theo thut toỏn MidPoint.
5.

Ci

t

mt

th

tc

cho

phộp

tụ

mu


phn

din

tớch

bờn

trong

ca

ng
trũn. Th tc cú dng

FillCircle(x,y:integer;

R:word;

FillColor:

byte);
6.

Ci t mt th tc tụ mu phn bờn trong ca mt Ellipse.
7.

Hóy

xõy


dng

mt

thut

toỏn



dng

ng

cong

bc

2

(Parabol)

dng
tng quỏt:
y = ax
2
+ bx + c

×