home *** CD-ROM | disk | FTP | other *** search
- (***********************************************************)
- (* *)
- (* TURBO GRAPHIX version 1.06A *)
- (* *)
- (* Polygon drawing module *)
- (* Module version 1.06A *)
- (* *)
- (* Copyright (C) 1985 by *)
- (* BORLAND International *)
- (* *)
- (***********************************************************)
-
- procedure DrawPolygon(A : PlotArray;I0, NPoints, Line, Scale, Lines : integer);
- var
- I, X1, X2, Y1, Y2, XOffset, YOffset,
- X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc,
- DeltaY, XOs1, XOs2, YOs1, YOs2 : integer;
- AutoClip, DirectModeLoc, PlotLine, PlotSymbol, Flipped : boolean;
- X1Loc, Y1Loc, X2Loc, Y2Loc : integer;
- Temp : real;
-
- procedure DrawPointClipped(X, Y : integer);
- begin
- if (X1 > X1RefGlb shl 3) and (X2 < X2RefGlb shl 3 + 7) then
- if (Y1 > Y1RefGlb) and (Y2 < Y2RefGlb) then
- DP(X, Y);
- end; { DrawPointClipped }
-
- procedure DrawItem(X, Y : integer);
- var
- LineStyleLoc : integer;
- begin
- LineStyleLoc := LineStyleGlb;
- SetLineStyle(0);
- case Line of
- 2 : DrawCrossDiag(X, Y, Scale);
- 3, 4 : DrawSquareC(X - Scale, Y + Scale, X + Scale, Y - Scale, (Line = 4));
- 5 : DrawDiamond(X, Y, Scale + 1);
- 6 : DrawWye(X, Y, Scale + 1);
- 1 : DrawCross(X, Y, Scale);
- 8 : DrawCircleDirect(X, Y, Scale + 1, false);
- 9 : begin
- PlotLine := false;
- if AutoClip then
- DrawPointClipped(X, Y)
- else
- DP(X, Y);
- end;
- 7 : DrawStar(X, Y, Scale);
- end;
- SetLineStyle(LineStyleLoc);
- end; { DrawItem }
-
- begin { DrawPolygon }
- if not AxisGlb then
- begin
- with World[WorldNdxGlb] do
- begin
- Temp := Y1;
- Y1 := Y2;
- Y2 := Temp;
- end;
- SelectWorld(WorldNdxGlb);
- SelectWindow(WindowNdxGlb);
- Flipped := true;
- end
- else
- Flipped := false;
- if abs(NPoints - I0) >= 2 then
- begin
- X1Loc := X1Glb;
- Y1Loc := Y1Glb;
- X2Loc := X2Glb;
- Y2Loc := Y2Glb;
- DirectModeLoc := DirectModeGlb;
- DirectModeGlb := true;
- AutoClip := (NPoints < 0);
- NPoints := abs(NPoints);
- XOs1 := 1;
- XOs2 := 1;
- YOs1 := 6;
- YOs2 := 6;
- if AxisGlb then
- begin
- XOs1 := 4;
- XOs2 := 2;
- YOs1 := 6;
- YOs2 := 14;
- if (((X2RefGlb + 7 - XOs2 - X1RefGlb + XOs1) > (XOs1 + XOs2) shl 1) and
- (Y2RefGlb - YOs2 - Y1RefGlb + YOs1 > (YOs1 + YOs2) shl 1)) then
- begin
- X1RefLoc := X1RefGlb;
- X1 := X1RefGlb + XOs1 + X1Glb;
- Y1RefLoc := Y1RefGlb;
- Y1 := Y1RefGlb + YOs1 + Y1Glb;
- X2RefLoc := X2RefGlb;
- X2 := X2RefGlb - XOs2 - X2Glb;
- Y2RefLoc := Y2RefGlb;
- Y2 := Y2RefGlb - YOs2 - Y2Glb;
- ReDefineWindow(WindowNdxGlb, X1, Y1, X2, Y2);
- SelectWindow(WindowNdxGlb);
- AxisGlb := true;
- end;
- end;
- PlotLine := (Line >= 0);
- PlotSymbol := (Line <> 0);
- Line := abs(Line);
- Scale := abs(Scale);
- if Lines < 0 then
- DeltaY := Trunc(1.0 / (abs(Y1WldGlb) + abs(Y2WldGlb)) *
- abs(Y1WldGlb) * abs(Y2RefGlb - Y1RefGlb)) + 1
- else
- DeltaY := 0;
- if (NPoints < 2) and MessageGlb then
- Writeln('<DrawPolygon>: too few data pairs -> (NPoints) >= 2')
- else
- begin
- X1 := WindowX(A[I0, 1]);
- Y1 := Y2RefGlb + Y1RefGlb - WindowY(A[I0, 2]);
- DrawItem(X1, Y1);
- if Abs(Lines) = 1 then
- if AutoClip then
- DrawLineClipped(X1, Y2RefGlb - DeltaY, X1, Y1)
- else
- DrawLine(X1, Y2RefGlb - DeltaY, X1, Y1);
- for I:= I0 + 1 to NPoints do
- begin
- X2 := WindowX(A[I, 1]);
- Y2 := Y2RefGlb + Y1RefGlb - WindowY(A[I, 2]);
- DrawItem(X2, Y2);
- if Abs(Lines) = 1 then
- if AutoClip then
- DrawLineClipped(X2, Y2RefGlb - DeltaY, X2, Y2)
- else
- DrawLine(X2, Y2RefGlb - DeltaY, X2, Y2);
- if PlotLine then
- if AutoClip then
- DrawLineClipped(X1, Y1, X2, Y2)
- else
- DrawLine(X1, Y1, X2, Y2);
- X1 := X2;
- Y1 := Y2;
- end;
- end;
- if AxisGlb then
- begin
- ReDefineWindow(WindowNdxGlb, X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc);
- SelectWindow(WindowNdxGlb);
- X1Glb := X1Loc;
- Y1Glb := Y1Loc;
- X2Glb := X2Loc;
- Y2Glb := Y2Loc;
- AxisGlb := false;
- end;
- DirectModeGlb := DirectModeLoc;
- end
- else
- Error(18, 4);
- if Flipped then
- begin
- with World[WorldNdxGlb] do
- begin
- Temp := Y1;
- Y1 := Y2;
- Y2 := Temp;
- end;
- SelectWorld(WorldNdxGlb);
- SelectWindow(WindowNdxGlb);
- end;
- end; { DrawPolygon }