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

pdf 24 trang Gia Huy 16/05/2022 3740
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:

  • pdfky_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

  1. Giáo viên phụ trách môn học: Nguyễn Hoài Anh Khoa Công nghệ thông tin - HVKTQS
  2.  Thuật toán vẽ đường thẳng  Thuật toán vẽ đường tròn  Thuật toán vẽ Elip
  3.  Ý 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?
  4.  Ý 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).
  5.  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 độ.
  6.  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)
  7. Sơ đồ khối thuật toán DDA
  8. 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;
  9.  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.
  10. Sơ đồ khối thuật toán Bresenham
  11. 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 ;
  12.  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
  13.  Do tính i xng ca ư ng tròn C nên ta ch c n v 1/8 cung tròn, sau ó ly i xng qua 2 tr c t a và 2 ư ng phân giác thì ta v ư c c ư ng tròn.
  14.  Ý tưởng
  15. 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 ;
  16.  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.
  17.  Thuật toán MidPoint (xét điểm giữa)
  18. Sơ đồ khối thuật toán MidPoint
  19. 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;
  20.  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 ta nguyên n m trên ư ng tròn có th tính ư c bng cách xác nh 1 trong 2 pixel gn nh t v i ư ng tròn th c h ơn trong mi bư c
  21. 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 ;
  22.  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.
  23.  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