home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l045 / 2.ddi / GSHELL.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-12-23  |  31.0 KB  |  1,128 lines

  1. (********************************************************************)
  2. (*                         GRAPHIX TOOLBOX 4.0                      *)
  3. (*       Copyright (c) 1985, 87 by  Borland International, Inc.     *)
  4. (********************************************************************)
  5. unit GShell;
  6.  
  7. interface
  8.  
  9. {$I Float.inc}  { Determines what type Float means. }
  10.  
  11. uses
  12.   Dos, Crt, GDriver, GKernel;
  13.  
  14. procedure DrawAxis(XDens, YDens, XLeft, YTop, XRight, YBottom,
  15.                    XAxis, YAxis : integer; Arrows : boolean);
  16.  
  17. procedure ResetAxis;
  18.  
  19. procedure FindWorld(I : integer; A : PlotArray; NPoints : integer;
  20.                     ScaleX, ScaleY : Float);
  21.  
  22. procedure DrawPolygon(A : PlotArray;I0, NPoints, Line, Scale, Lines : integer);
  23.  
  24. procedure RotatePolygonAbout(var A : PlotArray; NPoints : integer;
  25.                              Theta, X0, Y0 : Float);
  26.  
  27. procedure RotatePolygon(var A : PlotArray; NPoints : integer; Theta : Float);
  28.  
  29. procedure TranslatePolygon(var A : PlotArray; N : integer;
  30.                            DeltaX, DeltaY : Float);
  31.  
  32. procedure ScalePolygon(var A : PlotArray; N : integer;
  33.                        ScaleX, ScaleY : Float);
  34.  
  35. procedure Hatch(X_1, Y_1, X_2, Y_2, Delta : Float);
  36.  
  37. procedure DrawHistogram(A :PlotArray; NPoints : integer;
  38.                         Hatching : boolean; HatchStyle : integer);
  39.  
  40. procedure DrawCircleSegment(Xr0, Yr0 : Float; var Xr1, Yr1 : Float;
  41.                             Inner, Outer, Phi, Area : Float;
  42.                             Txt : WrkString; Option, Scale : byte);
  43.  
  44. procedure DrawCartPie(X1, Y1, X2, Y2, Inner, Outer : Float;
  45.                       A : PieArray; N, Prior, Scale : integer);
  46.  
  47. procedure DrawPolarPie(X1, Y1, Radius, Angle, Inner, Outer : Float;
  48.                        A : PieArray; N, Prior, Scale : integer);
  49.  
  50. procedure Spline(var AA : PlotArray; N : integer; X1, Xm : Float;
  51.                  var BB : PlotArray; M : integer);
  52.  
  53. procedure Bezier(A : PlotArray; MaxContrPoints : integer;
  54.                  var B : PlotArray; MaxIntPoints : integer);
  55.  
  56. implementation
  57.  
  58. procedure DrawAxis{(XDens, YDens, XLeft, YTop, XRight, YBottom,
  59.                    XAxis, YAxis : integer; Arrows : boolean)};
  60. var
  61.   LineStyleLoc, Xk0, Yk0, Xk1, Yk1, Xk2, Yk2, NDiff, X2, Y2,
  62.   MaxExponentX, MaxExponentY, I, Ys, Xs, Delta, NPoints : integer;
  63.   Difference, Number, S, Fract : Float;
  64.   X1RefLoc, X2RefLoc, Y1RefLoc, Y2RefLoc,
  65.   X1RefLoc2, X2RefLoc2, Y1RefLoc2, Y2RefLoc2 : integer;
  66.   ClippingLoc, DirectModeLoc, HeaderLoc : boolean;
  67.  
  68. function StringNumber(X1 : Float; MaxExponent : integer) : WrkString;
  69. var
  70.   Y : WrkString;
  71. begin
  72.   Str(X1 * Exp(-MaxExponent * Ln(10.0)):5:2, Y);
  73.   StringNumber := Y;
  74. end; { StringNumber }
  75.  
  76. function GetExponent(X1 : Float) : integer;
  77. begin
  78.   GetExponent := 0;
  79.   if X1 <> 0.0 then
  80.     if abs(X1) >= 1.0 then
  81.       GetExponent := trunc(Ln(abs(X1)) / Ln(10.0))
  82.     else
  83.       GetExponent := -trunc(abs(Ln(abs(X1))) / Ln(10.0) + 1.0);
  84. end; { GetExponent }
  85.  
  86. procedure DrawNum(X1, Y1, MaxExponent : integer; Number : Float);
  87. var
  88.   I         : integer;
  89.   StrNumber : WrkString;
  90. begin
  91.   StrNumber := StringNumber(Number, MaxExponent);
  92.   Y1 := Y1 - 3;
  93.   for I := 1 to 5 do
  94.     DrawAscii(X1, Y1, 1, Ord(StrNumber[I]));
  95. end; { DrawNum }
  96.  
  97. function Balance : integer;
  98. begin
  99.   Balance := 0;
  100.   S := S + Fract;
  101.   if S >= 0 then
  102.     begin
  103.       S := S - 1.0;
  104.       Balance := 1;
  105.     end;
  106. end; { Balance }
  107.  
  108. procedure DrawExponent(X1, Y1, MaxExponent : integer);
  109. var
  110.   I         : integer;
  111.   StrNumber : WrkString;
  112. begin
  113.   Y1 := Y1 - 3;
  114.   X1 := X1 + 1;
  115.   DrawAscii(X1, Y1, 1, 49);
  116.   DrawAscii(X1, Y1, 1, 48);
  117.   Str(MaxExponent:3, StrNumber);
  118.   Y1 := Y1 - 3;
  119.   X1 := X1 - 7;
  120.   for I := 1 to 3 do
  121.     DrawAscii(X1, Y1, 1, Ord(StrNumber[I]));
  122. end; { DrawExponent }
  123.  
  124. begin { DrawAxis }
  125.   LineStyleLoc := LinestyleGlb;
  126.   SetLineStyle(0);
  127.   DirectModeLoc := DirectModeGlb;
  128.   DirectModeGlb := true;
  129.   with GrafWindow[WindowNdxGlb] do
  130.   begin
  131.     X1RefLoc := X1;
  132.     X2RefLoc := X2;
  133.     Y1RefLoc := Y1;
  134.     Y2RefLoc := Y2;
  135.     ReDefineWindow(WindowNdxGlb, X1 + XLeft, Y1 + YTop,
  136.                    X2 - XRight, Y2 - YBottom);
  137.     SelectWindow(WindowNdxGlb);
  138.   end;
  139.   if (XDens < 0) xor (YDens < 0) then
  140.   begin
  141.     HeaderLoc := HeaderGlb;
  142.     HeaderGlb := false;
  143.     DrawBorder;
  144.     HeaderGlb := HeaderLoc;
  145.   end;
  146.   XDens := abs(XDens);
  147.   YDens := abs(YDens);
  148.   if XDens > 9 then
  149.     XDens := 0;
  150.   if YDens > 9 then
  151.     YDens := 0;
  152.   Xk0 := (X1RefGlb + 4) shl 3;
  153.   Yk0 := Y2RefGlb - 14;
  154.   Yk1 := Y1RefGlb + 6;
  155.   Xk1 := Xk0;
  156.   Yk2 := Yk0;
  157.   Xk2 := (X2RefGlb - 2) shl 3 + 7;
  158.   if (XAxis >= 0) or (YAxis >= 0) then
  159.   begin
  160.     ClippingLoc := ClippingGlb;
  161.     ClippingGlb := true;
  162.     with GrafWindow[WindowNdxGlb] do
  163.     begin
  164.       X1RefLoc2 := X1;
  165.       X2RefLoc2 := X2;
  166.       Y1RefLoc2 := Y1;
  167.       Y2RefLoc2 := Y2;
  168.     end;
  169.     ReDefineWindow(WindowNdxGlb, X1RefLoc2 + 4, Y1RefLoc2 + 6,
  170.                                  X2RefLoc2 - 2, Y2RefLoc2 - 14);
  171.     SelectWindow(WindowNdxGlb);
  172.     DirectModeGlb := false;
  173.     if (XAxis >= 0) then
  174.     begin
  175.       SetLineStyle(XAxis);
  176.       DrawLine(X1WldGlb, Y1WldGlb + Y2WldGlb, X2WldGlb, Y1WldGlb + Y2WldGlb);
  177.       SetLineStyle(0);
  178.     end;
  179.     if (YAxis >= 0) then
  180.     begin
  181.       SetLinestyle(YAxis);
  182.       DrawLine(0, Y1WldGlb, 0, Y2WldGlb);
  183.       SetLineStyle(0);
  184.     end;
  185.     ClippingGlb := ClippingLoc;
  186.     DirectModeGlb := true;
  187.     ReDefineWindow(WindowNdxGlb, X1RefLoc2, Y1RefLoc2, X2RefLoc2, Y2RefLoc2);
  188.     SelectWindow(WindowNdxGlb);
  189.   end;
  190.  
  191.   DrawLine(Xk0, Yk0, Xk1, Yk1);
  192.   if Arrows then
  193.   begin
  194.     DrawLine(Xk0, Yk1, Xk0 - 4, Yk1 + 4);
  195.     DrawLine(Xk0, Yk1, Xk0 + 4, Yk1 + 4);
  196.     DP(Xk0, Yk1 - 1);
  197.   end;
  198.  
  199.   DrawLine(Xk0, Yk0, Xk2 + 1, Yk2);
  200.   if Arrows then
  201.   begin
  202.     DrawLine(Xk2, Yk2, Xk2 - 4, Yk2 - 4);
  203.     DrawLine(Xk2, Yk2, Xk2 - 4, Yk2 + 4);
  204.   end;
  205.  
  206.   if (abs(Yk0 - Yk1) >= 35) and (abs(Xk2 - Xk1) >= 150) then
  207.   begin
  208.     DrawLine(Xk0, Yk0, Xk0 - 4, Yk0);
  209.     DrawLine(Xk0, Yk0, Xk0, Yk0 + 4);
  210.     Delta := Y2RefGlb - Y1RefGlb - 20;
  211.     NPoints := Delta div 7;
  212.     NDiff := Delta - (NPoints shl 3) + NPoints;
  213.     if YDens >= 0 then
  214.     begin
  215.       if abs(Y2WldGlb) > abs(Y1WldGlb) then
  216.         MaxExponentY := GetExponent(Y2WldGlb)
  217.       else
  218.         MaxExponentY := GetExponent(Y1WldGlb);
  219.       DrawNum(X1RefGlb shl 3, Yk0 + 1, MaxExponentY, Y1WldGlb);
  220.       if MaxExponentY <> 0 then
  221.         DrawExponent(X1RefGlb shl 3 + 1, Yk1 + 2, MaxExponentY);
  222.     end;
  223.     Fract := NDiff / NPoints;
  224.     S := -Fract;
  225.     Ys := Yk0;
  226.     Difference := (Y2WldGlb - Y1WldGlb) / NPoints;
  227.     for I := 1 to NPoints do
  228.     begin
  229.       Ys := Ys - 7 - Balance;
  230.       if (YDens >= 0) and (Ys > Y1RefGlb + 13) then
  231.       begin
  232.         Number := Y1WldGlb + I * Difference;
  233.         DrawLine(Xk0, Ys, Xk0 - 4, Ys);
  234.         if YDens >= 0 then
  235.           if I mod (10 - YDens) = 0 then
  236.             DrawNum(X1RefGlb shl 3, Ys + 1, MaxExponentY, Number);
  237.       end;
  238.     end;
  239.  
  240.     if XDens >= 0 then
  241.     begin
  242.       if abs(X2WldGlb) > abs(X1WldGlb) then
  243.         MaxExponentX := GetExponent(X2WldGlb)
  244.       else
  245.         MaxExponentX := GetExponent(X1WldGlb);
  246.       DrawNum(Xk0 - 14, Yk0 + 10, MaxExponentX, X1WldGlb);
  247.       if MaxExponentX <> 0 then
  248.         DrawExponent(Xk2 - 13, Yk0 + 10, MaxExponentX);
  249.     end;
  250.     Delta := abs(X2RefGlb - X1RefGlb) shl 3 - 41;
  251.     NPoints := Delta div 30;
  252.     NDiff := Delta - (NPoints shl 5) + (NPoints shl 1);
  253.     Fract := NDiff / NPoints;
  254.     S := -Fract;
  255.     Xs := Xk0 - 1;
  256.     Difference := (X2WldGlb - X1WldGlb) / NPoints;
  257.     for I := 1 to NPoints do
  258.     begin
  259.       Xs := Xs + 30 + Balance;
  260.       if (XDens >= 0) and (Xs < X2RefGlb shl 3 + 7 - 24) then
  261.       begin
  262.         Number := X1WldGlb + I * Difference;
  263.         DrawLine(Xs, Yk0, Xs, Yk0 + 4);
  264.         if XDens >= 0 then
  265.           if I mod (10 - XDens) = 0 then
  266.             DrawNum(Xs - 14, Yk0 + 10, MaxExponentX, Number);
  267.       end;
  268.     end;
  269.   end;
  270.   ReDefineWindow(WindowNdxGlb, X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc);
  271.   SelectWindow(WindowNdxGlb);
  272.   DirectModeGlb := DirectModeLoc;
  273.   SetLineStyle(LineStyleLoc);
  274.   AxisGlb := true;
  275.   X1Glb := XLeft;
  276.   X2Glb := XRight;
  277.   Y1Glb := YTop;
  278.   Y2Glb := YBottom;
  279. end; { DrawAxis }
  280.  
  281. procedure ResetAxis;
  282. begin
  283.   AxisGlb := true;
  284. end; { ResetAxis }
  285.  
  286. procedure FindWorld{(I : integer; A : PlotArray; NPoints : integer;
  287.                     ScaleX, ScaleY : Float)};
  288. var
  289.   J : integer;
  290.   Xmax, Ymax, Xmin, Ymin, Xmid, Ymid, Xdiff, Ydiff : Float;
  291.  
  292. begin
  293.   NPoints := abs(NPoints);
  294.   if NPoints >= 2 then
  295.     if I in [1..MaxWorldsGlb] then
  296.       begin
  297.         Xmax := A[1, 1];
  298.         Ymax := A[1, 2];
  299.         Xmin := Xmax;
  300.         Ymin := Ymax;
  301.         for J := 2 to NPoints do
  302.         begin
  303.           if A[J, 1] > Xmax then
  304.             Xmax := A[J, 1]
  305.           else
  306.             if A[J, 1] < Xmin then
  307.               Xmin := A[J, 1];
  308.           if A[J, 2] > Ymax then
  309.             Ymax := A[J, 2]
  310.           else
  311.             if A[J, 2] < Ymin then
  312.               Ymin := A[J, 2];
  313.         end;
  314.  
  315.         if ScaleX <> 1.0 then
  316.         begin
  317.           ScaleX := abs(ScaleX);
  318.           Xdiff := Xmax - Xmin;
  319.           Xmid := (Xmax + Xmin) * 0.5;
  320.           Xmax := Xmid + ScaleX * 0.5 * Xdiff;
  321.           Xmin := Xmid - ScaleX * 0.5 * Xdiff;
  322.         end;
  323.  
  324.         if ScaleY <> 1.0 then
  325.         begin
  326.           ScaleY := abs(ScaleY);
  327.           Ydiff := Ymax - Ymin;
  328.           Ymid := (Ymax + Ymin) * 0.5;
  329.           Ymax := Ymid + ScaleY * 0.5 * Ydiff;
  330.           Ymin := Ymid - ScaleY * 0.5 * Ydiff;
  331.         end;
  332.  
  333.         DefineWorld(I, Xmin, Ymin, Xmax, Ymax);
  334.         SelectWorld(I);
  335.       end
  336.     else
  337.       Error(7, 2)
  338.   else
  339.     Error(7, 4);
  340. end; { FindWorld }
  341.  
  342. procedure DrawPolygon{(A : PlotArray;I0, NPoints, Line, Scale, Lines : integer)};
  343. var
  344.   I, X1, X2, Y1, Y2, XOffset, YOffset,
  345.   X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc,
  346.   DeltaY, XOs1, XOs2, YOs1, YOs2 : integer;
  347.   AutoClip, DirectModeLoc, PlotLine, PlotSymbol, Flipped : boolean;
  348.   X1Loc, Y1Loc, X2Loc, Y2Loc : integer;
  349.   Temp : Float;
  350.  
  351. procedure DrawPointClipped(X, Y : integer);
  352. begin
  353.   if (X1 > X1RefGlb shl 3) and (X2 < X2RefGlb shl 3 + 7) then
  354.     if (Y1 > Y1RefGlb) and (Y2 < Y2RefGlb) then
  355.       DP(X, Y);
  356. end; { DrawPointClipped }
  357.  
  358. procedure DrawItem(X, Y : integer);
  359. var
  360.   LineStyleLoc : integer;
  361. begin
  362.   LineStyleLoc := LineStyleGlb;
  363.   SetLineStyle(0);
  364.   case Line of
  365.     2    : DrawCrossDiag(X, Y, Scale);
  366.     3, 4 : DrawSquareC(X - Scale, Y + Scale, X + Scale, Y - Scale, (Line = 4));
  367.     5    : DrawDiamond(X, Y, Scale + 1);
  368.     6    : DrawWye(X, Y, Scale + 1);
  369.     1    : DrawCross(X, Y, Scale);
  370.     8    : DrawCircleDirect(X, Y, Scale + 1, true);
  371.     9    : begin
  372.              PlotLine := false;
  373.              if AutoClip then
  374.                DrawPointClipped(X, Y)
  375.              else
  376.                DP(X, Y);
  377.            end;
  378.      7   : DrawStar(X, Y, Scale);
  379.    end;
  380.    SetLineStyle(LineStyleLoc);
  381.  end; { DrawItem }
  382.  
  383. begin { DrawPolygon }
  384.   if not AxisGlb then
  385.     begin
  386.       with World[WorldNdxGlb] do
  387.       begin
  388.         Temp := Y1;
  389.         Y1 := Y2;
  390.         Y2 := Temp;
  391.       end;
  392.       SelectWorld(WorldNdxGlb);
  393.       SelectWindow(WindowNdxGlb);
  394.       Flipped := true;
  395.     end
  396.   else
  397.     Flipped := false;
  398.   if (I0 <> 0) and (abs(NPoints - I0) >= 2) then
  399.   begin
  400.     X1Loc := X1Glb;
  401.     Y1Loc := Y1Glb;
  402.     X2Loc := X2Glb;
  403.     Y2Loc := Y2Glb;
  404.     DirectModeLoc := DirectModeGlb;
  405.     DirectModeGlb := true;
  406.     AutoClip := (NPoints < 0);
  407.     NPoints := abs(NPoints);
  408.     XOs1 := 1;
  409.     XOs2 := 1;
  410.     YOs1 := 6;
  411.     YOs2 := 6;
  412.     if AxisGlb then
  413.     begin
  414.       XOs1 := 4;
  415.       XOs2 := 2;
  416.       YOs1 := 6;
  417.       YOs2 := 14;
  418.       if (((X2RefGlb + 7 - XOs2 - X1RefGlb + XOs1) > (XOs1 + XOs2) shl 1) and
  419.            (Y2RefGlb - YOs2 - Y1RefGlb + YOs1 > (YOs1 + YOs2) shl 1)) then
  420.       begin
  421.         X1RefLoc := X1RefGlb;
  422.         X1 := X1RefGlb + XOs1 + X1Glb;
  423.         Y1RefLoc := Y1RefGlb;
  424.         Y1 := Y1RefGlb + YOs1 + Y1Glb;
  425.         X2RefLoc := X2RefGlb;
  426.         X2 := X2RefGlb - XOs2 - X2Glb;
  427.         Y2RefLoc := Y2RefGlb;
  428.         Y2 := Y2RefGlb - YOs2 - Y2Glb;
  429.         ReDefineWindow(WindowNdxGlb, X1, Y1, X2, Y2);
  430.         SelectWindow(WindowNdxGlb);
  431.         AxisGlb := true;
  432.       end;
  433.     end;
  434.     PlotLine := (Line >= 0);
  435.     PlotSymbol := (Line <> 0);
  436.     Line := abs(Line);
  437.     Scale := abs(Scale);
  438.     if Lines < 0 then
  439.       DeltaY := Trunc(1.0 / (abs(Y1WldGlb) + abs(Y2WldGlb)) *
  440.                              abs(Y1WldGlb) * abs(Y2RefGlb - Y1RefGlb)) + 1
  441.     else
  442.       DeltaY := 0;
  443.     if (NPoints < 2) and MessageGlb then
  444.       Writeln('<DrawPolygon>: too few data pairs  -> (NPoints) >= 2')
  445.     else
  446.       begin
  447.         X1 := WindowX(A[I0, 1]);
  448.         Y1 := Y2RefGlb + Y1RefGlb - WindowY(A[I0, 2]) - 1;
  449.         DrawItem(X1, Y1);
  450.         if Abs(Lines) = 1 then
  451.           if AutoClip then
  452.             DrawLineClipped(X1, Y2RefGlb - DeltaY, X1, Y1)
  453.           else
  454.             DrawLine(X1, Y2RefGlb - DeltaY, X1, Y1);
  455.         for I:= I0 + 1 to NPoints do
  456.         begin
  457.           X2 := WindowX(A[I, 1]);
  458.           Y2 := Y2RefGlb + Y1RefGlb - WindowY(A[I, 2]) - 1;
  459.           DrawItem(X2, Y2);
  460.           if Abs(Lines) = 1 then
  461.             if AutoClip then
  462.               DrawLineClipped(X2, Y2RefGlb - DeltaY, X2, Y2)
  463.             else
  464.               DrawLine(X2, Y2RefGlb - DeltaY, X2, Y2);
  465.           if PlotLine then
  466.             if AutoClip then
  467.               DrawLineClipped(X1, Y1, X2, Y2)
  468.             else
  469.               DrawLine(X1, Y1, X2, Y2);
  470.           X1 := X2;
  471.           Y1 := Y2;
  472.         end;
  473.       end;
  474.     if AxisGlb then
  475.     begin
  476.       ReDefineWindow(WindowNdxGlb, X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc);
  477.       SelectWindow(WindowNdxGlb);
  478.       X1Glb := X1Loc;
  479.       Y1Glb := Y1Loc;
  480.       X2Glb := X2Loc;
  481.       Y2Glb := Y2Loc;
  482.       AxisGlb := false;
  483.     end;
  484.     DirectModeGlb := DirectModeLoc;
  485.   end
  486.   else
  487.     Error(18, 4);
  488.   if Flipped then
  489.   begin
  490.     with World[WorldNdxGlb] do
  491.     begin
  492.       Temp := Y1;
  493.       Y1 := Y2;
  494.       Y2 := Temp;
  495.     end;
  496.     SelectWorld(WorldNdxGlb);
  497.     SelectWindow(WindowNdxGlb);
  498.   end;
  499. end; { DrawPolygon }
  500.  
  501. procedure RotatePolygonAbout{(var A : PlotArray; NPoints : integer;
  502.                              Theta, X0, Y0 : Float)};
  503. var
  504.   C, S, X, Ph : Float;
  505.   I : integer;
  506.  
  507. begin
  508.   if NPoints >= 2 then
  509.     begin
  510.       Ph := Pi / 180.0 * Theta;
  511.       C := Cos(Ph);
  512.       S := Sin(Ph);
  513.       for I := 1 to NPoints do
  514.       begin
  515.         X := X0 + C * (A[I, 1] - X0) - S * (A[I, 2] - Y0);
  516.         A[I, 2] := Y0 + S * (A[I, 1] - X0) + C * (A[I, 2] - Y0);
  517.         A[I, 1] := X;
  518.       end;
  519.     end
  520.   else
  521.     Error(8, 4);
  522. end; { RotatePolygonAbout }
  523.  
  524. procedure RotatePolygon{(var A : PlotArray; NPoints : integer; Theta : Float)};
  525. var
  526.   X0, Y0 : Float;
  527.   I : integer;
  528.  
  529. begin
  530.   X0 := 0.0;
  531.   Y0 := 0.0;
  532.   for I := 1 to NPoints do
  533.   begin
  534.     X0 := X0 + A[I, 1];
  535.     Y0 := Y0 + A[I, 2];
  536.   end;
  537.   RotatePolygonAbout(A, NPoints, Theta, X0 / NPoints, Y0 / NPoints);
  538. end; { RotatePolygon }
  539.  
  540. procedure TranslatePolygon{(var A : PlotArray; N : integer;
  541.                            DeltaX, DeltaY : Float)};
  542. var
  543.   I : integer;
  544.  
  545. begin
  546.   N := abs(N);
  547.   if N >= 2 then
  548.     for I := 1 to N do
  549.     begin
  550.       A[I, 1] := A[I, 1] + DeltaX;
  551.       A[I, 2] := A[I, 2] + DeltaY;
  552.     end
  553.   else
  554.     Error(9, 4);
  555. end; { TranslatePolygon }
  556.  
  557. procedure ScalePolygon{(var A : PlotArray; N : integer;
  558.                        ScaleX, ScaleY : Float)};
  559. var
  560.   I : integer;
  561.  
  562. begin
  563.   N := abs(N);
  564.   if N >= 2 then
  565.     for I := 1 to N do
  566.     begin
  567.       A[I, 1] := A[I, 1] * ScaleX;
  568.       A[I, 2] := A[I, 2] * ScaleY;
  569.     end
  570.   else
  571.     Error(10, 4);
  572. end; { ScalePolygon }
  573.  
  574. procedure Hatch{(X_1, Y_1, X_2, Y_2, Delta : Float)};
  575. var
  576.   X1, Y1, X2, Y2 : integer;
  577.   DirectModeLoc, Dummy : boolean;
  578.  
  579. procedure HatchDirect(X1, Y1, X2, Y2 : integer; Delta : longint);
  580. var
  581.   I, Count : integer;
  582.   Yst, Yen : longint;
  583.   X1RefLoc, X2RefLoc, Y1RefLoc, Y2RefLoc : integer;
  584.   DirectModeLoc, ClippingLoc : boolean;
  585.   X1D, Y1D, X2D, Y2D : integer;
  586.  
  587. begin { HatchDirect }
  588.   if Delta <> 0 then
  589.   begin
  590.     HatchGlb := true;
  591.     DirectModeLoc := DirectModeGlb;
  592.     DirectModeGlb := true;
  593.     ClippingLoc := ClippingGlb;
  594.     ClippingGlb := true;
  595.     X1RefLoc := X1RefGlb;
  596.     X1RefGlb := X1;
  597.     X2RefLoc := X2RefGlb;
  598.     X2RefGlb := X2;
  599.     Y1RefLoc := Y1RefGlb;
  600.     Y1RefGlb := Y1;
  601.     Y2RefLoc := Y2RefGlb;
  602.     Y2RefGlb := Y2;
  603.     Yst := Y1 + Delta;
  604.     Yen := Y1 - X2 + X1 + Delta;
  605.     if Delta < 0 then
  606.     begin
  607.       Delta := -Delta;
  608.       I := Yst;
  609.       Yst := Yen;
  610.       Yen := I;
  611.     end;
  612.     Count := (Y2 - Y1 + X2 - X1 + X2 - X1) div Delta;
  613.     for I := 1 to Count-1 do
  614.     begin
  615.       X1D := X1;
  616.       Y1D := Yst;
  617.       X2D := X2;
  618.       Y2D := Yen;
  619.       if Clip(X1D, Y1D, X2D, Y2D) then
  620.         DrawLine(X1D, Y1D, X2D, Y2D);
  621.       Yst := Yst + Delta;
  622.       Yen := Yen + Delta;
  623.     end;
  624.     ClippingGlb := ClippingLoc;
  625.     HatchGlb := false;
  626.     X1RefGlb := X1RefLoc;
  627.     X2RefGlb := X2RefLoc;
  628.     Y1RefGlb := Y1RefLoc;
  629.     Y2RefGlb := Y2RefLoc;
  630.     DirectModeGlb := DirectModeLoc;
  631.   end;
  632. end; { HatchDirect }
  633.  
  634. begin { Hatch }
  635.   if DirectModeGlb then
  636.     HatchDirect(trunc(X_1), trunc(Y_1), trunc(X_2), trunc(Y_2), trunc(Delta))
  637.   else
  638.     begin
  639.       DirectModeLoc := DirectModeGlb;
  640.       DirectModeGlb := true;
  641.       X1 := WindowX(X_1);
  642.       Y1 := WindowY(Y_1);
  643.       X2 := WindowX(X_2);
  644.       Y2 := WindowY(Y_2);
  645.       Dummy := Clip(X1, Y1, X2, Y1);
  646.       Dummy := Clip(X1, Y1, X1, Y2);
  647.       HatchDirect(X1, Y1, X2, Y2, trunc(Delta));
  648.       DirectModeGlb := DirectModeLoc;
  649.     end;
  650. end; { Hatch }
  651.  
  652. procedure DrawHistogram{(A :PlotArray; NPoints : integer;
  653.                         Hatching : boolean; HatchStyle : integer)};
  654.  
  655. var
  656.   X1, X2, Y2, NPixels, Delta, NDiff, YRef, LineStyleLoc, I : integer;
  657.   Fract, S, Y, YAxis : Float;
  658.   DirectModeLoc, Negative : boolean;
  659.   Wtemp : WindowType;
  660.   X1Loc, Y1Loc, X2Loc, Y2Loc : integer;
  661.   Temp : Float;
  662.  
  663. function Balance : integer;
  664. begin
  665.   Balance := 0;
  666.   S := S + Fract;
  667.   if S >= 0.0 then
  668.   begin
  669.     S := S - 1.0;
  670.     Balance := 1;
  671.   end;
  672. end; { Balance }
  673.  
  674. begin { DrawHistogram }
  675.   if abs(NPoints) >= 2 then
  676.     begin
  677.       X1Loc := X1Glb;
  678.       Y1Loc := Y1Glb;
  679.       X2Loc := X2Glb;
  680.       Y2Loc := Y2Glb;
  681.       LineStyleLoc := LinestyleGlb;
  682.       SetLineStyle(0);
  683.       if AxisGlb then
  684.       begin
  685.         Wtemp := GrafWindow[WindowNdxGlb];
  686.         ReDefineWindow(WindowNdxGlb, X1RefGlb + 4 + X1Glb, Y1RefGlb + 6 + Y1Glb,
  687.                        X2RefGlb - 2 - X2Glb, Y2RefGlb - 14 - Y2Glb);
  688.         SelectWindow(WindowNdxGlb);
  689.         AxisGlb := true;
  690.       end;
  691.       DirectModeLoc := DirectModeGlb;
  692.       DirectModeGlb := true;
  693.       Negative := NPoints < 0;
  694.       NPoints := abs(NPoints);
  695.       NPixels := (X2RefGlb - X1RefGlb) shl 3 + 7;
  696.       Delta := NPixels div NPoints;
  697.       NDiff := NPixels - Delta * NPoints;
  698.       Fract := NDiff / NPoints;
  699.       S := -Fract;
  700.       X1 := X1RefGlb shl 3;
  701.       Temp := Y2RefGlb + Y1RefGlb - AyGlb;
  702.       if Temp > MaxInt then
  703.         Temp := MaxInt
  704.       else
  705.         if Temp < -32767 then
  706.           Temp := -32767;
  707.       YRef := trunc(Temp);
  708.       if Negative then
  709.         DrawStraight(X1, X2RefGlb shl 3 + 7, YRef);
  710.       YAxis := Y1RefGlb;
  711.       if BYGlb > 0 then
  712.         YAxis := Y2RefGlb;
  713.       for I := 1 to NPoints do
  714.       begin
  715.         X2 := X1 + Delta + Balance;
  716.         Y := A[I, 2];
  717.         if not Negative then
  718.           Y := abs(Y);
  719.         Temp := AyGlb + ByGlb * Y;
  720.         if Temp > MaxInt then
  721.           Temp := MaxInt
  722.         else
  723.           if Temp < -32767 then
  724.             Temp := -32767;
  725.         Y2 := Y2RefGlb + Y1RefGlb - trunc(Temp);
  726.         if not Negative then
  727.           begin
  728.             DrawLine(X1, YAxis, X1, Y2);
  729.             DrawStraight(X1, X2, Y2);
  730.             DrawLine(X2, YAxis, X2, Y2);
  731.             if Hatching then
  732.               if Odd(I) then
  733.                 Hatch(X1, Y2, X2, YAxis, HatchStyle)
  734.               else
  735.                 Hatch(X1, Y2, X2, YAxis, -HatchStyle);
  736.           end
  737.         else
  738.           begin
  739.             DrawLine(X1, YRef, X1, Y2);
  740.             DrawStraight(X1, X2, Y2);
  741.             DrawLine(X2, YRef, X2, Y2);
  742.             if Hatching then
  743.               if YRef - Y2 < 0 then
  744.                 if Odd(I) then
  745.                   Hatch(X1, YRef, X2, Y2, HatchStyle)
  746.                 else
  747.                   Hatch(X1, YRef, X2, Y2, -HatchStyle)
  748.               else
  749.                 if Odd(I) then
  750.                   Hatch(X1, Y2, X2,YRef, HatchStyle)
  751.                 else
  752.                   Hatch(X1, Y2, X2, YRef, -HatchStyle);
  753.           end;
  754.         X1 := X2;
  755.       end;
  756.       if AxisGlb then
  757.       begin
  758.         GrafWindow[WindowNdxGlb] := Wtemp;
  759.         SelectWindow(WindowNdxGlb);
  760.         X1Glb := X1Loc;
  761.         Y1Glb := Y1Loc;
  762.         X2Glb := X2Loc;
  763.         Y2Glb := Y2Loc;
  764.         AxisGlb := false;
  765.       end;
  766.       DirectModeGlb := DirectModeLoc;
  767.       SetLineStyle(LineStyleLoc);
  768.     end
  769.   else
  770.     Error(19, 4);
  771. end; { DrawHistogram }
  772.  
  773. procedure DrawCircleSegment{(Xr0, Yr0 : Float; var Xr1, Yr1 : Float;
  774.                             Inner, Outer, Phi, Area : Float;
  775.                             Txt : WrkString; Option, Scale : byte)};
  776.  
  777. var
  778.   FaktC, FaktS, CDummy, C, S, Radius : Float;
  779.   Phi1, DeltaPhi, CosPhi, SinPhi, CosDphi, SinDphi : Float;
  780.   DeltaX, DeltaY, Xr2, Yr2, RadiusLoc, X0Loc, Y0Loc, X1Loc, Y1Loc : Float;
  781.   I, AsciiCode, TextLen, N, X0, Y0, X1, Y1, X2, Y2 : integer;
  782.   DirectModeLoc : boolean;
  783.   TempText : WrkString;
  784.  
  785. procedure ClippedLine(X1, Y1, X2, Y2 : integer);
  786. begin
  787.   if Clip(X1, Y1, X2, Y2) then
  788.     DrawLine(X1, Y1, X2, Y2);
  789. end; { ClippedLine }
  790.  
  791. procedure ClippedPoint(X, Y : integer);
  792. begin
  793.   if ClippingGlb then
  794.     begin
  795.       if (X >= X1RefGlb shl 3) and (X < X2RefGlb shl 3 + 7) then
  796.         if (Y >= Y1RefGlb) and (Y <= Y2RefGlb) then
  797.           DP(X, Y);
  798.     end
  799.   else
  800.     DP(X, Y);
  801. end; { ClippedPoint }
  802.  
  803. begin { DrawCircleSegment }
  804.   X0Loc := Xr0;
  805.   Y0Loc := Yr0;
  806.   X1Loc := Xr1;
  807.   Y1Loc := Yr1;
  808.   RadiusLoc := Sqrt(Sqr(X1Loc - X0Loc) + Sqr(Y1Loc - Y0Loc));
  809.   if RadiusLoc > 0.0 then
  810.   begin
  811.     Option := abs(Option);
  812.     Inner := abs(Inner);
  813.     Outer := abs(Outer);
  814.     Scale := abs(Scale);
  815.     DirectModeLoc := DirectModeGlb;
  816.     DirectModeGlb := True;
  817.     Phi := Phi * Pi / 180.0;
  818.     if abs(Phi) / (2.0 * Pi) > 1.0 then
  819.       Phi := 2.0 * Pi;
  820.     N := trunc(RadiusLoc * abs(Phi) / 9.0);
  821.     if N < 2 then
  822.       N := 2;
  823.     if (abs(Xr1 - Xr0) > 0) and (abs(Yr1 - Yr0) > 0) then
  824.       Phi1 := ArcTan((Yr1 - Yr0) / (Xr1 - Xr0))
  825.     else
  826.       if Xr1 - Xr0 = 0 then
  827.         if Yr1 - Yr0 > 0 then
  828.           Phi1 := Pi / 2.0
  829.         else
  830.           Phi1 := 1.5 * Pi
  831.         else
  832.           if Xr1 > Xr0 then
  833.             Phi1:=0.0
  834.           else
  835.             Phi1 := Pi;
  836.     DeltaPhi := Phi / (N - 1);
  837.     C := 1.0;
  838.     S := 0.0;
  839.     CosPhi := Cos(Phi1);
  840.     SinPhi := Sin(Phi1);
  841.     CosDphi := Cos(DeltaPhi);
  842.     SinDphi := Sin(DeltaPhi);
  843.     if Xr1 < Xr0 then
  844.       begin
  845.         FaktS := -1;
  846.         FaktC := -1;
  847.       end
  848.     else
  849.       begin
  850.         FaktS := 1;
  851.         FaktC := 1;
  852.       end;
  853.     if (Yr1 = Yr0) and (Xr1 < Xr0) then
  854.     begin
  855.       FaktC := -FaktC;
  856.       FaktS := -FaktS;
  857.     end;
  858.     if Area < 0 then
  859.     begin
  860.       Area := abs(Area);
  861.       DeltaX := FaktC * 0.3 * RadiusLoc * Cos(Phi / 2 + Phi1);
  862.       DeltaY := trunc(FaktS * 0.3 * AspectGlb * RadiusLoc *
  863.                       Sin(Phi / 2 + Phi1) + 0.5);
  864.       Xr0 := Xr0 + DeltaX;
  865.       Yr0 := Yr0 + DeltaY;
  866.     end;
  867.     X0 := WindowX(Xr0);
  868.     Y0 := WindowY(Yr0);
  869.     if not DirectModeLoc then
  870.       ClippedPoint(X0, Y0)
  871.     else
  872.       DP(X0, Y0);
  873.     X1 := X0;
  874.     Y1 := Y0;
  875.     for I := 1 to N do
  876.     begin
  877.       Xr2 := Xr0 + FaktC * RadiusLoc * (CosPhi * C - SinPhi * S);
  878.       X2 := WindowX(Xr2);
  879.       Yr2 := Yr0 + AspectGlb * RadiusLoc * FaktS * (SinPhi * C + CosPhi * S);
  880.       Y2 := WindowY(Yr2);
  881.       if not DirectModeLoc then
  882.         ClippedLine(X1, Y1, X2, Y2)
  883.       else
  884.         DrawLine(X1, Y1, X2, Y2);
  885.       X1 := X2;
  886.       Y1 := Y2;
  887.       CDummy := C * CosDphi - S * SinDphi;
  888.       S := S * CosDphi + C * SinDphi;
  889.       C := CDummy;
  890.     end;
  891.     if not PieGlb then
  892.       if not DirectModeLoc then
  893.         ClippedLine(X1, Y1, X0, Y0)
  894.       else
  895.         DrawLine(X1, Y1, X0, Y0);
  896.       if (Option > 0) and (Phi < 2.0 * Pi) then
  897.       begin
  898.         Xr1 := Xr0 + FaktC * RadiusLoc * Inner * Cos(Phi / 2.0 + Phi1);
  899.         Yr1 := Yr0 + FaktS * AspectGlb * RadiusLoc * Inner * Sin(Phi / 2.0 + Phi1);
  900.         Xr2 := Xr0 + FaktC * RadiusLoc * Outer * Cos(Phi / 2.0 + Phi1);
  901.         Yr2 := Yr0 + FaktS * AspectGlb * RadiusLoc * Outer * Sin(Phi / 2.0 + Phi1);
  902.         X1 := WindowX(Xr1);
  903.         Y1 := WindowY(Yr1);
  904.         X2 := WindowX(Xr2);
  905.         Y2 := WindowY(Yr2);
  906.         if not DirectModeLoc then
  907.           ClippedLine(X1, Y1, X2, Y2)
  908.         else
  909.           DrawLine(X1, Y1, X2, Y2);
  910.         Str(Area:1:2, TempText);
  911.         case Option of
  912.           1 : TempText := Txt;
  913.           2 : TempText := Txt + TempText;
  914.         { 3 : TempText := TempText; }
  915.         end;
  916.         TextLen := Length(TempText);
  917.         if X2 >= X0 then
  918.           X2 := X2 + Scale * 6
  919.         else
  920.           X2 := X2 - TextLen * 6 * Scale;
  921.         DrawText(X2, Y2, Scale, TempText);
  922.       end;
  923.       Xr1 := X0Loc + FaktC * RadiusLoc * Cos(Phi + Phi1);
  924.       Yr1 := Y0Loc + FaktS * RadiusLoc * Sin(Phi + Phi1);
  925.       DirectModeGlb := DirectModeLoc;
  926.   end;
  927. end; { DrawCircleSegment }
  928.  
  929. procedure DrawCartPie{(X1, Y1, X2, Y2, Inner, Outer : Float;
  930.                       A : PieArray; N, Prior, Scale : integer)};
  931. var
  932.   I : integer;
  933.   Sum, AspectLoc : Float;
  934.  
  935. procedure DCS(N : integer);
  936. begin
  937.   DrawCircleSegment(X1, Y1, X2, Y2, Inner, Outer, abs(A[N].Area / Sum * 360),
  938.                     A[N].Area, A[N].Text, Prior, Scale);
  939. end; { DCS }
  940.  
  941. begin { DrawCartPie }
  942.   AspectLoc := AspectGlb;
  943.   AspectGlb := AspectGlb * BXGlb / BYGlb;
  944.   Sum := 0.0;
  945.   for I := 1 to N do
  946.     Sum := Sum + abs(A[I].Area);
  947.   for I := 1 to N - 1 do
  948.   begin
  949.     PieGlb := (A[I].Area > 0) and (A[I + 1].Area > 0);
  950.     DCS(I);
  951.   end;
  952.   PieGlb := (A[N].Area > 0) and (A[1].Area > 0);
  953.   DCS(N);
  954.   PieGlb := true;
  955.   AspectGlb := AspectLoc;
  956. end; { DrawCartPie }
  957.  
  958. procedure DrawPolarPie{(X1, Y1, Radius, Angle, Inner, Outer : Float;
  959.                        A : PieArray; N, Prior, Scale : integer)};
  960. begin
  961.   Angle := Angle / 180 * Pi;
  962.   DrawCartPie(X1, Y1, X1 + Cos(Angle) * Radius, Y1 + Sin(-Angle) * Radius,
  963.               Inner, Outer, A, N, Prior, Scale);
  964. end; { DrawPolarPie }
  965.  
  966. procedure Spline{(var AA : PlotArray; N : integer; X1, Xm : Float;
  967.                  var BB : PlotArray; M : integer)};
  968.  
  969. type
  970.   Vector = array[1..MaxPlotGlb] of Float;
  971.  
  972. var
  973.   I, K    : integer;
  974.   Dx, T   : Float;
  975.   B, C, D : Vector;
  976.  
  977. function SplineEval( T : Float; var I : integer) : Float;
  978. var
  979.   J, K : integer;
  980.   Dx   : Float;
  981. begin
  982.   if I >= N then
  983.     I := 1;
  984.   if (T < AA[I, 1]) or (T > AA[I+1, 1]) then
  985.   begin
  986.     I := 1;
  987.     J := N + 1;
  988.     repeat
  989.       K := (I + J) div 2;
  990.       if T < AA[K, 1] then
  991.         J := K;
  992.       if T >= AA[K, 1] then
  993.         I := K;
  994.     until J <= (I + 1);
  995.   end;
  996.   Dx := T - AA[I, 1];
  997.   SplineEval := AA[I, 2] + Dx * (B[I] + Dx * (C[I] + Dx * D[I]));
  998. end; { SplineEval }
  999.  
  1000. begin { Spline }
  1001.   if N >= 3 then
  1002.     begin
  1003.       D[1] := AA[2, 1] - AA[1, 1];
  1004.       C[2] := (AA[2, 2] - AA[1, 2]) / D[1];
  1005.       for I := 2 to N-1 do
  1006.       begin
  1007.         D[I] := AA[I+1, 1] - AA[I, 1];
  1008.         B[I] := 2.0 * (D[I-1] + D[I]);
  1009.         C[I+1] := (AA[I+1, 2] - AA[I, 2]) / D[I];
  1010.         C[I] := C[I+1] - C[I];
  1011.       end;
  1012.       B[1] := -D[1];
  1013.       B[N] := -D[N-1];
  1014.       C[1] := 0.0;
  1015.       C[N] := 0.0;
  1016.       if N > 3 then
  1017.       begin
  1018.         C[1] := C[3] / (AA[4, 1] - AA[2, 1]) - C[2] / (AA[3, 1] - AA[1, 1]);
  1019.         C[N] := C[N-1] / (AA[N, 1] - AA[N-2, 1])
  1020.                 - C[N-2] / (AA[N-1, 1] - AA[N-3, 1]);
  1021.         C[1] := C[1] * Sqr(D[1]) / (AA[4, 1] - AA[1, 1]);
  1022.         C[N] := -C[N] * Sqr(D[N-1]) / (AA[N, 1] - AA[N-3, 1]);
  1023.       end;
  1024.       for I := 2 to N do
  1025.       begin
  1026.         T := D[I-1] / B[I-1];
  1027.         B[I] := B[I] - T * D[I-1];
  1028.         C[I] := C[I] - T * C[I-1];
  1029.       end;
  1030.       C[N] := C[N] / B[N];
  1031.       for I := N-1 downto 1 do
  1032.         C[I] := (C[I] - D[I] * C[I+1]) / B[I];
  1033.       B[N] := (AA[N, 2] - AA[N-1, 2]) / D[N-1] + D[N-1] * (C[N-1] + 2.0 * C[N]);
  1034.       for I := 1 to N-1 do
  1035.       begin
  1036.         B[I] := (AA[I+1, 2] - AA[I, 2]) / D[I] - D[I] * (C[I+1] + 2.0 * C[I]);
  1037.         D[I] := (C[I+1] - C[I]) / D[I];
  1038.         C[I] := 3.0 * C[I];
  1039.       end;
  1040.       C[N] := 3.0 * C[N];
  1041.       D[N] := D[N-1];
  1042.     end
  1043.   else
  1044.     if N = 2 then
  1045.     begin
  1046.       B[1] := (AA[2, 2] - AA[1, 2]) / (AA[2, 1] - AA[1, 1]);
  1047.       C[1] := 0.0;
  1048.       D[1] := 0.0;
  1049.       B[2] := B[1];
  1050.       C[2] := 0.0;
  1051.       D[2] := 0.0;
  1052.     end;
  1053.   if (N >= 2) and (M >= 2) then
  1054.     if (X1 >= AA[1, 1])  and (Xm <= AA[N, 1]) then
  1055.       begin
  1056.         Dx := (Xm - X1) / (M - 1);
  1057.         K := 1;
  1058.         for I := 1 to M do
  1059.         begin
  1060.           BB[I, 1] := X1 + (I - 1) * Dx;
  1061.           BB[I, 2] := SplineEval(BB[I, 1], K);
  1062.         end;
  1063.       end
  1064.     else
  1065.       Error(20, 7)
  1066.   else
  1067.     Error(20, 4);
  1068. end; { Spline }
  1069.  
  1070. procedure Bezier{(A : PlotArray; MaxContrPoints : integer;
  1071.                  var B : PlotArray; MaxIntPoints : integer)};
  1072. const
  1073.   MaxControlPoints = 25;
  1074. type
  1075.   CombiArray = array[0..MaxControlPoints] of Float;
  1076. var
  1077.   N : integer;
  1078.   ContrPoint, IntPoint : integer;
  1079.   T, SumX, SumY, Prod, DeltaT, Quot : Float;
  1080.   Combi : CombiArray;
  1081.  
  1082. begin
  1083.   MaxContrPoints := MaxContrPoints - 1;
  1084.   DeltaT := 1.0 / (MaxIntPoints - 1);
  1085.   Combi[0] := 1;
  1086.   Combi[MaxContrPoints] := 1;
  1087.   for N := 0 to MaxContrPoints - 2 do
  1088.     Combi[N + 1] := Combi[N] * (MaxContrPoints - N) / (N + 1);
  1089.   for IntPoint := 1 to MaxIntPoints do
  1090.   begin
  1091.     T := (IntPoint - 1) * DeltaT;
  1092.     if T <= 0.5 then
  1093.       begin
  1094.         Prod := 1.0 - T;
  1095.         Quot := Prod;
  1096.         for N := 1 to MaxContrPoints - 1 do
  1097.           Prod := Prod * Quot;
  1098.         Quot := T / Quot;
  1099.         SumX := A[MaxContrPoints + 1, 1];
  1100.         SumY := A[MaxContrPoints + 1, 2];
  1101.         for N := MaxContrPoints downto 1 do
  1102.         begin
  1103.           SumX := Combi[N - 1] * A[N, 1] + Quot * SumX;
  1104.           SumY := Combi[N - 1] * A[N, 2] + Quot * SumY;
  1105.         end;
  1106.       end
  1107.     else
  1108.       begin
  1109.         Prod := T;
  1110.         Quot := Prod;
  1111.         for N := 1 to MaxContrPoints - 1 do
  1112.           Prod := Prod * Quot;
  1113.         Quot := (1 - T) / Quot;
  1114.         SumX := A[1, 1];
  1115.         SumY := A[1, 2];
  1116.         for N := 1 to MaxContrPoints do
  1117.         begin
  1118.           SumX := Combi[N] * A[N + 1, 1] + Quot * SumX;
  1119.           SumY := Combi[N] * A[N + 1, 2] + Quot * SumY;
  1120.         end;
  1121.       end;
  1122.     B[IntPoint, 1] := SumX * Prod;
  1123.     B[IntPoint, 2] := SumY * Prod;
  1124.   end;
  1125. end; { Bezier }
  1126.  
  1127. end. { GShell }
  1128.