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.