program lab1_2; uses crt, graph; const nm = 80; cm = 60; type Point3D = record x, y, z, p: single; end; Matrix = array[0..nm,0..nm] of single; var m, t: Matrix; p: array[0..nm] of Point3D; grDriver, grMode, i, n, c, j: integer; tmp1, tmp2, tmp3: byte; lines: array[0..cm,0..10] of byte; f: text; scale: single; procedure GetXY(var m: Matrix; var p: Point3D; var x, y: integer); var d: Point3D; k: extended; begin d.x := (p.x*m[0,0]+p.y*m[0,1]+p.z*m[0,2]+p.p*m[0,3]); d.y := (p.x*m[1,0]+p.y*m[1,1]+p.z*m[1,2]+p.p*m[1,3]); d.z := (p.x*m[2,0]+p.y*m[2,1]+p.z*m[2,2]+p.p*m[2,3]); d.p := (p.x*m[3,0]+p.y*m[3,1]+p.z*m[3,2]+p.p*m[3,3]); d.x := d.x/d.p; d.y := d.y/d.p; d.z := d.z/d.p; k := 200/(p.z+200); x := round(GetMaxX div 2+d.x*k); y := round(GetMaxY div 2-d.y*k); end; procedure Line3D(var m:Matrix; p1,p2:Point3D); {процедура малювання 3-вимiрної лiнiї} var x1, y1, x2, y2:integer; begin GetXY(m,p1,x1,y1); GetXY(m,p2,x2,y2); Line(x1,y1,x2,y2); end; procedure Transform(var m, m1, m2: Matrix); {процедура множення матриць} var x, y, i: integer; begin for x := 0 to 3 do for y := 0 to 3 do begin m[x,y] := 0; for i := 0 to 3 do m[x,y] := m[x,y]+m1[i,y]*m2[x,i]; end; end; procedure DrawFigure(n: integer); var s: boolean; begin s := true; grDriver := Detect; InitGraph(grDriver,grMode,''); m[0,0] := 1; m[0,1] := 0; m[0,2] := 0; m[0,3] := 0; m[1,0] := 0; m[1,1] := 1; m[1,2] := 0; m[1,3] := 0; m[2,0] := 0; m[2,1] := 0; m[2,2] := 1; m[2,3] := 1; m[3,0] := 0; m[3,1] := 0; m[3,2] := 0; m[3,3] := 1; SetBkColor(1); for i := 1 to n do begin ClearDevice; SetColor(14); Line(15,GetMaxY div 2,GetMaxX-15,GetMaxY div 2); Line(GetMaxX-15,GetMaxY div 2,GetMaxX-25,(GetMaxY div 2)+5); Line(GetMaxX-15,GetMaxY div 2,GetMaxX-25,(GetMaxY div 2)-5); OutTextXY(GetMaxX - 10,GetMaxY div 2 - 3,'X'); SetColor(10); Line(GetMaxX div 2,15,GetMaxX div 2,GetMaxY-15); Line(GetMaxX div 2,15,(GetMaxX div 2)-5,25); Line(GetMaxX div 2,15,(GetMaxX div 2)+5,25); OutTextXY(GetMaxX div 2 - 4,4,'Y'); SetColor(15); Line(GetMaxX-18,18,18,GetMaxY-18); Line(18,GetMaxY-18,22,GetMaxY-28); Line(18,GetMaxY-18,30,GetMaxY-20); OutTextXY(5,GetMaxY-15,'Z'); SetColor(12); for i:=0 to c-1 do begin for j:=1 to lines[i,0]-1 do Line3D(m,p[lines[i,j]],p[lines[i,j+1]]); Line3D(m,p[lines[i,lines[i,0]]],p[lines[i,1]]); end; Transform(m,t,m); if s then begin SetColor(15); OutTextXY(GetMaxX div 2 - 45,400,'Press any key...'); ReadKey; s := false; end else Delay(1500); end; SetColor(15); OutTextXY(GetMaxX div 2 - 45,400,'Press any key...'); ReadKey; CloseGraph; ClrScr; end; begin scale := 100; assign(f,'figure.txt'); reset(f); read(f,n,c,tmp1); for i := 0 to n - 1 do begin read(f,p[i].x,p[i].y,p[i].z); p[i].p := 1; p[i].x := p[i].x*scale; p[i].y := p[i].y*scale; p[i].z := p[i].z*scale; end; for i := 0 to c - 1 do begin read(f,lines[i,0]); for j := 1 to lines[i,0] do read(f,lines[i,j]); read(f,tmp1,tmp2,tmp3); end; close(f); t[0,0] := Cos(Pi/100); t[0,1] := 0; t[0,2] := -Sin(Pi/100); t[0,3] := 0; t[1,0] := 0; t[1,1] := 1; t[1,2] := 0; t[1,3] := 0; t[2,0] := Sin(Pi/100); t[2,1] := 0; t[2,2] := Cos(Pi/100); t[2,3] := 0; t[3,0] := 0; t[3,1] := 0; t[3,2] := 0; t[3,3] := 1; DrawFigure(3); end. |