home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol069
/
util.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-04-29
|
2KB
|
61 lines
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 }
.