Giáo trình Đồ họa máy tính (60 tiết) - pdf 17

Download miễn phí Giáo trình Đồ họa máy tính (60 tiết)



Bất kỳphép biến hình nào cũng được kết hợp từphép tịnh tiến, tỷlệvà quay.
Khi áp dụng liên tiếp các phép biến hình trên đối tượng, ta phải thực hiện nhiều phép nhân
với các ma trận tương ứng. Thay vào đó, ta sẽchuẩn bịsẵn ma trận tích và sửdụng nhưma
trận của phép biến hình tổng thể.



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

vẽ đoạn thẳng
Trong hình vẽ (xi+1,y) là điểm thuộc đoạn thẳng thực, ta có: y = m(xi+1) + b. Giả sử ở bước
i ta đã xác định được điểm (xi,yi).
Đặt
d1 = y – y1 ;
d2 = (yi +1) - y ;
Việc chọn điểm tiếp theo (xi+1, yi+1) là S hay P tùy thuộc vào việc d1 lớn hơn hay nhỏ hơn d2,
nói cách khác là phụ thuộc vào dấu của (d1 – d2)
• Nếu d1 – d2 <0, ta sẽ chọn S, tức là yi+1 = yi
• Trường hợp còn lại: d1 – d2 >0, ta sẽ chọn P, tức là yi+1 = yi+1
Đặt
pi = dx (d1 – d2).
Thay d1 = y – y1 ; d2 = (yi +1) – y vào ta có
pi = dx (2y - 2yi -1)
Thay y = mxi+b = dy(xi+1)/dx + b vào ta có
pi = 2dx [dy(xi+1)/dx +b] – 2yidx –dx
= 2xidy – 2yidx +C
với C = 2dy + (2b-1)dx là hằng số.
Ta nhận xét rằng, nếu tại bước thứ i ta xác định được dấu của pi thì sẽ xác định được điểm
cần tô ở bước i+1.
Làm sao để tính giá trị của pi ? ta dùng phương pháp “lũy tiến” như sau.
Ta có:
pi+1 –pi = (2xi+1dy – 2yi+1dx +C) - (2xidy – 2yidx +C) = 2dy -2dx(yi+1 – yi)
• Nếu pi<0 thì điểm được chọn là S, tức là yi+1 = yi ⇒ pi+1 = pi +2dy
• Nếu pi>0 thì điểm được chọn là P, tức là yi+1 = yi+1 ⇒ pi+1 = pi +2dy -2dx
Cuối cùng, giá trị p0 được tính từ điểm ảnh đầu tiên (x0, y0) theo công thức sau
p0 = 2x0dy – 2y0dx + c
Thay giá trị của c vào, chú ý rằng điểm đầu (x0, y0) cũng thuộc đoạn thẳng thực nên y0 =
mx0 + b = x0dy/dx + b, suy ra
p0 = 2dy -dx
tóm lại là:
xi+1
S
(xi+1,y)
Pyi+1 d2
y
d1
yi
xi
35
... y0
... y1
p1 y2
p2 p0
Ví dụ:
Cho A(12,20) và B(22,27), ta có
dx = 22 – 12 = 10 ; dy = 27 – 20 = 7;
c1 = 2dy = 14 ; c2 = 2(dy-dx) = -6;
p0 = 2Dy – dx = 4
i xi yi pi
0 12 20 4
1 13 21 -2
2 14 21 12
3 15 22 6
4 16 23 0
5 17 24 -6
6 18 24 8
7 19 25 2
8 20 26 -4
9 21 26 10
10 22 27 4
36
Thuật toán Bresenham vẽ đoạn thẳng
{ Vẽ đoạn thẳng trong trường hợp 00}
uses crt,graph;
var
gd,gm:integer;
i,x1,y1,x2,y2,dx,dy,p,c1,c2,x,y:integer;
Begin
gd:=detect; initgraph(gd,gm,'');
Randomize;
Repeat
x1:=random(GetMaxX);
x2:=x1+random(GetMaxX-x1);
y1:=random(GetMaxY);
y2:=y1+random(x2-x1);
{vẽ đoạn thẳng (x1,y1) (x2,y2) }
Lưu đồ thuật toán
Bresenham
x < x2 ?
p:=2dy - dx ;
c1=2dy;
c2=2(dy-dx);
x:=x1; y:=y1 ;
putpixel(x,y);
Yes
No
End
No
p < 0 ?
Yes
p:=p+c1; p:=p + c2; y:=y+1;
x:=x+1;
PutPixel(x,y);
Begin
37
dx:=x2-x1;
dy:=y2-y1;
p:=2*dy - dx;
c1:=2*dy;
c2:=2*(dy-dx);
x:=x1;
y:=y1;
putpixel(x,y,white);
for i:=x1 to x2 do
begin
if p<0 then p:=p+c1 else
begin
p:=p+c2; y:=y+1;
end;
x:=x+1;
putpixel(x,y,white);
end;
delay(1000);
Until Keypressed;
closegraph;
End.
3. Thuật toán MidPoint vẽ đoạn thẳng
O: điểm giữa
Pyi+1
S
yi
xi xi+1
Thuật toán này thực chất là 1 cách diễn giải khác của thuật toán Bresenham. Ta lựa chọn
yi+1 là yi hay yi+1 bằng cách so sánh trung điểm của O của PS với đường thẳng thực
• Nếu O nằm phía dưới đường thẳng, ta chọn P
• Nếu O nằm phía trên, ta chọn S
Phương trình đường thẳng thực: Ax + By + C = 0
với A = y2 – y1; B = x1 – x2; C = x2y1 – x1y2 ;
Đặt F(x,y) = Ax + By + C, ta biết rằng
• F(x,y) <0 nếu điểm (x,y) nằm phía trên đường thẳng
• F(x,y) =0 nếu điểm (x,y) thuộc đường thẳng
• F(x,y) >0 nếu điểm (x,y) nằm phía dưới đường thẳng
vì vậy, vấn đề quy về việc xét dấu của pi = 2F(O) = 2F(xi +1,yi +1/2)
• Nếu pi <0 tức là O nằm phía trên đường thẳng ⇒ ta chọn S
38
• Nếu pi >0 tức là O nằm phía dưới đường thẳng ⇒ ta chọn P
Làm sao để tính pi ? tương tự như thuật toán Bresenham, ta cũng dùng phương pháp “lũy
tiến”, dùng giá trị ở bước trước pi để tính giá trị ở bước tiếp theo pi+1
Ta có: pi+1 – pi =2F(xi+1 +1,yi+1 +1/2) - 2F(xi +1,yi +1/2)
= 2[A(xi+1+1)+B(yi+1+1/2)+C] - 2[A(xi+1)+B(yi+1/2)+C]
= 2dy – 2dx(yi+1 – yi)
Như vậy
• Nếu pi <0 thì ta chọn yi+1 = yi , do đó pi+1 = pi +2dy
• Nếu pi >0 thì ta chọn yi+1 = yi+1 , do đó pi+1 = pi +2dy – 2dx
Cuối cùng, giá trị đầu p0 được tính như sau: nhận xét rằng điểm đầu (x0, y0) thuộc đoạn
thẳng thực tức là Ax0 + By0 +C = 0
p0 = 2F(x0+1,y0+1/2) = 2[A(x0+1)+B(y0+1/2)+C]
= 2(Ax0 + By0 +C) + 2A +B = 2A+B
= 2dy –dx
II Vẽ đường tròn
Thuật toán MidPoint
B
(-x, y)
(-y, x)
(-y, -x)
(-x, -y) (x, -y)
(y, -x)
(y,x)
(x,y)
A
Đầu tiên ta nhận xét rằng, do tính đối xứng của đường tròn nên ta chỉ cần vẽ được
cung AB là cung 1/8 đường tròn, sau đó lấy đối xứng qua các trục và các đường phân giác
ta sẽ có cả đường tròn. Chẳng hạn như ở hình vẽ trên nếu xác định được điểm (x,y), lấy đối
xứng qua đường phân giác của góc phần tư thứ nhất ta thu được điểm (y,x), lấy đối xứng
qua trục hoành ta thu được 2 điểm (y,-x) và (x,-y) ... Nếu ta chia thành 16,32 ... phần thì
việc xác định tọa độ 15,31... điểm đối xứng còn lại sẽ rất khó. Còn nếu chia thành 4 hay 2
phần thì số điểm lân cận cần loại trừ có thể nhiều hơn 2 điểm.
39
P
S
M: điểm giữa
Q(xi+1,y)
xi xi+1
yi
yi-1
Gọi R là bán kính đường tròn, ta xuất phát từ điểm A (0,R) để vẽ cung AB. Nhìn hình vẽ ta
thấy, nếu (xi, yi) là điểm ảnh đã vẽ được ở bước thứ i thì điểm ảnh (xi+1, yi+1) ở bước tiếp
theo chỉ có thể là S hay P, tức là
• xi+1 = xi + 1
• yi+1 ∈ {yi, yi-1}
Giống như thuật toán vẽ đoạn thẳng, ý tưởng chính để lựa chọn giữa S và P ở đây là căn cứ
vào vị trí tương đối của điểm giữa M của SP với đường tròn. Nếu M nằm bên trong đường
tròn như hình vẽ thì ta sẽ chọn S vì nó gần điểm thực Q hơn so với P. Ngược lại nếu M nằm
ngoài đường tròn thì P sẽ được chọn.
Đặt F(x,y) = x2 + y2 – R2 , các định lý toán học cho ta biết rằng
• F(x,y) <0 nếu điểm (x,y) nằm trong đường tròn
• F(x,y) =0 nếu điểm (x,y) nằm trên đường tròn
• F(x,y) >0 nếu điểm (x,y) nằm ngoài đường tròn
Đặt pi = F(M) = F(xi+1,yi – ½) ta có
• Nếu pi<0 tức là M nằm trong đường tròn, ta sẽ chọn S, tức là yi+1 = yi
• Nếu pi≥0 ta sẽ chọn P, tức là yi+1 = yi -1
Cách tính giá trị của pi cũng tương tự như ở thuật toán vẽ đoạn thẳng. Ta có:
pi+1 – pi = F[xi+1+1,yi+1 – ½] - F[(xi+1,yi – ½)]
= [(xi+1+1)2 +(yi+1 – ½)2 - R2] - [(xi+1)2 +(yi – ½)2 - R2]
= 2xi +3+(yi+12 – yi2) – (yi+1 - yi)
Do đó
• Nếu pi <0 ta chọn yi+1 = yi ⇒ pi+1 = pi + 2xi +3
• Nếu pi ≥0 ta chọn yi+1 = yi-1 ⇒ pi+1 = pi + 2xi -2yi +5
Cuối cùng ta tính giá trị đầu p0 ứng với điểm A(0,R)
p0=F(x0+1,y0-1/2) = F(0,R-1/2) = 5/4 -R
40
Thuật toán MidPoint vẽ đường tròn
Uses crt,graph;
Var
gd,gm,x,y,R,p,mau:integer;
Procedure PutPixel8(x,y,c:integer);
Begin
putPixel(x,y,c); putPixel(y,x,c); putPixel(y,-x,c); putPixel(x,-y,c);
putPixel(-x,-y,c); putPixel(-y,-x,c); putPixel(-y,x,c); putPixel(-x,y,c);
End;
Begin
gd:=detect; initgraph(gd,gm,'');
SetViewPort(GetMaxX div 2, GetMaxY div 2, GetMaxX,GetMaxY,false);
Randomize;
R :=100 + random(200);
Lưu đồ thuật toán
MidPoint vẽ
đường tròn
x < y ?
p:=5/4 -R;
x:=0; y:=R ;
PutPixel8(x,y);
Yes
No
End
No
p < 0 ?
Yes
p:=p+2x+3; p:=p+2(x-y); y:=y-1;
x:=x+1;
PutPixel(x,y);
Begin
41
mau:=random(GetMaxColor); {Vẽ đường tròn MidPoint màu ngẫu nhiên }
x:=0; y:=R;
PutPixel8(x,y,mau);
p:=1-R;
while (x<y) do
begin
if p<0 then p:=p+2*x+3
else
begin
p:=p+2*(x-y)+5;
y:=y-1;
end;
x:=x+1;
PutPixel8(x,y,mau);
end;
readkey;
End.
VTại sao phải so sánh pi với 0 trong các thuật toán trên ? bản chất việc so sánh này là gì ?
VTrong thuật toán MidPoint...
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status