24/05/2018, 14:30

lập trình xem ảnh ba chiều

Chương trình ví dụ sau đây minh họa việc sinh ra ảnh bằng chiếu phối cảnh và phép chiếu song song của một đối tượng. Program Polycon; Uses Crt, Graph, Graph3d; Const MaxSommet = 50; MaxFaces = 30; ...

Chương trình ví dụ sau đây minh họa việc sinh ra ảnh bằng chiếu phối cảnh và phép chiếu song song của một đối tượng.

Program Polycon;

Uses Crt, Graph, Graph3d;

Const MaxSommet = 50;

MaxFaces = 30;

MaxAretes = 10;

IncAng = 5;

IncRho = 1;

IncEcran = 20;

Var St : Array [1..MaxSommet, 1..3] of real;

Fc : Array [1..MaxFaces,0..MaxAretes] of integer;

fff : Array [1..MaxFaces] of boolean;

O1, O2, O3 : Real;

NF : Integer;

Pointille : Boolean;

Procedure VueDeDepart;

Begin

Projection := Perspective;

Rho := 15; Theta := 0; Phi := 0;

DE := 400; Pointille := True;

End;

Procedure LectureSommets;

Begin

St[1,1] := 2; St[1,2] := 2.7; St[1,3] := -2;

St[2,1] := 2; St[2,2] := 2.7; St[2,3] := 0;

St[3,1] := 2; St[3,2] := -2.7; St[3,3] := 0;

St[4,1] := 2; St[4,2] := -2.7; St[4,3] := -2;

St[5,1] := -2; St[5,2] := -2.7; St[5,3] := -2;

St[6,1] := -2; St[6,2] := 2.7; St[6,3] := -2;

St[7,1] := -2; St[7,2] := 2.7; St[7,3] := 0;

St[8,1] := 0; St[8,2] := 1.7; St[8,3] := 2;

St[9,1] := 0; St[9,2] := -1.7; St[9,3] := 2;

St[10,1] := -2; St[10,2] := -2.7; St[10,3] := 0;

End;

Procedure LectureFaces;

Begin

NF := 9;

FC[1,0] := 4; FC[1,1] := 1; FC[1,2] := 2; FC[1,3] := 3; FC[1,4] := 4;

FC[2,0] := 4; FC[2,1] := 1; FC[2,2] := 6; FC[2,3] := 7; FC[2,4] := 2;

FC[3,0] := 3; FC[3,1] := 2; FC[3,2] := 7; FC[3,3] := 8;

FC[4,0] := 4; FC[4,1] := 2; FC[4,2] := 8; FC[4,3] := 9; FC[4,4] := 3;

FC[5,0] := 4; FC[5,1] := 1; FC[5,2] := 4; FC[5,3] := 5; FC[5,4] := 6;

FC[6,0] := 4; FC[6,1] := 7; FC[6,2] :=10; FC[6,3] := 9; FC[6,4] := 8;

FC[7,0] := 3; FC[7,1] := 3; FC[7,2] := 9; FC[7,3] :=10;

FC[8,0] := 4; FC[8,1] :=10; FC[8,2] := 5; FC[8,3] := 4; FC[8,4] := 3;

FC[9,0] := 4; FC[9,1] := 5; FC[9,2] :=10; FC[9,3] := 7; FC[9,4] := 6;

End;

ProCedure VecteurVision(St1, St2, St3:integer; Var V1, V2, V3 : rEal);

Begin

V1 := O1 - St[St1,1]; V2 := O2 - St[St1,2]; V3 := O3 - St[St1,3];

End;

Procedure VecteurNormal(St1, ST2, St3:integer; Var N1, N2, N3 : Real);

Var P1, P2, P3, Q1, Q2, Q3 : Real;

Begin

P1 := ST[St2,1] - ST[St1,1];

P2 := ST[St2,2] - ST[St1,2];

P3 := ST[St2,3] - ST[St1,3];

Q1 := ST[St3,1] - ST[St1,1];

Q2 := ST[St3,2] - ST[St1,2];

Q3 := ST[St3,3] - ST[St1,3];

N1 := P2*Q3 - Q2*P3;

N2 := P3*Q1 - P1*Q3;

N3 := P1*Q2 - Q1*P2;

End;

Function ProDuitScalaire(V1, V2, V3, N1, N2, N3: Real):Real;

Begin

ProDuitScalaire := V1*N1 + V2*N2 + V3*N3

End;

Procedure DessineObject;

Var F, St1, St2, St3, NS, No : Integer;

V1, V2, V3, N1, N2, N3 : Real;

X, Y, Z, XO, YO, ZO : Real;

Procedure DessineFace;

Var S : Integer;

Begin

NS := FC[f,0];

For S := 1 To NS Do

Begin

No := FC[F,S]; X := ST[No,1]; Y := ST[No,2]; Z := ST[No,3];

If S = 1 Then Begin

DePlaceEn(X, Y, Z);

XO := X; YO := Y; ZO := Z;

End

Else Tracevers(X, Y, Z);

End;

TraceVers(XO, YO, ZO);

End;

Begin

FillChar(FFF, Sizeof(fff), #0);

SetLineStyle(DottedLn, 0, NormWidth);

SetColor(LightRed);

For F := 1 to NF Do

Begin

St1 := Fc[F,1]; St2 := Fc[F,2]; St3 := Fc[F,3];

VecteurVision(St1, St2, St3, V1, V2, V3);

VecteurNormal(St1, St2, St3, N1, N2, N3);

If ProDuitScalaire(V1, V2, V3, N1, N2, N3) <= 0 then

Begin

If Pointille Then DessineFace;

FFF[f] := True;

End;

End;

SetLineStyle(SolidLn, 0, NormWidth);

SetColor(White);

For F := 1 to Nf Do

If Not FFF[F] Then DessineFace;

End;

Procedure CoordonneeOeil;

Begin

InitialiseProjection;

O1 := Rho * Aux7; O2 := Rho * Aux8; O3 := Rho * Aux2;

End;

Procedure Affichage;

Var S1, S2, S3, S4, S5 : String;

Begin

Cloture(0, MaxX, 0, 23); ClearViewPort;

SetTextStyle(SmallFont, HorizDir, 4);

SetColor(14);

Str(Theta:3:1, S2); Str(Phi:3:1, S3); Str(DE:3:1, S4);

IF Projection = Perspective

Then Begin

Str(Rho:3:1, S1);

OutTextXY(80, 0,'Chieu Phoi Canh: Rho = '+S1+' Theta = '+S2+

+' Phi = '+S3+' Ecran = '+S4);

End

Else OutTextXY(80,0, 'Chieu Song Song: Rho = infini Theta = '+S2+

+' Phi = '+S3+' Ecran = '+S4);

Str(MaxX, S1); Str(MaxY, S2);

OutTextXY(5, 0, S1+' x '+S2);

OutTextXY(5, 12, 'Control: ArrowKey, E, A, +, -, T, C, F-Fine');

Cloture(0, MaxX, 24, MaxY);

End;

Procedure Commandes;

Const RhoPara = 1e20;

Var RhoPersp, DEPersp, DEPara : Real;

Ch : Char;

Begin

VueDeDepart;

DEPara := 30;

CoorDonneeOeil;

DessineObject;

Affichage;

RePeat

Ch := UpCase(Readkey);

IF Ch = #0 Then Ch := UpCase(Readkey);

If Ord(Ch) In [72,80,75,77,69,65,43,45,84,67,61,95]

Then

Begin

ClearDevice;

Case Ord(Ch) Of

72 : Phi := Phi + IncAng;

80 : Phi := Phi - IncAng;

75 : Theta := Theta + IncAng;

77 : Theta := Theta - IncAng;

69 : Rho := Rho + IncRho;

65 : Rho := Rho - IncRho;

43,61 : DE := DE + IncEcran;

45,95 : DE := DE - IncEcran;

84 : Pointille := not (Pointille);

67 : If Projection = Perspective

Then Begin

RhoPersp := Rho;

DEPersp := DE;

Projection := Parallele;

Rho := RhoPara;

DE := DEPara;

End

Else Begin

DEPara := DE;

Projection := Perspective;

Rho := RhoPersp;

De := DePersp;

End;

End;

CoordonneeOeil;

DessineObject;

Affichage

End;

Until (CH = 'F') Or (ch = #13) Or (ch =#27);

EcranTexte;

End;

Begin

EcranGraphique(');

Cloture(0, MaxX, 0, MaxY);

LectureSommets;

LectureFaces;

VueDeDepart;

Commandes;

End.

0