Căi đặt thuật toân

Một phần của tài liệu giáo trình lý thuyết đồ họa (Trang 138 - 150)

V. Mô hình bóng Gouraud

V.1. Căi đặt thuật toân

Dưới đđy lă phần trình băy câc thủ tục phục vụ cho việc vẽ đối tượng 3D đặclồivăcong,theothuậttoânchọnlọcmặtsaucótínhđếnvấn đềchiếusângcủa nguồn sâng xung quanh vă nguồn sâng định hướng xong mỗi đa giâc sẽ được tô bóngtheophươngphâpGouraud.

{Bắtđầuphầnkhaibâophụcvụcho giảithuật tôđagiâctheo phươngphâp

Gouraud}

NutPolyGourand=record {1 đỉnh của đa giâc chiếu (lă ảnh của mặt đa giâcxuốngmặtphẳngOXY}

N:Vector3D; {Phâpvectortại1đỉnhcủađagiâc} x,y:Integer; {Toạđộcủađỉnh}

end;

PolygonGourand=arrayofNutPolyGourand; {mảng động dùng để chứa câc đỉnh của đa giâc chiếu}

CanhCat=record {Một cạnh của đa giâcđược tạo ra nhằm phục vụchoquâtrìnhtínhgiaođiểmnhanh}

y1,y2:Integer; xGiao:real; XStep:real;

NGiao:Vector3D; {Phâp vector tại đỉnh, song sẽ được chứa phâpvectortaigiaođiểmvớiđườngquĩt} NStep:Vector3D; {độ biến thiín của Phâp vector khi di chuyển

dọc theo cạnh, mỗi lần y thay đổi 1 đơn vị thì phâpvectorthayđổimộtlượnglăNStep}

end;

DanhSachCanhCat=arrayofCanhCat;

GiaoDiem=record {Cấu trúc chứa giao điểm của đường quĩt ngangvớicạnhđagiâcchiếu}

Trang134

Chương 8: Các mô hình chiê

úu sáng - Nguyễn Hữu Tài

x,y:Integer; {Toạđộgiaođiểm}

NGiao:Vector3D; {Phâpvectortạigiaođiểm} ChiSoCanh:integer; {Chỉsốcạnhđêtạoragiao điểm} end; DanhsachGiaoDiem=array ofGiaoDiem; Procedure DrawObjGouraud_FilterRearFace(Obj:Obj3D;Canvas:TCanvas;Width,Height:inte ger;Zoom:real; AnhSangNen,AnhSangDinhHuong:real;VectorChieuSang:vector3D;V:Vector3D); {Vẽđốitượng3Dđặclồivăcong}

Vari,j,k,Dem,P,Q,cx,cy:integer; Poly:PolygonGourand;

DinhLinkMat:arrayofRecord {Chứa Danh sâch câc mặt liín kết đến một đinh}

SoMat:Integer; A:arrayofinteger; end;

begin

cx:=Width div2;cy:=Heightdiv2; Setlength(DinhLinkMat,Obj.Sodinh); Setlength(CMLD,Obj.Sodinh);

Fori:=0toobj.Sodinh-1 doCMLD[i]:=0;

{Xâcđịnhmỗiđỉnhcóbaonhiíumặtliínkếtđến} Fori:=0toobj.SoMat-1do

Forj:=0toobj.mat[i].Sodinh-1do begin

K:=obj.mat[i].List[j];

CMLD[k]:=CMLD[k]+1; {Số mặt liín kết đến đỉnh thứ k được tăng lín khicómộtmặtcóliínkếtđếnnó}

end;

{Thiếtlậpdanhsâchcâcmătliínkếtđếntừngđỉnhcủađốitượng} Fori:=0toobj.Sodinh-1do

begin

setlength(DinhLinkMat[i].A,CMLD[i]); {Số mặt liín kết với đỉnh i CMLD[i]}

DinhLinkMat[i].SoMat:=0; end;

{Quâtrìnhxâcđịnhrõnhữngmặtnăo liínkếtvới đỉnhi} Fori:=0toobj.SoMat-1do

Trang135

Chương 8: Các mô hình chiê

úu sáng - Nguyễn Hữu Tài

Forj:=0toobj.mat[i].Sodinh-1do begin K:=obj.mat[i].List[j]; Dem:=DinhLinkMat[K].SoMat; DinhLinkMat[K].A[Dem]:=i; DinhLinkMat[K].SoMat:=DinhLinkMat[K].SoMat+1; end; Setlength(CMLD,0); Fork:=0toObj.SoMat-1do

ifTich_vo_huong(v,Obj.Mat[K].PhapVT)>= 0then {Nếumặtlăkhảkiến} begin

setlength(Poly,Obj.Mat[K].Sodinh); Fori:=0toObj.Mat[K].Sodinh-1do

begin

{thiếtlậpcâcthuộc tínhcủađỉnhthứicủaPoly(đagiâcchiếu)} P:=Obj.Mat[K].list[i];

Poly[i].X:=round(Obj.dinh[P].x*zoom)+cx; Poly[i].Y:=-round(Obj.dinh[P].y*zoom)+cy;

{Tính Vector phâp tuyến tại đỉnh Poly bằng câch tính tổng của câc vectorphâptuyếncủacâcmặtcóliínkếtvới đỉnhđó}

Poly[i].N.x:=0;Poly[i].N.y:=0;Poly[i].N.z:=0; Forj:=0toDinhLinkMat[P].SoMat-1do

begin

Q:=DinhLinkMat[P].A[j];//MatkevoidinhP Poly[i].N.x:=Poly[i].N.x+obj.Mat[Q].PhapVT.x; Poly[i].N.y:=Poly[i].N.y+obj.Mat[Q].PhapVT.y; Poly[i].N.z:=Poly[i].N.z+obj.Mat[Q].PhapVT.z; end; end; FillPolygonGourand(poly,VectorChieuSang,AnhSangNen,AnhSangDinhHuong,C anVas,Obj.Mat[K].Color);

{TôđagiâcPolytheothuậttoântô đagiâc theodòngquĩt, songcónộisuyvector phâp tuyến cho mỗi điểm,vă tính cường độ sâng củamỗi điểm trong đagiâc dựa văovectorphâptuyếntạiđiểmđó.}

end;

setlength(poly,0);

Fori:=0toobj.Sodinh-1do

setlength(DinhLinkMat[i].A,0); Setlength(DinhLinkMat,0); end; Procedure FillPolygonGourand(Poly:PolygonGourand;Vector_Chieu_Sang:Vector3D; Trang136

Chương 8: Các mô hình chiê

úu sáng - Nguyễn Hữu Tài

Anh_Sang_Nen,Anh_Sang_Chieu:real;Canvas:TCanvas;Color:RGBColor);

{TôđagiâcPolytheothuậttoântô đagiâc theodòngquĩt, songcónộisuyvector phâp tuyến cho mỗi điểm,vă tính cường độ sâng củamỗi điểm trong đagiâc dựa văovectorphâptuyếntạiđiểmđó.

Thủ tực năy tươngtự như thủtục đagiâc theothuật toân Z-Buffer song thay nội suy độ sđu z của mỗi điểm, thì thủ tục năy sẽ nội suy phâp vector của mỗi điểm, rồi dựa văo phâp vector của điểm đó tính ra cường độ sâng được donguồnsângđịnhhướngcungcấp.}

varL,H,ND,NG,i,j,Y,MaxY,MinY:integer; {L,H:GioihanchisocuamangPoly

ND:SophantucuamangD:DanhSachCanhCat NG:SophantucuamangG:DanhsachGiaoDiem} D:DanhSachCanhCat; G:DanhsachGiaoDiem; ProcedureTaoDanhSachCanhCat; Vari,d1,d2,Dem,Kc,Cuoi:integer; begin If(Poly[L].x<>Poly[H].x)or(Poly[L].y<>Poly[H].y) then

begin ND:=H-L+1; setlength(D,ND); Cuoi:=H; end else begin ND:=H-L; setlength(D,ND); Cuoi:=H-1; end; Dem:=0;

Fori:=LtoCuoido begin

Ifi<Hthenj:=i+1elsej:=L; IfPoly[i].y<=Poly[j].ythen

begind1:=i;d2:=jend else

begind1:=j;d2:=iend;

D[dem].y1:=Poly[d1].y;D[dem].y2:=Poly[d2].y; D[dem].xGiao:=Poly[d1].x; D[dem].NGiao:=Poly[d1].N; Kc:=(Poly[d2].y-Poly[d1].y); IfKc<>0then Trang137

Chương 8: Các mô hình chiê

úu sáng - Nguyễn Hữu Tài

begin D[dem].XStep:=(Poly[d2].x-Poly[d1].x)/Kc; D[dem].NStep.x:=(Poly[d2].N.x-Poly[d1].N.x)/Kc; D[dem].NStep.y:=(Poly[d2].N.y-Poly[d1].N.y)/Kc; D[dem].NStep.z:=(Poly[d2].N.z-Poly[d1].N.z)/Kc; end else begin D[dem].XStep:=0; D[dem].NStep.x:=0; D[dem].NStep.y:=0; D[dem].NStep.z:=0; end; Dem:=Dem+1; end; end; ProcedureTaoDanhSachGiaoDiem; Vari,Dy:integer; begin Setlength(G,ND);

NG:=0; fori:=0toND-1do begin If(D[i].y1<=y)and(y<=D[i].y2)then begin Dy:=y-D[i].y1; G[NG].x:=round(D[i].xGiao+D[i].XStep*Dy); G[NG].y:=y; G[NG].NGiao.x:=D[i].NGiao.x+D[i].NStep.x*Dy; G[NG].NGiao.y:=D[i].NGiao.y+D[i].NStep.y*Dy; G[NG].NGiao.z:=D[i].NGiao.z+D[i].NStep.z*Dy; G[NG].ChiSoCanh:=i; NG:=NG+1; end; end; end; ProcedureSapXepVaLoc; Vari,j,C1,C2:integer; Tg:GiaoDiem; begin fori:=0toNG-2do Forj:=i+1toNG-1 do IfG[i].x>G[j].xthen begin Tg:=G[i];G[i]:=G[j];G[j]:=Tg; end; Trang138

Chương 8: Các mô hình chiê

úu sáng - Nguyễn Hữu Tài

i:=0;

{KhunhungGiaoDiemthua} Whilei<(NG-2)do

begin

IfG[i].x=G[i+1].xthen//Trungnhau

beginC1:=G[i].ChiSoCanh;C2:=G[i+1].ChiSoCanh; If((D[C1].y1<>D[C2].y1)and(D[C1].y2<>D[C2].y2))or

(D[C1].y1=D[C1].y2)or(D[C2].y1=D[C2].y2)then //Xoabobot1giaodiem

begin Forj:=itoNG-2doG[j]:=G[j+1]; NG:=NG-1; end; end; i:=i+1; end; end; ProcedureToMauCacDoan; Vari,x,K:integer;CuongDoSang,Dx,Dy,Dz:real;

Re,Gr,Bl,Cd:byte; begin

IfRed thenRe:=1else Re:=0; IfGreenthenGr:=1elseGr:=0; IfBluethenBl:=1elseBl:=0; i:=0; Whilei<NG-1do begin K:=G[i+1].x-G[i].x; Ifk<>0 then begin Dx:=(G[i+1].NGiao.x-G[i].NGiao.x)/K; Dy:=(G[i+1].NGiao.y-G[i].NGiao.y)/K; Dz:=(G[i+1].NGiao.z-G[i].NGiao.z)/K; end else begin Dx:=0;Dy:=0;Dz:=0; end;

Forx:=G[i].x toG[i+1].xdo begin

CuongDoSang:=Anh_Sang_Nen+Anh_Sang_Chieu* Cuong_Do_Anh_Sang_Dinh_Huong(Vector_Chieu_Sang,G[i].NGiao);

{Cườngđộ sângtại mỗi điểm được tính bằng tổngcủa cường độ ânh sâng nềncộngvớicườngđộcóđược từ nguồn sâng định hướng,song để tínhđượccường độsângcóđược từnguồnđịnghướng cungcấpthì

Trang139

Chương 8: Các mô hình chiê

úu sáng - Nguyễn Hữu Tài

chúngtadựavăotiatới(Vector_Chieu_Sang)vă phâpvectorcủađiểm G[i].Ngiao.}

Cd:=round(255*CuongDoSang);

Canvas.Pixels[x,G[i].y]:=rgb(Cd*Re,Cd*Gr,Cd*Bl);

{NộisuyphâpvectorcủađiểmtiếptheovăgânvăoG[i].NGiao} G[i].NGiao.x:=G[i].NGiao.x+dx; G[i].NGiao.y:=G[i].NGiao.y+dy; G[i].NGiao.z:=G[i].NGiao.z+dz; end; i:=i+2; end; end; begin L:=low(Poly);H:=High(Poly); MaxY:=Poly[L].y;MinY:=MaxY; Fori:=L+1toHdo

ifMaxY<Poly[i].y then MaxY:=Poly[i].y else IfMinY>Poly[i].ythen MinY:=Poly[i].y; TaoDanhSachCanhCat; Fory:=MinYtoMaxY do

begin TaoDanhSachGiaoDiem; SapXepVaLoc; ToMauCacDoan; end; Setlength(D,0); Setlength(G,0); end;

VI. Băi tậpcuối chương

Băi 1: Xđy dựng một chương trìnhcho phĩp quan sât vậtthể 3D đặc lồi.Chương trình cho phĩp thay đổi vị trí quan sât,cho phĩp thể hiện tâcđộng của câcnguồn sângxungquanh văđịnhhướnglínđốitượng.

Nđng cao: Chothĩp thayđổi cường độ của câc nguồn sâng,cũng như thay đổihướngchiếucủanguồnsângđịnhhướng.

Băi 2: Hêy xđy dựng chương trình với câc chức năng như Băi 1 song sử dụng phươngphâptôbóngGouraud.

Băi3:Hêytổnghợpcâckiếnthứcđêbiếtđểxđydựngmột chươngtrìnhmôphỏng thếgiớithựctrongđócó nhiềuđốitượngkhâcnhauvậnđộng.

Trang140

Chương 8: Các mô hình chiê

Trang141

Mục Lục

Ch

ươngI: Câcyếut ốcơsởc ủ ađồho ạ...2

I. Câckhâiniệmcơbản...2

I.1. Thi ếtbịđồho ạvăđ iểmảnh(Pixel)...2

I.2. Đ iểmvăĐ oạnthẳngtrongmặtphẳng...2

II. Câcthuậttoânvẽđ oạnth ẳng...3

II.1. Vẽđ oạnthẳngdựavăophươngtrình...3

II.2. Vẽđ oạnthẳngdựavăothuậttoânBresenham...5

II.2.a. TómtắtthuậttoânBresenham:...9

II.2.b. Víd ụ :...9

II.2.c. Hướngdẫnchocâctrườnghợphệs ốgócngoăikhoảng[0,1]...11

II.2.d. Căiđặtthuậttoân...12

III. Câcthuậttoânvẽđườngtròn...12

III.1. ThuậttoânvẽđườngtrònMidPoint...13

III.1.a. TómtắtthuậttoânvẽđườngtrònMidPoint:...15

III.1.b. Căiđặt...16

III.2.a. TómtắtthuậttoânvẽđườngtrònBresenham:...18

III.2.b. Căiđặt...19

IV. ThuậttoânvẽEllipse...19

IV.1. ThuậttoânBresenhamchovẽhìnhEllipse...20

IV.1.a. TómtắtthuậttoânBresenhamchovẽEllipse:...22

IV.1.b. CăiđặtthuậttoânBresenhamchodựngEllipse...23

V. Băitậpcu ố ichương...25

Ch ươngII: Câchệmău&cơchết ổchứcb ộnhớCardmănhình...26

I. Đ ôinĩtvềcấutrúcmănhìnhmău...26

II. Câchệmău...28

II.1. HệRGB...28

II.2. HệmăuCMY...29

II.3. HệmăuHSV...30

III. Cơchết ổchứcb ộnhớCardmănhình...35

III.1. Cơchếhoạtđộ ngc ủ achếđộmănhình320x200x256mău...35

III.1.a. Căiđặt...36

III.2. Cơchếhoạtđộ ngc ủ amănhìnhtheochuẩnVesa...49

Ch ươngIII: Câcphĩpxĩnhình&tômău...50

I. Tr ườnghợpFlăm ộ ttậphữuhạnđ iểm...51

II. Tr ườnghợpxĩnm ộ tđ oạnthẳngvăom ộ tvùnghìnhchữnhậtc ủ aR2...51

II.1. Khicóm ộ tcạnhc ủ ahìnhchữnhậtsongsongvớitr ụ ctoạđộ...51

II.1.a. ThuậttoânCohen-Sutherland...52

II.1.a.i. Kếtthúcgiảithuật...55

II.1.a.ii. Sauđ đylăm ộ thămtínhmê...55

II.1.a.iii. Căiđặtthuậttoân...56

II.1.b. ThuậttoânChianhịphđn...56

II.1.b.i. Căiđặtthuậttoân...57

II.1.c. ThuậttoânLiang-Barsky...57

II.1.c.i. Căiđặtthuậttoân...58

II.2. Khi1cạnhc ủ ahìnhchữnh ậttạovớitr ụ choănhm ộ tgócα:...58

Trang142 Chương 8: Các mô hình chiê úu sáng - Nguyễn Hữu Tài III. Clipping ộ tm đ agiâcvăom ộ tvùnghìnhchữnhật...59

III.1. Gi ảithuậtSutherland–Hodgman...59

III.1.a. Căiđặtthuậttoân...60

III.1.b. Nh ượcđ iểmthuật ảgi iSutherland-Hodgmanvăcâchkhắcph ục...60

IV. M ộ ts ốthuậttoântômău...60

IV.1. Gi ảithuậtvếtdầuloang...60

IV.1.a. Ph ươngphâpđệquy...61

IV.1.a.i. Căiđặtthuậttoân...62

IV.1.b. Ph ươngphâpkhôngđệquy...63

IV.1.b.i. Căiđặtthuậttoân...63

IV.2. Thuậttoântômăuđ agiâctheodòngquĩt(Scan-lineAlgorithm)...65

IV.2.a. Căiđặtthuậttoân...68

V. Băitậpcu ố ichương...68

Ch ươngIV: Câcphĩpbiếnđổ ihìnhh ọc...69

I. Câcphĩpbiếnđổ iAffine2D(2-chiều)...69

I.1. Phĩptị nhti ến...69

I.2. Phĩp ngđồ dạng...70

I.3. Phĩp iđố xứng...70

I.5. Phĩpbiếndạng(Twist Transformation)...71

I.6. Toạđộthuầnnhất(HomogeneousCoordinates)...71

I.7. T ổ nghợpcâcphĩpbiếnđổ iAffine...71

I.8. Phĩpquayquanhđ iểmbấtk ỳ...73

I.9. Câcvíd ụminhh ọ a...73

I.9.a. Víd ụ1:...73

I.9.b. Víd ụ2:...74

I.10. Bi ến iđổ hệtr ụ ct ọ ađộ(haybiếnđổ ing ược)...75

I.11. Căiđặt...77

II. Câcphĩpbiếnđổ iAffine3D...77

II.1. Câchệtr ụ ct ọ ađộ...77

II.2. Câccôngthứcbiếnđổ i...78

II.2.a. Phĩptị nhti ến...78

II.2.b. Phĩpbiếnđổitỉlệ...78

II.2.c. Phĩp iđố xứng...78

II.2.d. Phĩpquay...79

III. Câcphĩpchiếuvậtthểtrongkhônggianlínmặtphẳng...79

III.1. Phĩpchiếuph ố icảnh(Perspective)...79

III.2. Phĩpchiếusongsong...81

IV. Quansâtvậtthể3D&Quayhệquansât...81

IV.1. Phĩpchiếuph ố icảnh...85

IV.2. Phĩpchiếusongsong...85

IV.3. Căiđặt...86

IV.4. Víd ụminhh ọa...86

V. Băitậpcu ố ichương...86

Ch ươ ngV: Câcphươngphâpdựngđườngcongvămặtcong...87

I. ĐườngcongBezier&mặtcongBezier...87

I.1. ThuậttoândeCasteljau:...88

I.2. DạngBERNSTEINc ủ acâcđườngcongBEZIER...88

I.3. Dạngbiểudiễnmatrậnc ủ ađườngBezier...89

I.4. Câctínhchấtc ủ ađườngcongBEZIER...90

Trang143 Chương 8: Các mô hình chiê úu sáng - Nguyễn Hữu Tài I.4.a. N ộ isuyđượccâcđ iểmđầ uvăđ iểmcu ố i:...90

I.4.b. TínhbấtbiếnAffine:...90

I.4.c. Tínhchấtc ủ abaol ồi...91

I.4.d. Độchínhxâctuyếntính:...91

I.4.e. Bấtbiếnvớinh ữngphĩpbiếnđổ iAffine:...92

I.4.f. Đạohămc ủ acâcđườngBezier:...92

I.5. Đ ânhgiâcâcđườngcongBezier&sựkhâcbiệtc ủ acâcđườngcongSpline: 92 II. ĐườngcongSplinevăB-Spline:...93

Ch ươngVI: MôhìnhWireFrame...96

I. MôhìnhWireframe:...97

II. Vẽhìnhdựatríndữli ệukiểuWireFramevớicâcphĩpchiếu...99

II.1. Phĩpchiếutr ựcgiaođơngi ản...99

II.2. Phĩpchiếuph ố icảnhđơngiản...99

II.2.a. Căiđặtthuậttoân...100

III. Băitậpcu ố ichương...103

Ch ươngVII: Môhìnhcâcmặtđ agiâc&Vấnđềkhửmặtkhuất...106

I.1. Cấutrúcvậtthểbằngmôhình"câc m ặ tđ a giâc"...106

II. Câcphươngphâpkhửmặtkhuất...109

II.1. Gi ảithuậtng ườithợsơnvăsắpxếptheochiềusđu(Depth-Sorting)...109

II.2. Thuậttoânchọ nl ọ cmặtsau...112

II.3. Thuậttoânvùngđệmđộsđu(Z-Buffer)...114

II.3.a. Căiđặtminhhoạchothuậttoân“vùngđệmđộsđu”...116

III. Băitậpcu ố ichương...123

Ch ươngVIII: Câcmôhìnhchiếusâng...125

I. Khâiniệm...125

II. Nguồ nsângxungquanh...125

III. Nguồ nsângđịnhhướng...125

III.1. Căiđặtthuậttoân...127

IV. Nguồ nsângđ iểm...129

V. MôhìnhbóngGouraud...130

V.1. Căiđặtthuậttoân...134

VI. Băitậpcu ố ichương...140

M ụ c ụ cL ... 142

Một phần của tài liệu giáo trình lý thuyết đồ họa (Trang 138 - 150)

Tải bản đầy đủ (DOCX)

(150 trang)
w