1. Trang chủ
  2. » Giáo Dục - Đào Tạo

kỹ thuật đồ họa

29 144 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 295,43 KB

Nội dung

CÁC THUẬT TOÁN VẼ ĐƯỜNG THẲNG: Xét đoạn thẳng có hệ số góc < m < x >0 Một đường thẳng xác định biết điểm thuộc nó.Phương trình đường thẳng qua điểm (x1, y1) (x2,y2) có dạng sau: hay dạng tương đương : (x - x1)(y2 -y1) = (y -y1)(x2 -x1) Khai triển ta có dạng : y = mx + b, đó: m = Dy/Dx , Dy = y2 - y1 , Dx = x2 - x1 , b = y1 - mx1 Đây gọi phương trình đoạn chắn đường thẳng Nếu khai triển dạng : (y2 - y1 )x - (x2 - x1)y - x1y2 + x2y1 = đặt A = (y2 - y1 ) , B = - (x2 - x1), C = - x1y2 + x2y1 phương trình đường thẳng có dạng : Ax + By + C = 0, dạng gọi phương trình tổng quát đường thẳng ĐƯỜNG THẲNG BẰNG THUẬT TOÁN DDA a.Trình bày sở toán học Cho phương tình đường thẳng d: y =mx + b m = (y2 - y1)(x2 - x1) b = y1 - mx1 • • • Giả sử ta vẽ (xi,yi) Tiếp theo, chọn yi+1 yi hay yi + dựa vào phương trình đường thẳng Thay xi +1 vào phương trình đường thẳng d : • yi+1 = m(xi +1) + b = mxi +b +m = yi + m b Viết thủ tục thuật toán : #define Round (a) Int (a + 0,5) int color = GREEN; void LineDDA ( int x1,int y1, intx2, int y2) { int x = x1; float y = y1; float m = float(y2 - y1)/(x2 - x1); putpixel( x, Round (y) , Color); for(int i=x1; i < x2; i++) { x++ y+=m; putpixel(x,Round(y),Color); } }//LineDDA c.Nhận xét thuật toán giải thích thuật toán  Cải thiện tốc độ: Sử dụng công thức yi+1 = yi + m thay cho y = mx + b, tránh phép nhân số thực  Sai số tích lũy việc cộng số thực m vào y, điểm vẽ chệch hướng với đường thẳng thực đường thẳng vẽ dài  Tốc độ chậm (sử dụng cộng số thực, làm tròn).Có thể khắc phục thao tắc cộng số thực m làm tròn thuật toán cách nhận xét m = Dx/Dy với Dx, Dy số nguyên Đường thẳng Bresenham Thuật toán Bresenham đưa cách chọn yi+1 hay yi + theo hướng khác cho tối ưu hóa mặt tốc độ so với thuật toán DDA.Vấn đề chốt làm để hạn chế tối đa phép toán số thực thuật toán Gọi (xi + 1, y ) điểm thuộc đoạn thẳng Ta có y = m(xi +1) + b Đặt : d1= y - yi d2 = (yi +1) - y Xét tất vị trí tương đối yi yi +1, việc chọn điểm (xi+1,yi+1) S hay P phụ thuộc vào việc so sánh d1 d2 hay dấu d1 - d2: • • Nếu d1 - d2 = 0, ta chọn điểm P,tức yi+1 = yi +1 Xét pi = Dx(d1 - d2) = Dx(2y - 2yi - 1) > pi = Dx[ 2(m(xi+1) +b ) - 2yi - ] Thay m = Dy/Dx vào phương trình ta : pi = 2Dyxi - 2Dxyi + c , với c = 2Dy + (2b - 1)Dx Nhận xét Dx > nên dấu biểu thức d1 - d2 dấu pi hay nói cách khác, bước thứ i ta xác dịnh dấu pi xem ta xác định điểm cần chọn bước (i + 1) Vấn đề lại làm để tính pi bước thật nhanh Ta có : pi - - pi = (2Dyxi+1 - 2Dxyi+1 +c) - (2Dyxi - 2Dxyi +c) < > pi+1 - pi = 2Dy(xi+1 - xi) - 2Dx(yi+1 - yi) = 2Dy - 2Dx(yi+1 - yi), xi+1 = xi +1 Từ ta suy cách tính pi+1 từ pi sau : • • Nếu pi < pi+1 = pi + 2Dy ta chọn yi+1 = yi Ngược lại , pi+1 >= pi+1 = pi + 2Dy - 2Dx, ta chọn yi+1 = yi +1 Giá trị p0 tính từ điểm vẽ (x0,y0) theo công thức : p0 = 2Dyx0 - 2Dxy0 +c = 2Dyx0 - 2Dxy0 + 2Dy - (2b -1)Dx Do (x0,y0) điểm nguyên thuộc đoạn thẳng nên ta có y0 = mx0 + b =(Dy/Dx)x0 + b Thế vào phương trình ta suy p0 = 2Dy -Dx b.Viết thủ tục thuật toán Đâyỳ đủ chạy : #include #include #include #include #include #include #include #define PATH "D:\\BORLANDC\\BGI" void LineBres(int x1, int y1, int x2, int y2,int color) int Dx, Dy, p, Const1, Const2; int x, y; int i; Dx = x2 - x1; Dy = y2 - y1; p = 2*Dy - Dx; // Dy [...]... } 21 putpixel(x, y, MAGENTA); } 22 23 } c Nhận xét thuật toán và giải thích thuật toán • • Thuật toán Midpoint chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dịch bit( phép nhan 2) điều này là l một cải tiến tăng tốc độ đáng kể so với thuật toán DDA Thuật toán này cho kết quả tương tự như thuật toán Bresenham 13 14 ĐƯỜNG TRÒN 1.ĐƯỜNG TRÒN BRESENHAM: a.Cơ sở toán... Bresenham_Circle(getmaxx() / 2, getmaxy() / 2, 70, 4); getch(); closegraph(); } c Nhận xét thuật toán và giải thích thuật toán Thuật toán bresenham chỉ làm việc trên số nguyên và các thao tác trên số nguyên chỉ là phép cộng và phép dịch bit (phép nhân 2) điều này là 1 cái tiến làm tăng tốc độ đáng kể so với thuật toán DDA Ý tưởng chính của thuật toán chính là ở chỗ xét 20 dấu Pi để quyết định điểm kế tiếp, và thực... thủ tục thuật toán 1 void MidpointLine(int x1, int y1, int x2, int y2) 2 { 3 int Dx = x2 - x1; 4 int Dy = y2 - y1; 5 int x = x1; 6 int y = y1; 7 putpixel(x1, y1, MAGENTA); 8 float D = Dy - (Dx >> 1); // ~ float D = Dy - Dx/2; 12 9 while(x = 0: chọn= yᵢ - 1 Khiđó Pi+1 = Pi + 2xᵢ - 2yᵢ+5Pi ứngvớiđiểm ban đầu( x˳ , y˳ ) = (0,R) là: P˳ = F(x˳ + 1, y˳- 1/2) = F(1, R - 1/2) = 5/4 -R b.Cài đặt chương trình 23 minh họa 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 ... Nhận xét thuật toán giải thích thuật toán • • Thuật toán Bresenham làm việc số nguyên thao tác số nguyên phép cộng phép dịch bit( phép nhan 2) điều cải tiến tăng tốc độ đáng kể so với thuật toán... Nhận xét thuật toán giải thích thuật toán • • Thuật toán Midpoint làm việc số nguyên thao tác số nguyên phép cộng phép dịch bit( phép nhan 2) điều l cải tiến tăng tốc độ đáng kể so với thuật toán... c Nhận xét thuật toán giải thích thuật toán Thuật toán bresenham làm việc số nguyên thao tác số nguyên phép cộng phép dịch bit (phép nhân 2) điều tiến làm tăng tốc độ đáng kể so với thuật toán

Ngày đăng: 21/04/2016, 15:06

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w