Kỹ thuật đồ họa và xử lý ảnh - Bài 3: Các thuật toán vẽ đường - Nguyễn Hoài Anh
Bạn đang xem 20 trang mẫu của tài liệu "Kỹ thuật đồ họa và xử lý ảnh - Bài 3: Các thuật toán vẽ đường - Nguyễn Hoài Anh", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- ky_thuat_do_hoa_va_xu_ly_anh_bai_3_cac_thuat_toan_ve_duong_n.pdf
Nội dung text: Kỹ thuật đồ họa và xử lý ảnh - Bài 3: Các thuật toán vẽ đường - Nguyễn Hoài Anh
- Giáo viên phụ trách môn học: Nguyễn Hoài Anh Khoa Công nghệ thông tin - HVKTQS
- Thuật toán vẽ đường thẳng Thuật toán vẽ đường tròn Thuật toán vẽ Elip
- Ý 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,y i) 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,y i) là tọa độ nguyên xác định ở bước thứ i, điểm nguyên tiếp theo (x i+1 ,y i+1 ) sẽ được xác định như thế nào?
- Ý tưởng 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à (x i+1 ,y i+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,y i). Nói cách khác : (x i+1 ,y i+1 ) = (x i+/-1,y i+/-1).
- Thuật toán Giả thiết 0 x1 (Dx>0) Với các đoạn thẳng dạng này, nếu (xi,y i) là điểm đã xác định được ở bước thứ i thì điểm cần chọn (x i+1 ,y i+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: x i+1 = x i+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 độ.
- Thuật toán DDA (Digital Differential Analyzer) Việc quyết định chọn yi+1 là yi hay y i+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+1 . Như vậy yi+1 = Round(m x i+1 + b) = Round(m (x i+1)+b)
- Sơ đồ khối thuật toán DDA
- Cà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 dx:=x2-x1; dy:=y2-y1; if abs(dx)>abs(dy) then steps:=abs(dx) else steps:=abs(dy); x_inc :=dx/steps; y_inc:=dy/steps; x:=x1; y:=y1; putpixel(round(x),round(y), color); for k:=1 to steps do begin x:=x+x_inc; y:=y+y_inc; putpi xel(round(x),round(y), color); end; end;
- Thuật toán Bresenham Đưa ra cách chọn yi+1 là yi hay y i+1 theo một hướng khác sao cho có thể tối ưu hóa về mặt tốc độ so với thuậ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.
- Sơ đồ khối thuật toán Bresenham
- Cà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 dx : = x2- x1; dy : = y2- y1; P : = 2*dy - dx; Const1 : = 2*dy ; const2: = 2*(dy - dx) ; x:= x1; y:=y1; Putpixel ( x, y, Color); while (x < x -2 ) do 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 ;
- Trong hệ tọa độ Decac. Phương trình đường tròn có dạng: Với tâm O(0,0): x 2 + y 2 = R 2. 2 2 2 Với tâm C( xc,y c): (x -xc) + (y-yc) = R Trong hệ tọa độ cực
- Do 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.
- Ý tưởng
- Cà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 ;
- Thuậ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(x i+1 ,y) 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.
- Thuật toán MidPoint (xét điểm giữa)
- Sơ đồ khối thuật toán MidPoint
- Cà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;
- Thuậ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
- Cà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 ;
- Xét elip có tâm tại gốc tọa độ, bán kính trụcX là a, bán kính trụcY là b. Phương trình elip có dạng: 2 2 x + y = 1 a 2 b 2 b2x2+a 2y2 – a2b2 =0 = F(x,y) Do elip đối xứng nên chỉ cần vẽ cung ¼, các cung còn lại lấy đối xứng qua các trục X vàY.
- Triể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