I. Thuật toán độ nguyên xác Ý tưởng Giả sử tọa độ nguyên các điểm sau khi xấp xỉ đối tượng thực lần lượt là (xi,yi) với i=0,... vẽ các điểm này chúng ta sẽ được một đường xấp xỉ của đối tượng cần vẽ. Giả sử đã biết được (xi,yi) là tọa độ nguyên xác định ở bước thứ i, điểm nguyên tiếp theo (xi+1,yi+1) sẽ được xác định như thế nào? Nhận xét ▪ Để đối tượng hiển thị trên lưới nguyên được liền nét, các điểm mà (xi+1,yi+1) có thể chọn chỉ là một trong tám điểm được đánh số từ 1 đến 8 ▪ Giải thích: điểm đen chính là (xi,yi). ▪ Nói cách khác : (xi+1,yi+1) = (xi+1,yi+1)
Trang 1Giáo viên phụ trách môn học:
Nguyễn Hoài Anh
Khoa Công nghệ thông tin - HVKTQS
Trang 2Thuật toán vẽ đường thẳng
Trang 4Ý tưởng
Giả sử tọa độ nguyên các điểm sau khi xấp xỉ đối
tượng thực lần lượt là (xi,yi) với i=0, vẽ các điểmnày chúng ta sẽ được một đường xấp xỉ của đối
tượng cần vẽ
Giả sử đã biết được (xi,yi) là tọa độ nguyên xác
định ở bước thứ i, điểm nguyên tiếp theo (xi+1,yi+1)
sẽ được xác định như thế nào?
Trang 5▪ Giải thích: điểm đen chính là (xi,yi)
▪ Nói cách khác : (xi+1,yi+1) = (xi+/-1,yi+/-1).
Trang 6Thuật toán
Giả thiết 0<m<1 và x2>x1 (Dx>0)
Với các đoạn thẳng dạng này, nếu (xi,yi) là điểm đã xác
định được ở bước thứ i
thì điểm cần chọn (xi+1,yi+1) ở bước thứ i+1 sẽ là một
trong hai trường hợp 1 hoặc 2
Tại bước i+1 ta xác định được: xi+1 = xi+1 và yi+1 = yi hoặc
yi+1 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 độ
Trang 7Thuật toán DDA (Digital Differential Analyzer)
Việc quyết định chọn yi+1 là yi hay yi+1, dựa vào
phương trình của đoạn thẳng y=mx+b
Tính y rồi làm tròn số và gán giá trị đó cho yi+1i+1
Như vậy
yi+1 = Round(m xi+1 + b) = Round(m (xi+1)+b)
Trang 8Sơ đồ khối thuật toán DDA
Trang 9Cài đặt thuật toán DDA
Procedure DDA ( x1, y1, x2, y2, color : integer ); Var dx, dy, step : integer;
X_inc, y_inc , x, y : real ; Begin
Trang 10Thuật toán Bresenham
Đưa ra cách chọn yi+1 là yi hay yi+1 theo một hướng
khác sao cho có thể tối ưu hóa về mặt tốc độ so vớithuật toán DDA
Vấn đề mấu chốt ở đây là làm thế nào để hạn chế tối
đa các phép toán trên số thực trong thuật toán
Trang 11Sơ đồ khối thuật toán Bresenham
Trang 12Cài đặt thuật toán Bresenham
Procedure Bres_Line (x1,y1,x2,y2: integer); Var dx, dy, x, y, P, const1, const2 : integer; Begin
x : = x +1 ;
if (P < 0) then P : = P + const1 else
begin
y : = y+1 ;
P : = P + const2 end ;
putpixel (x, y, color) ; end ;
End ;
Trang 13Trong hệ tọa độ Decac Phương trình đường tròn có dạng:
Với tâm O(0,0): x2 + y2 = R2.
Với tâm C(x ,y ): (x-x )2 + (y-y )2 = R2
Với tâm C(xc,yc): (x-xc)2 + (y-yc)2 = R2
Trang 14Do tính đối xứng của đường tròn C nên ta chỉ cần vẽ 1/8 cung tròn, sau đó lấy đối
xứng qua 2 trục tọa độ và 2 đường phân giác thì ta vẽ được cả đường tròn
Trang 15Ý tưởng
Trang 16Cài đặt thuật toán vẽ đường tròn
Procedure Circle (xc, yc, R : integer) ; Var x, y : integer ;
Procedure DOIXUNG;
Begin putpixel (xc + x , yc +y, color) ; putpixel (xc - x , yc + y, color) ; putpixel (xc + x , yc - y, color) ; putpixel (xc - x , yc- y, color) ; putpixel (xc + y , yc + x, color) ; putpixel (xc - y , yc + x, color) ; putpixel (xc + y , yc - x, color) ; putpixel (xc - y , yc - x, color) ; End ;
Begin For x : = 0 to round(R*Sqrt(2)/2) do Begin
y : = round(Sqrt(R*R - x*x)) ; DOIXUNG;
End ; End ;
Trang 17Thuật toán MidPoint (xét điểm giữa)
Thuật toán MidPoint đưa ra cách chọn yi+1 là yi hay
yi+1 bằng cách so sánh điểm thực Q(xi+1,y)
với điểm MidPoint là trung điểm của S và P theo
với điểm MidPoint là trung điểm của S và P theo
nguyên tắc:
▪ Nếu điểm Q nằm dưới điểm MidPoint, ta chọn S
▪ Ngược lại nếu điểm Q nằm trên điểm MidPoint ta chọn P.
Trang 18Thuật toán MidPoint (xét điểm giữa)
Trang 19Sơ đồ khối thuật toán MidPoint
Trang 20Cài đặt thuật toán MidPoint
Procedure DTR(xc, yc, r, mau : integer); var x, y, p : integer ;
begin x:=0 ; y:=r;
p:=1 - r;
while ( y > x) do begin
doi_xung;
if (p<0) then p:=p+2*x+3 else begin
p:=p+2*(x-y)+5 ; y:=y-1;
end;
x:=x+1;
end; {while}
end;
Trang 21Thuật toán Bresenham
Tương tự thuật toán vẽ đường thẳng, các vị trí
ứng với các tọa độ nguyên nằm trên đường tròn
có thể tính được bằng cách xác định 1 trong 2
pixel gần nhất với đường tròn thực hơn trong mỗi bước
Trang 22Cài đặt thuật toán Bresenham
Procedure DTR _BRES (xc,yc,r,mau : integer); var x ,y ,p :integer;
begin
x :=0 ; y :=r;
p := 3 – 2 * r ; while (x <y) do begin
doi_ xung ;
if (p <0) then p := p + 4* x + 6 else begin
p := p + 4 * (x -y ) + 1 0 ;
y := y -1 ; end ;
x :=x + 1 ; end ;{w h ile}
end ;
Trang 23Xét elip có tâm tại gốc tọa độ, bán kính trục X là
a, bán kính trụcY là b Phương trình elip có dạng:
1
2 2
= + y
x
b2x2+a2y2 – a2b2 =0 = F(x,y)
còn lại lấy đối xứng qua các trục X vàY.
1
2
b a
Trang 24Triển khai các thuật toán trên ngôn ngữ lập trình
và môi trường đồ họa phù hợp