KHoa CNTT-DDHBK Hà nội
0913030731
1
(c) SE/FIT/HUT 2002
Bài 2:
Các giảithuật sinh
các thực thể cơ sở
Le Tan Hung
0913030731
(c) SE/FIT/HUT 2002
2
Giảithuậtxâydựng các
thựcthể cơ sở
Giảithuậtsinhđường thẳng – Line
Giảithuậtsinhđường tròn - Circle
Giảithuật VanAken sinh Ellipse
Giảithuậtsinhđagiác
Giảithuậtsinhkýtự
(c) SE/FIT/HUT 2002
3
Rờirạchoáđiểm ảnh
(Scan Conversion rasterization)
Là tiếntrìnhsinhcácđốitượng hình họccơ sở bằng phương
pháp xấpxỉ dựatrênlưới phân giảicủamànhình
Tính chất các đốitượng cần đảmbảo:
smooth
continuous
pass through specified points
uniform brightness
efficient
(c) SE/FIT/HUT 2002
4
Biểudiễn đoạnthẳng
Biểudiễntường minh
(y-y1)/( x-x1) = ( y2-y1)/( x2-x1)1
y = kx + m
k = (y2-y1)/( x2-x1)
m = y1- kx1
Δy = k Δx
Biểudiễn không tường minh
(y2-y1)x - (x2-x1)y + x2y1 - x1y2 = 0
hay rx + sy + t = 0
s = -(x2-x1 )
r = (y2-y1) và t = x2y1 - x1y2
Biểudiễnthambiến
P(u) = P1 + u(P2 - P1)
u [0,1]
X = x1 + u( x2 - x1 )
Y = y1 + u( y2 - y1 )
m
P(x
1
, y
1
)
P(x
2
, y
2
)
u
(c) SE/FIT/HUT 2002
5
Thuật toán DDA
(Digital Differential Analizer)
Giảithuật DDA
Với 0 < k < 1
x
i+1
= x
i
+ 1
y
i+1
= y
i
+ k
với i=1,2,3
Thuậttoán ddaline (x1, y1, x2, y2)
x1, y1, x2, y2 : tọa độ 2 điểm đầucuối
k : hệ số góc
x,y,m :biến
begin
m =(x2-x1)/(y2-y1);
x = x1;
y = y1;
k = 1/m;
putpixel(x,y);
while x<x2
begin
x = x+1;
y = y+k;
putpixel(round(x),round(y));
end; end;
Giảithuật thông thường
DrawLine(int x1,int y1, int x2,int y2,
int color)
{
float y;
int x;
for (x=x1; x<=x2; x++)
{
y = y1 + (x-x1)*(y2-y1)/(x2-x1)
WritePixel(x, Round(y), color );
}}
(c) SE/FIT/HUT 2002
6
Giảithuật Bresenham
1960 Bresenham thuộcIBM
điểmgầnvới đường thẳng dựa
trên độ phân giai hưuhạn
loạibỏđược các phép toán
chia và phép toán làm tròn
như ta đãthấytronggỉai thuật
DDA
Xét đoạnthẳng với 0 < k < 1
012
0
1
2
d2
d1
KHoa CNTT-DDHBK Hà nội
0913030731
2
(c) SE/FIT/HUT 2002
7
Giảithuật Bresenham
d
2
= y - yi = k(xi +1) + b - yi
d
1
= yi+1 - y = yi + 1 - k(xi + 1) - b
If d
1
≤ d
2
=> y
i+1
= yi + 1
else d
1
> d
2
=> y
i+1
= yi
D = d
1
-d
2
= -2k(xi + 1) + 2yi - 2b + 1
Pi = ΔxD = Δx (d
1
-d
2
)
d1
d2
x
i
x
i
+1
y
i
y
i
+1
(c) SE/FIT/HUT 2002
8
Pi = -2Δyxi + 2Δxyi + c
P
i+1
-P
i
= -2Δy(x
i+1
- xi) + 2Δx(yi
+1
-yi)
NếuPi ≤ 0 ⇒ yi
+1
= yi + 1
Pi
+1
= Pi - 2Δy + 2Δx
Nếu Pi > 0 ⇒ yi
+1
= yi
Pi
+1
= Pi - 2Δy
P
1
= Δx(d
1
-d
2
)
P
1
= -2Δy + Δx
Giảithuật Bresenham
(c) SE/FIT/HUT 2002
9
y
i+1
M
( x
i
, y
i
)
x
i
x
i+1
Giảithuật trung điểm-Midpoint
Jack Bresenham 1965 / Pitteway 1967
VanAken áp dụng cho việc sinh các đường
thẳng và đường tròn 1985
Các công thức đơngiảnhơn, tạo đượccácđiểm
tương tự như với Bresenham
d = F (xi + 1, yi + 1/2) là trung điểmcủa đoạn
AB
Việc so sánh, hay kiểmtraM sẽđược thay
bằng việc xét giá trị d.
Nếud > 0 điểmB đượcchọn, y
i+1
= y
i
nếud < 0 điểmA đượcchọn. ⇒ y
i+1
= y
i
+
1
Trong trường hợp d = 0 chúng ta có thể
chọn điểmbấtkỳ hoặc A, hoặcB.
A
M
B
(c) SE/FIT/HUT 2002
10
Bresenham’s Algorithm:
Midpoint Algorithm
Sử dụng phương pháp biểudiễn không tường minh
Tạimỗi trung điểmcủa đoạnthẳng giá trịđượctínhlà:
Chúng ta gọi d
i
là biến quyết định củabướcthứ i
0=
+
+
cbyax
()
()
()
iiii
iiii
iiii
yxcbyax
yxcbyax
yxcbyax
,0
,0
,0
⇒>++
⇒<++
⇒
=
+
+
on line
above line
below line
()
cybxad
iii
+
⎟
⎠
⎞
⎜
⎝
⎛
+++=
2
1
1
(c) SE/FIT/HUT 2002
11
Bresenham’s Algorithm:
Midpoint Algorithm
If d
i
> 0 then chọn điểm A⇒ trung điểmtiếptheosẽ có dạng:
()
bad
cybxadyx
i
iiiii
++=
+
⎟
⎠
⎞
⎜
⎝
⎛
+++=⇒
⎟
⎠
⎞
⎜
⎝
⎛
++
+
2
3
2
2
3
,2
1
(c) SE/FIT/HUT 2002
12
Bresenham’s Algorithm:
Midpoint Algorithm
if d
i
< 0 then chọn điểm Bvà trung điểmmớilà
Ta có:
Ðiểm đầu
()
[]
2
2
1
1
2
1
,1
b
acbyax
cybxadyx
startstart
startstartstartstartstart
++++=
+
⎟
⎠
⎞
⎜
⎝
⎛
+++=⇒
⎟
⎠
⎞
⎜
⎝
⎛
++
()
ad
cybxadyx
i
iiiii
+=
+
⎟
⎠
⎞
⎜
⎝
⎛
+++=⇒
⎟
⎠
⎞
⎜
⎝
⎛
++
+
2
1
2
2
1
,2
1
Cx
x
y
y
xCc
xxxb
yyya
startend
startend
+
Δ
Δ
=
⎪
⎭
⎪
⎬
⎫
Δ=
−=Δ−=
−=Δ=
where
2
0
b
a ++=
KHoa CNTT-DDHBK Hà nội
0913030731
3
(c) SE/FIT/HUT 2002
13
Midpoint Line Algorithm
dx = x_end-x_start
dy = y_end-y_start
d = 2*dy-dx
x = x_start
y = y_start
while x < x_end
if d <= 0 then
d = d+(2*dy)
x = x+1
else
d = d+2*(dy-dx)
x = x+1
y = y+1
endif
SetPixel(x,y)
endwhile
initialisation
choose B
choose A
(c) SE/FIT/HUT 2002
14
Giảithuật
Bresenham's Midpoint
d = a(xi + 1) + b(yi + 1/2) + c
Nếu điểm đượcchọnlàB thiM sẽ tang
theo x một đơnvị
d
i+1
= F(xi +2, yi + 1/2)
= a(xi +2) + b(yi + 1/2) + c
di = a(xi + 1) + b(yi + 1/2) + c
Nếu điểmA đượcchọnthi` M tăng theo 2
hướng x và y với cùng một đơnvị.
di
+ 1
= F (xi + 2, yi+ 3/2)
= a(xi + 2) + b(yi +3/2) + c
di
+ 1
= di + a + b.
¾ Với a + b = dy - dx.
d <= 0
B¾t ®Çu
x = x1 ;
y = y1;
dx = x2 - x1;
dy = y2 - y1;
d = dy - dx/2;
Putpixel (x ,y);
x < x2
KÕt thóc
d = d + dy
d = d + dy - dx
y = y + 1
yes
no
No
yes
x = x + 1
(c) SE/FIT/HUT 2002
15
Sinh đường tròn
Scan Converting Circles
Implicit: f(x) = x
2
+y
2
-R
2
Explicit: y = f(x)
Parametric:
22
yRx=± −
cos
sin
xR
yR
θ
θ
=
=
If f(x,y) = 0 then it is on the circle.
f(x,y) > 0 then it is outside the circle.
f(x,y) < 0 then it is inside the circle.
Usually, we draw a quarter circle by
incrementing x from 0 to R in unit steps
and solving for +y for each step.
- by stepping the angle from 0 to 90
- avoids large gaps but still insufficient.
(c) SE/FIT/HUT 2002
16
Midpoint Circle Algorithm
Sử dụng phương pháp biểudiễn không
tường minh trong giảithuật
Thựchiệngiảithuậttrên1/8 đường
tròn và lấy đốixứng xho các góc còn
lại.
Với d
i
là giá trị của đường tròn tại
một điểmbấtkỳ ta có
(
)
(
)
0
2
22
=−−+− ryyxx
cc
(
)
()
()
circle outside is , if 0
circleon is , if 0
circle inside is , if 0
⎪
⎩
⎪
⎨
⎧
>
=
<
=
ii
ii
ii
i
yx
yx
yx
d
(c) SE/FIT/HUT 2002
17
Midpoint Circle Algorithm
As with the line, we determine the value of the decision variable by
substituting the mid-point of the next pixel into the implicit form of the
circle:
If d
i
< 0 we choose pixel A otherwise we choose pixel B
Note: we currently assume the circle is centered at the origin
()
2
2
2
2
1
1 ryxd
iii
−
⎟
⎠
⎞
⎜
⎝
⎛
−++=
(c) SE/FIT/HUT 2002
18
Midpoint Circle Algorithm
Again, as with the line algorithm, the choice of A or B can be used to
determine the new value of d
i+1
If A chosen then next midpoint has the following decision variable:
Otherwise if B is chosen then the next decision variable is given by:
()
32
2
1
2
2
1
,2
2
2
2
1
++=
−
⎟
⎠
⎞
⎜
⎝
⎛
−++=⇒
⎟
⎠
⎞
⎜
⎝
⎛
−+
+
ii
iiiii
xd
ryxdyx
()
522
2
3
2
2
3
,2
2
2
2
1
+−+=
−
⎟
⎠
⎞
⎜
⎝
⎛
−++=⇒
⎟
⎠
⎞
⎜
⎝
⎛
−+
+
iii
iiiii
yxd
ryxdyx
KHoa CNTT-DDHBK Hà nội
0913030731
4
(c) SE/FIT/HUT 2002
19
Midpoint Circle Algorithm
If we assume that the radius is an integral value, then the first pixel
drawn is (0, r) and the initial value for the decision variable is given
by:
Although the initial value is fractional, we note that all other values are
integers.
⇒ we can round down:
r
rrrdr
−=
−
⎟
⎠
⎞
⎜
⎝
⎛
+−+=⇒
⎟
⎠
⎞
⎜
⎝
⎛
−
4
5
4
1
1
2
1
,1
22
0
rd −=1
0
(c) SE/FIT/HUT 2002
20
Midpoint Circle Algorithm
d = 1-r
x = 0
y = r
while y < x
if d < 0 then
d = d+2*x+3
x = x+1
else
d = d+2*(x-y)+5
x = x+1
y = y-1
endif
SetPixel(c
x
+x,c
y
+y)
endwhile
initialisation
choose B
choose A
Translate to the circle center
stop at diagonal ⇒ end of octant
(c) SE/FIT/HUT 2002
21
Scan Converting Ellipses
2a is the length of the major axis along the x axis.
2b is the length of the minor axis along the y axis.
The midpoint can also be applied to ellipses.
For simplicity, we draw only the arc of the ellipse that lies
in the first quadrant, the other three quadrants can be drawn
by symmetry
22 22 22
(, ) 0Fxybxayab=+−=
(c) SE/FIT/HUT 2002
22
Scan Converting Ellipses: Algorithm
Firstly we divide the quadrant into two regions
Boundary between the two regions is
the point at which the curve has a slope of -1
the point at which the gradient vector has the i and j components of equal
magnitude
22
(, ) / / 2 2
g
radFxy Fx Fy bx ay=∂ ∂ +∂ ∂ = +ijij
A
M tiep tuyen = -1
B gradient
B C
M
i
(c) SE/FIT/HUT 2002
23
Ellipses: Algorithm (cont.)
At the next midpoint, if a
2
(y
p
-0.5)<=b
2
(x
p
+1), we switch region 1=>2
In region 1, choices are E and SE
Initial condition: d
init
= b
2
+a
2
(-b+0.25)
For a move to E, d
new
= d
old
+Delta
E
with Delta
E
= b
2
(2x
p
+3)
For a move to SE, d
new
= d
old
+Delta
SE
with
Delta
SE
= b
2
(2x
p
+3)+a
2
(-2y
p
+2)
In region 2, choices are S and SE
Initial condition: d
init
= b
2
(x
p
+0.5)
2
+a
2
((y-1)
2
-b
2
)
For a move to S, d
new
= d
old
+Delta
s
with Delta
s
= a
2
(-2y
p
+3)
For a move to SE, d
new
= d
old
+Delta
SE
with
Delta
SE
= b
2
(2x
p
+2)+a
2
(-2y
p
+3)
Stop in region 2 when the y value is zero.
(c) SE/FIT/HUT 2002
24
Ký tự Bitmap
Trên cơ sỏđịnh nghĩamỗikýtự với
một font chư cho trướclàmột
bitmap chữ nhậtnhỏ
Font/typeface: set of character
shapes
fontcache
các ký tự theo chuỗiliêntiếp nhau trong
bộ nhớ
Dạng cơ bản
(thường N, nghiêng I, đậm B, nghiêng
đậmB+I)
Thuộctính
Also colour, size, spacing and
orientation
ab
KHoa CNTT-DDHBK Hà nội
0913030731
5
(c) SE/FIT/HUT 2002
25
Cấutrúcfont chữ
Typedef struct
{
int leftx,
int width;
} Char location; //Vị trí củatext
Typedef struct
{
CacheId;
Heiglit; // Độ rộng chữ
CharSpace; // Khoảng cách
giữacáckýtự
Charlocation Table [128];
} fontcache
(c) SE/FIT/HUT 2002
26
Ký tự vector
Xây dựng theo phương pháp
định nghĩa các ký tự bởi
đường cong mềm bao ngoài
của chúng.
Tốnkémnhấtvề mặt tính
toán
Chất lượngcao
(c) SE/FIT/HUT 2002
27
So sánh
Đơngiảntrôngviệcsinhkýtự
( copypixel)
Lưutrữ lớn
Các phép biến đổi (I,B, scale)
đòi hỏilưutrữ thêm
Kích thước không dổi
Phứctạp(Tínhtoánphương
trình)
Lưutrữ gọnnhẹ
Các phép biến đổidựa vào các
công thứcbiến đổi
Kích thướcphụ thuôc vào môi
trường ( ko có kích thướccố
định)
(c) SE/FIT/HUT 2002
28
Giải thuật đường quét sinh đa giác
Polygon Scan Conversion
Tồn tại rất nhiều giải thuật sinh đa giác.
Mỗi giải thuật phục vụ cho 1 loại đa giác nhất
định:
some algorithms allow triangular polygons only
others require that the polygons are convex and non self-
intersecting and have no holes
triangular convex non-convex self-intersecting religious
(c) SE/FIT/HUT 2002
29
Polygon Scan Conversion
Polygon scan conversion là giải thuật chung kinh điển cho các loại
khác nhau
Cho mỗi đoạn thẳng quét, chúng ta xác định các cạnh của đa giác cắt
đoạn thẳng compute spans representing the interior portions of the
polygons along this scan-line and fill the associated pixels.
This represents the heart of a scan-line rendering algorithm used in
many commercial products including Renderman and 3D Studio
MAX.
(c) SE/FIT/HUT 2002
30
Polygon Scan Conversion
Dùng giảithuật (trung điểm) để xác
định các điểmbiênchomỗi đagiác
theo thứ tự tăng củax.
Các diểmphải:
Không bị chia sẻ bởicácđagiáclân
cận
Các đagiácchỉ toàn các điểmcạnh(
điểmbiên)
Đảmbảocácđagiácchiasẻđiểm biên
mà không chia sẻ các điểm ảnh bên
trong của mình.
KHoa CNTT-DDHBK Hà nội
0913030731
6
(c) SE/FIT/HUT 2002
31
Polygon Scan Conversion
Thủ tục chung:
Xác định giao của đường thẳng quét với cạnh đa giác
Sắp xếp các giao điểm theo mức độ tăng dần của x value
Điền các điểm ảnh vào giữa cặp các điểm x
Need to handle 4 cases to prevent pixel sharing:
if intersection has fractional x value, do we round up or down?
• if inside (on left of span) round up, if outside (on right) round down
what happens if intersection is at an integer x value?
• if on left of span assume its interior otherwise exterior
how do we handle shared vertices?
• ignore pixel associated with y
max
of an edge
how do we handle horizontal edges?
• handled as a result of previous rule (lower edges not drawn)
(c) SE/FIT/HUT 2002
32
Polygon Scan Conversion
rounded down for A
rounded up for B
integer x value is on
right = exterior
y
max
not
included
horizontal edge
removed
(c) SE/FIT/HUT 2002
33
Polygon Scan Conversion
Determining intersections with polygon edges is expensive
rather than re-computing all intersections at each iteration, use
incremental calculations
i.e. if we intersect edge e on scan-line i then it is likely we will intersect
the edge on scan-line i+1 (this is known as edge-coherence)
Assume slope of the edge > 1 (other edges obtained via symmetries)
incremental DDA calculation was:
slope m is given by
note that numerator and denominator are integral ⇒ we can use integer
DDA.
m
xxyy
iiii
1
,1
11
+=+=
++
(
)
()
startend
startend
xx
yy
m
−
−
=
(c) SE/FIT/HUT 2002
34
Giảithuật đường quét
Scan-Line Algorithm
The scan-line algorithm uses edge-coherence and incremental
integer calculations
for maximum efficiency:
Tạobảng edge table (ET) tậpcủacáccạnh đagiáctheothứ tự giá trị
y
min
của chúng
Tạobảng active edge table (AET) tậpcáccạnh giao vớI đoạnthẳng
quét scan-line
Trong tiến trình quét các cạnh sẽ chuyểntừ ET ra AET.
Các cạnh sẽởtrong AET cho đến khi giá trị y
max
củacạnh đạt
tới = scanline
Lúc nay cạnh sẽ bị loạirakhỏiAET.
(c) SE/FIT/HUT 2002
35
Edge Table (ET)
Note: line (8,6) → (13,6) has been deleted according to the scan rules
y
max
x
min
numerator
denominator
scan-line
(0,0)
(15,15)
5
31
−
=⇒
m
(c) SE/FIT/HUT 2002
36
Active Edge Table (AET)
y
max
current x denominator
AET =
current numerator
round up
round down
KHoa CNTT-DDHBK Hà nội
0913030731
7
(c) SE/FIT/HUT 2002
37
Scan-Line Algorithm
y = y of first non empty entry in ET
AET = null
repeat
move all ET entries in slot y to AET
sort AET entries according to x
min
fill spans using pairs of AET entries
for all AET members
if y
max
= y then remove from AET
y = y+1
for all AET members
update numerator
if numerator>denominator
numerator=numerator-denominator
x = x+1
until AET and ET empty