home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l048 / 1.ddi / POLYGON.HGH < prev    next >
Encoding:
Text File  |  1986-05-19  |  5.1 KB  |  171 lines

  1. (***********************************************************)
  2. (*                                                         *)
  3. (*                TURBO GRAPHIX version 1.06A              *)
  4. (*                                                         *)
  5. (*                  Polygon drawing module                 *)
  6. (*                   Module version 1.06A                  *)
  7. (*                                                         *)
  8. (*                  Copyright (C) 1985 by                  *)
  9. (*                  BORLAND International                  *)
  10. (*                                                         *)
  11. (***********************************************************)
  12.  
  13. procedure DrawPolygon(A : PlotArray;I0, NPoints, Line, Scale, Lines : integer);
  14. var
  15.   I, X1, X2, Y1, Y2, XOffset, YOffset,
  16.   X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc,
  17.   DeltaY, XOs1, XOs2, YOs1, YOs2 : integer;
  18.   AutoClip, DirectModeLoc, PlotLine, PlotSymbol, Flipped : boolean;
  19.   X1Loc, Y1Loc, X2Loc, Y2Loc : integer;
  20.   Temp : real;
  21.  
  22. procedure DrawPointClipped(X, Y : integer);
  23. begin
  24.   if (X1 > X1RefGlb shl 3) and (X2 < X2RefGlb shl 3 + 7) then
  25.     if (Y1 > Y1RefGlb) and (Y2 < Y2RefGlb) then
  26.       DP(X, Y);
  27. end; { DrawPointClipped }
  28.  
  29. procedure DrawItem(X, Y : integer);
  30. var
  31.   LineStyleLoc : integer;
  32. begin
  33.   LineStyleLoc := LineStyleGlb;
  34.   SetLineStyle(0);
  35.   case Line of
  36.     2    : DrawCrossDiag(X, Y, Scale);
  37.     3, 4 : DrawSquareC(X - Scale, Y + Scale, X + Scale, Y - Scale, (Line = 4));
  38.     5    : DrawDiamond(X, Y, Scale + 1);
  39.     6    : DrawWye(X, Y, Scale + 1);
  40.     1    : DrawCross(X, Y, Scale);
  41.     8    : DrawCircleDirect(X, Y, Scale + 1, false);
  42.     9    : begin
  43.              PlotLine := false;
  44.              if AutoClip then
  45.                DrawPointClipped(X, Y)
  46.              else
  47.                DP(X, Y);
  48.            end;
  49.      7   : DrawStar(X, Y, Scale);
  50.    end;
  51.    SetLineStyle(LineStyleLoc);
  52.  end; { DrawItem }
  53.  
  54. begin { DrawPolygon }
  55.   if not AxisGlb then
  56.     begin
  57.       with World[WorldNdxGlb] do
  58.       begin
  59.         Temp := Y1;
  60.         Y1 := Y2;
  61.         Y2 := Temp;
  62.       end;
  63.       SelectWorld(WorldNdxGlb);
  64.       SelectWindow(WindowNdxGlb);
  65.       Flipped := true;
  66.     end
  67.   else
  68.     Flipped := false;
  69.   if abs(NPoints - I0) >= 2 then
  70.   begin
  71.     X1Loc := X1Glb;
  72.     Y1Loc := Y1Glb;
  73.     X2Loc := X2Glb;
  74.     Y2Loc := Y2Glb;
  75.     DirectModeLoc := DirectModeGlb;
  76.     DirectModeGlb := true;
  77.     AutoClip := (NPoints < 0);
  78.     NPoints := abs(NPoints);
  79.     XOs1 := 1;
  80.     XOs2 := 1;
  81.     YOs1 := 6;
  82.     YOs2 := 6;
  83.     if AxisGlb then
  84.     begin
  85.       XOs1 := 4;
  86.       XOs2 := 2;
  87.       YOs1 := 6;
  88.       YOs2 := 14;
  89.       if (((X2RefGlb + 7 - XOs2 - X1RefGlb + XOs1) > (XOs1 + XOs2) shl 1) and
  90.            (Y2RefGlb - YOs2 - Y1RefGlb + YOs1 > (YOs1 + YOs2) shl 1)) then
  91.       begin
  92.         X1RefLoc := X1RefGlb;
  93.         X1 := X1RefGlb + XOs1 + X1Glb;
  94.         Y1RefLoc := Y1RefGlb;
  95.         Y1 := Y1RefGlb + YOs1 + Y1Glb;
  96.         X2RefLoc := X2RefGlb;
  97.         X2 := X2RefGlb - XOs2 - X2Glb;
  98.         Y2RefLoc := Y2RefGlb;
  99.         Y2 := Y2RefGlb - YOs2 - Y2Glb;
  100.         ReDefineWindow(WindowNdxGlb, X1, Y1, X2, Y2);
  101.         SelectWindow(WindowNdxGlb);
  102.         AxisGlb := true;
  103.       end;
  104.     end;
  105.     PlotLine := (Line >= 0);
  106.     PlotSymbol := (Line <> 0);
  107.     Line := abs(Line);
  108.     Scale := abs(Scale);
  109.     if Lines < 0 then
  110.       DeltaY := Trunc(1.0 / (abs(Y1WldGlb) + abs(Y2WldGlb)) *
  111.                              abs(Y1WldGlb) * abs(Y2RefGlb - Y1RefGlb)) + 1
  112.     else
  113.       DeltaY := 0;
  114.     if (NPoints < 2) and MessageGlb then
  115.       Writeln('<DrawPolygon>: too few data pairs  -> (NPoints) >= 2')
  116.     else
  117.       begin
  118.         X1 := WindowX(A[I0, 1]);
  119.         Y1 := Y2RefGlb + Y1RefGlb - WindowY(A[I0, 2]);
  120.         DrawItem(X1, Y1);
  121.         if Abs(Lines) = 1 then
  122.           if AutoClip then
  123.             DrawLineClipped(X1, Y2RefGlb - DeltaY, X1, Y1)
  124.           else
  125.             DrawLine(X1, Y2RefGlb - DeltaY, X1, Y1);
  126.         for I:= I0 + 1 to NPoints do
  127.         begin
  128.           X2 := WindowX(A[I, 1]);
  129.           Y2 := Y2RefGlb + Y1RefGlb - WindowY(A[I, 2]);
  130.           DrawItem(X2, Y2);
  131.           if Abs(Lines) = 1 then
  132.             if AutoClip then
  133.               DrawLineClipped(X2, Y2RefGlb - DeltaY, X2, Y2)
  134.             else
  135.               DrawLine(X2, Y2RefGlb - DeltaY, X2, Y2);
  136.           if PlotLine then
  137.             if AutoClip then
  138.               DrawLineClipped(X1, Y1, X2, Y2)
  139.             else
  140.               DrawLine(X1, Y1, X2, Y2);
  141.           X1 := X2;
  142.           Y1 := Y2;
  143.         end;
  144.       end;
  145.     if AxisGlb then
  146.     begin
  147.       ReDefineWindow(WindowNdxGlb, X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc);
  148.       SelectWindow(WindowNdxGlb);
  149.       X1Glb := X1Loc;
  150.       Y1Glb := Y1Loc;
  151.       X2Glb := X2Loc;
  152.       Y2Glb := Y2Loc;
  153.       AxisGlb := false;
  154.     end;
  155.     DirectModeGlb := DirectModeLoc;
  156.   end
  157.   else
  158.     Error(18, 4);
  159.   if Flipped then
  160.   begin
  161.     with World[WorldNdxGlb] do
  162.     begin
  163.       Temp := Y1;
  164.       Y1 := Y2;
  165.       Y2 := Temp;
  166.     end;
  167.     SelectWorld(WorldNdxGlb);
  168.     SelectWindow(WindowNdxGlb);
  169.   end;
  170. end; { DrawPolygon }
  171.