Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
296,52 KB
Nội dung
I.Thuật toán v ẽ dường tròn Phương trình đường tròn có dạng: (x-xc)2 + (y-yc)2 = r2 Pt đường tròn có tâm ở gốc tọa độ: x2+y2 =r2 Do tính đôi xứng của đường tròn nên ta chỉ cần vẽ cung V i hoặc 1/8 void put8pixel(int xc, int yc, int X, int y) putpixel(x+xc, y+yc, color); putpixel(y+xc, x+yc, color); puipỉxel(y+xc, -x+yc, color); putpixel(x+xc, -y+yc, color); putpixel(-x+xc, -y+yc, color); putpixel(-y+xc, -x+yc, color); putpixel(-y+xc, x+yc, color); putpixel(-x+xc, y+yc, color); l.Thuâc toán Bresenham 1 Giả sử tại bước i đã vẽ được điểm (xi,yi) Điểm cần vẽ kê tiếp (xi+1, yi+1) là: (xi +1, yi) hay (xi +1, yi -1) Giá trị y thực sự thuộc đường tròn ứng với xi là: y 2 = 1-2 - (xi +1)2 Gọi dl = yi2 - y2 = yi2 -r2 +(xi +1)2 d2= y2 - (yi -1)2 = r2 - (xi +1)2 - (yi -1)2 Pi = dl-d2 = yi2 - r2 +(xi +1)2 -r2 + (xi +1)2 +(y i-l)2 = 2(xi +1)2 + yi2 +(yi -1)2 -2r2 Pi+1 - pi = 2 (xi+l +1)2 + yi+12 + (yi+1 -1)2 - 2r2 - 2(xi +1)2 - yi2 - (yi -1)2 + 2r2 = 4xi + 6 + 2(yi+12 -y i2 ) -2(yi+l-yỉ) ^ Pi+1 = pi+4xi + 6 + 2(yi+12 - yi2) -2(yi+1-yi) V ậy: + nêu pi < 0 thì yi+1 = yi, khi đó pi+1 = p i+ 4xi+6 +Nêu pi >= thì yi+1 = yi-1, khi đó pi+1 = pi + 4(xi-yi)+10 Giá trị pi tại điểm đầu tiên (x l,y l) = (0,r) là: P1 = 2+r2+(r-l)2 - 2r2=3-2r void CircleBres(int xc, int yc, int r) 2 int x,y,p; x=0; y=r; p=3-2*r; while (x<=y) { put8pixel(xc,yc,x,y); if(p<0) p+ =4*x+6; else { p+ = 4*(x-y) +10; y - ; } X ++ ; }} 2.Thuât toán Midpoint Gọi F(x,y) = x2+y2-r2, ta CÓ: F(x,y){<0 nếu (x,y) nằm Irong đường tròn =0 nếu (x,y) thuộc đường tròn >0 nếu (x,y) nằm ngoài đường tròn Chọn điểm bắt đầu v ẽ là (0,r) Giả sử đã v ẽ được điểm (xi,yi), Điểm cần vẽ kê tiếp (x i+ l,y i+ l) là s hay p 3 V iệc chọn điểm s hau p dựa trên dấu của: Pi=F(Midpoint) = F(xi+l,y i-l/2) + Nêu pi<0 = > chọn s + Nêu pi>=0 => chọn p M ặt khác: pi+1 - pi = F(xi+1 +1, yi+1 -1/2)- F(xi+1, yi-1/2) = [(xi+1 +1)2 + (yi+1 - V ì )2 - r2] - [(x i+l)2 + (yi-l/2)2 - r2] = 2xi + 3 (yi+12 - yi2) - (yi+1 - yi) Vậy: + Nêu pi<0 thì yi+1 = yi, khi đó pi+1 = pi + 2xi + 3 + Nếu pi>=0 thì y i+ l= yi -1, khi đó pi+1 = pi + 2(xi-yi) +5 Giá trị pi tại điểm đẳu tiên (xl, yl)=(0,r) là: p l= F (x l+1, y l -1/2) = f(l, r-1/2) = 5 / 4 - r void CircleMidpoint(int xc, int yc, int r) int x,y,p; x=0; y=r; p=5/4; while (x<=yO put8pixel(xc,yc,x,y); 4 if(p<0) p+ = 2*x +3; else{ p+=2*(x-y0+5; y ; } X ++ ; } } II.Thu ật toán tô màu theo đường biên: Ý tưởng: B ắt đầu từ điểm P(x,y) nằm bên trong vùng tô, kiểm tra các điểm lân cận cảu p đà được tô màu hay có phải là điểm biên hay không, nếu không phải là điểm đã tô và không phỉa là điểm biên thì ta sẽ tô màu nó. Quá trình này được lặp laijcho đến khi không còn lô được diểm nào nữa thì dừng. Có hai cách chọn điểm lan cận, đó là chọn 4 hoặc 8 điểm lân cận dôi với điểm đang xét. Thủ tục minh hoajthuaatj toán tô màu theo đường biên: Void T01oang(int X, int y, int mauto, int mauvien) { int mau; mau=getpixel(x,y); 5 if(mau != mauvien)& (mau != mauto) { Putpixel(x, y.mauto); Toloang(x-l,y, mauto, mauvien); Toloang(x, y+1, mauto, mauvien); Toloang(x+l, y, mauto, mauvien); Toloang(x, y-1, mauto, mauvien);}} =>NhưỢc điểm của phương pháp đệ quy là =>không thực hiện được khi vùng loang có diện =>tích lớn( dẫn đến tràn Stack 1.Phương pháp đê quy: Bư ớc 1: khởi tạo hang đợi (hoặc stack) với phần lử đắu tiên là P(x,y) đã được tô Bư ớc 2: khi hàng đợi (hoặc stack) không rỗng thì: + L ấy ra từ hang đỢi(hoặc stack) một điểm Q. + tìm các điểm lân cận của Q chưa tô thì tô chúng và đưa chúng vào hang đỢi(hoặc stack) Bước 3 này đưỢc lặp đi lặp lại cho đến khi hang đợi (hoặc stack) rỗng struct DS { int x,y; 6 struct DS*next; }; struct DS*dau; void push(int x, inty) { struct DS*P; P=(D S*) calloc(l,sizeof(DS)); P->x=x; P->y=; P->next=NULL; if(dau !=NULl) P->next= dau; dau=P;} Void pop(int *x, int*y) { struct DS*P; P=dau; dau=dau->next; *x=P ->x; *y = P->y; free(P);} void tolancan(int x, inty, int inauto, int mauvien) { int mau; mau=getpixel(x,y); if((mau != mauto)&&(mau !=mauvien)) { putixel(x,y,mauto); 7 Void toloang_stack(int xO, int yO, int mauto, int mauvien){ int x,y; putpixel(xO,yO,mauto); dau=NULL; push(xo,yo); while(dau != NULL) { pop(&x,&y); tolancan(x-l, y, mauto, mauvien); tolancan(x+l, y, mauto, mauvien); tolancan(x, y+1, mauto, mauvien); tolancan(x, y-1, mauto, mauvien);}} push(x,y); I Flood Fill/boundary fill Scan line fill/ scan conversion Đơn giản Phức tạp hơn Thuật toán rời rạc hóa trong không gian màn hình Thuật toán rời rạc hóa trong đối tượng hoặc/và không gian màn hình 8 Yêu cầu gọi hệ thống GetPixel/Val Độc lập với thiêt bị Đòi hỏi điểm seed Không đòi hỏi điểm seed Yêu cầu stack rất lớn Yêu cắn stack nhỏ IlI.C ác thu ật toán xén hình l.Thuât toán Cohen-sutherland Chia m ặt phẳng thành 9 vùng: cửa sổ và 8 vùng xung quanh nó. Mỗi vùng được gán bởi một mã nhị phân 4 bit Giả sử có điểm P(x,y), lúc đó gán mã cho điểm P: Pleft={ 1, nếu Px < xmin Pright={ 1, nếu Px>xmax 0, ngược lại 0, ngược lại Pbottom={ 1, nêu Py<ymin Ptop= { 1, nếu Py>ymax 0, ngược lại 0, ngƯỢc lại 9 Hàm tính mã int ma(pointM){ intm =0; m l=l ml=2 ml=4 ml=8 return m;} Xét đoan thẳng AB. ta có các trường hơp sau: 1.Nêu (M a(A)=0000) và (M a(B)=000) {hay(Ma(A) or M a(B )=0000} thì =>ClipD (F)=A B 2.Nêu (Ma(A) and M a(B))*0000) thì => ClipD(F) = 0 3.Nêu ((Ma(A) and M a(B))=0000) và (M a(A)*0000 hoặc Ma(B)*OOỮO) thì Giả sử M a(A)*0000 { nêu ma(A)=0 ta đổi vai trò A và B } -Nêu A x=Bx(A B thẳng đứng ) thì +Nêu Ay>ymax (A ở trên) thì Ay=ymax’ 10 [...]... XenHihNhiPhan(M ,Q);} IV.Biểu diễn các đôi tượng 3D l.M ô hình khung kết nối Mô hình khung k ết nối (W F-W ireFrame model) thể hiện hình dáng của m ột đôi tƯỢng 3D bởi 2 danh sách: 16 -Danh sách các đỉnh (vertices): lưu tọa đọ các đỉnh -Danh sách các cạnh (edges) nối gữa các đỉnh đó: lưu 2 đỉnh đầu và cuối của từng cạnh, (hình v ẽ) Có nhiều cách đ ể lưu trữ một mo hình W F trên máy tính Có th ể sử dụng cấu trúc... dường cong benzier của các điểm P 0 ,P l,P 2 , ,P n Các điểm pi, i= 0 ,l , ,n gọi là các điểm kiểm soát hay các điểm beier Đa gics tạo bởi các điểm kiểm soát gọi là đa giác kiểm soát hay đa giác benziei Đ ường cong benzier dựa trên (n+1) điểm kiểm soát P 0 ,P l,P 2 , ,P n được cho bưởi công thức: POn ( t)=P (t)= X pk.B nk(t) Trong đó: P(t): là m ột điểm trong m ặt phẳng h oặc trong không gian B nk(t):... Benzier Bài toán: Cho n+1 điểm pO, p Ị p 2, ,pn được gọi là các điểm kiểm soát (điểm điều khiển) Xây dựng đường cong trơn đi qua 2 điểm p và pn được giới hạn trong bao lồ i do n+1 điểm trên tạo ra Thuật toán Caste]jau Đ ể xây dựng đường cong P(t), ta dựa trên một dãy các điểm cho trước rồi tạo ra giá trị P(t) ứng với mỗi giá trị t nào đó Phương pháp này tạo ra đường congdựa trên m ộl dãy các b ư ớ c... veduongthang(A.B);} 2.Thuât toán chia nhi phân Chia m ặt phẳng thành 9 vùng, mỗi vùng được gán bởi m ột mã nhị phân 4 bit -Ý tưởng của thuật toán như sau: L ấ y trung điểm củ a đoạn thẳng và kiểm tra mã của nó đ ể lo ại dần các đoạn con không chứa giao điểm , và cuối cùng cho điểm giữa hội tụ v ề giao điểm của đoạn thẳng với hình chữ nhật, k ết quả là ta thu được đoạn con nằm trong hình ch ữ nhật(nếu... typedef struct WireFrame { int toado3D int sodinh; dinh[maxDinh]; socanh; KieuCanh canh[maxCnah]; 2 Mô hình m ặt đa giác 17 Mô hình các m ặt đa giác(Polygon Mesh model) thể hiện hình dáng của một đối tượng 3D bởi 2 danh sách -Danh sách các đỉnh -Danh sách các m ặt: lưu thứ tự các đỉnh tạo nên m ặt đó (hình v ẽ) Chúng ta có thể đưa ra nhiều cấu trúc dữ liệu khác nhau đ ể lull trữ cho đa giác Dưới đây là... c là n thong thuowgf ta còn gọi các B nk(t) là các hàm trộn 21 Đường cong Benzier dực trên (n+1) điểm kiểm soát pO,pl, ,pn được cho bưởi coog thức: POn ( 0 = P (t)= £ P k B nk(t) Tư ơng tự, đối với m ặt benzier ta có phương trình sau: P(u,v)—X ỵ p I,k Bim (u) Bkn(V) Trong trường hỢp này khôi đa diện kiểm soát sẽ có (m + l)(n + l) đỉnh Minh hoa v ẽ đường cong benzier trong m ăt phẳng Typedef struct... thì có ít nhất m ột đoạn hoàn toàn nằm ngoài hình ch ữ nhật -Thuật toán: 1.N êu (M ã(A ) = 0000) và M ã(B )=0000) thì =>C lip D (F) = A B 2 Nêu (M ã(A ) AND M ã(B))*0D 00 thì = > C lip D (F )= 0 3.N êu (Mã(A)^OOOO) và M ã(B) = 0000) thì: đỏi vai trò của A, B và áp dụng 4 4.N êu (M ã(A) = 0000) và (M ã(B) *0 0 0 0 ) thì: P :=A ; Q := B ; Trong khi |xP - xQI + lyP - yQ|>=2 thì: L â y trung điểm M của... chương trình: P01(t)= (l-t).P 0 + t.P l (1) P ll( t ) = (l-t).P l+ l.P 2 (2) P 0 2 (t)= (l-t).P 0 1 + t.P ll (3) Trong đó t e [0 1] Thay (1), (2) vào (3) ta được: P(t)= P02(t)= (1 -0 2 P 0 + 2 t.(l-t).P l + t2.p2 Đây là m ột đường cong b ậc 2 theo t nên nó là m ột Parabol -Tổng quát hóa ta có thuật toán Casteljau cho (n+1) điểm kiểm soát: G iả sử ta có tập điểm : P0,P1,P2, ,P n v ớ i mỗi giá trị t cho trước,... cho trước rồi tạo ra giá trị P(t) ứng với mỗi giá trị t nào đó Phương pháp này tạo ra đường congdựa trên m ộl dãy các b ư ớ c nội suy tuyến tính hay nội suy khoảng giữa(In-Betweening) với 3 điểm PO, P l, P2 ta có thể xây dựng một Parabol nội suy từ 3 điểm này bằng cách chọn một giá trị t e [0,1] rồi chia đoạn P0P1 theo tỉ lệ t, ta được điểm P01, trên P0P1 Tương t ự , ta chia tiếp P1P2 cũng theo tỉ lệ...ngưỢc lại (A ở dưới) Ay=ymin = > C lipD (F)=A B -NgƯỢc lạ i (trường hợp A x^B x): +Tính h ệ sô góc m =(By-A y)/(Bx-A x) {đ ể tính giao của A B với HCN} Vì A nằm ngoài hình ch ữ nhật nên: +N êu Axxm ax thì thay A bởi điểm giao . xảy ra một trong hai trường hỢp lhay 2 void ClipCohen(Point A, oint B, Point wmin, Point wmax) { int thoat,ve; double m; thoat=0; v e=l; 11 while(thoat==0) { if((ma(A) I m a(B)==0) thoat=l; else. thoat=l; else if((m a(A)& ma(B))!=0){thoat=l; ve=0} else { if(m (A)==0) hoanvi(&A,&B); if(A.x==B .x) { if(A.y>wmax.y) A.y=wmax.y; else A.y=wmin.y;} else{ m=(double)(B.y-A.y)/(b.x-A.x); if(A.x<wmin.x){. fill/ scan conversion Đơn giản Phức tạp hơn Thuật toán rời rạc hóa trong không gian màn hình Thuật toán rời rạc hóa trong đối tượng hoặc/và không gian màn hình 8 Yêu cầu gọi hệ thống GetPixel/Val Độc