home *** CD-ROM | disk | FTP | other *** search
- External Graphics::Util(4);
- (*$E+ *)
-
- { The field of vision for a 3 dimensional display is bounded
- by 'clipping planes', the coefficients of which are calculated
- in this procedure. }
- procedure GetPlanes( var Poly : OnePoly; NumPts : counter);
- var
- I,LstI : counter;
- TmpPoly : OnePoly;
- begin { compute plane equation coefficients for polygon edges }
- LstI := NumPts; { leading vertex of the edge }
- for I := 1 to NumPts do
- begin
- with Poly[I] do
- begin { vector cross product using edge endpoints }
- TmpPoly[I].X := Y * Poly[LstI].Z - Z * Poly[LstI].Y;
- TmpPoly[I].Y := Z * Poly[LstI].X - X * Poly[LstI].Z;
- TmpPoly[I].Z := X * Poly[LstI].Y - Y * Poly[LstI].X;
- end; { with Poly[I] }
- LstI := I;
- end; { for loop }
- for I := 1 to NumPts do {copy back to input polygon }
- with TmpPoly[I] do
- begin
- Poly[I].X := X;
- Poly[I].Y := Y;
- Poly[I].Z := Z;
- end { with TmpPoly[I] }
- end; { Getplanes }
- (*$L+ *)
-
- procedure GetScreenScale;
- { get window to screen scale factor }
- var
- I : counter;
- MaxX,MinX,MaxY,MinY : real;
-
- begin
- MaxX:=0.0;
- MinX:=0.0;
- MaxY:=0.0;
- MinY:=0.0; {window must include Z-axis}
- for I := 1 to WindowSize do
- with Window[I] do
- begin
- if X/Z > MaxX then MaxX := X/Z;
- if X/Z < MinX then MinX := X/Z;
- if Y/Z > MaxY then MaxY := Y/Z;
- if Y/Z < MinY then MinY := Y/Z;
- end; { with Window[I] }
- MaxX := MaxX - MinX;
- MaxY := MaxY - MinY;
- if MaxY > (0.75 * MaxX) {standard display is 3 unit high by 4 units wide}
- then ScreenScale.Z := (MaxY * 4 / 3)
- else ScreenScale.Z := MaxX;
- ScreenScale.X := DotsAcross / ScreenScale.Z;
- ScreenScale.Y := (DotsDown * 4 / 3) / ScreenScale.Z;
- end; { GetScreenScale }
- .
-