home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l048 / 1.ddi / AXIS.HGH < prev    next >
Encoding:
Text File  |  1986-03-20  |  7.0 KB  |  242 lines

  1. (***********************************************************)
  2. (*                                                         *)
  3. (*                TURBO GRAPHIX version 1.06A              *)
  4. (*                                                         *)
  5. (*                   Axis drawing module                   *)
  6. (*                  Module version  1.06A                  *)
  7. (*                                                         *)
  8. (*                  Copyright (C) 1985 by                  *)
  9. (*                  BORLAND International                  *)
  10. (*                                                         *)
  11. (***********************************************************)
  12.  
  13. procedure DrawAxis(XDens, YDens, XLeft, YTop, XRight, YBottom,
  14.                    XAxis, YAxis : integer; Arrows : boolean);
  15. var
  16.   LineStyleLoc, Xk0, Yk0, Xk1, Yk1, Xk2, Yk2, NDiff, X2, Y2,
  17.   MaxExponentX, MaxExponentY, I, Ys, Xs, Delta, NPoints : integer;
  18.   Difference, Number, S, Fract : real;
  19.   X1RefLoc, X2RefLoc, Y1RefLoc, Y2RefLoc,
  20.   X1RefLoc2, X2RefLoc2, Y1RefLoc2, Y2RefLoc2 : integer;
  21.   ClippingLoc, DirectModeLoc, HeaderLoc : boolean;
  22.  
  23. function StringNumber(X1 : real; MaxExponent : integer) : WrkString;
  24. var
  25.   Y : WrkString;
  26. begin
  27.   Str(X1 * Exp(-MaxExponent * Ln(10.0)):5:2, Y);
  28.   StringNumber := Y;
  29. end; { StringNumber }
  30.  
  31. function GetExponent(X1 : real) : integer;
  32. begin
  33.   GetExponent := 0;
  34.   if X1 <> 0.0 then
  35.     if abs(X1) >= 1.0 then
  36.       GetExponent := trunc(Ln(abs(X1)) / Ln(10.0))
  37.     else
  38.       GetExponent := -trunc(abs(Ln(abs(X1))) / Ln(10.0) + 1.0);
  39. end; { GetExponent }
  40.  
  41. procedure DrawNum(X1, Y1, MaxExponent : integer; Number : real);
  42. var
  43.   I         : integer;
  44.   StrNumber : WrkString;
  45. begin
  46.   StrNumber := StringNumber(Number, MaxExponent);
  47.   Y1 := Y1 - 3;
  48.   for I := 1 to 5 do
  49.     DrawAscii(X1, Y1, 1, Ord(StrNumber[I]));
  50. end; { DrawNum }
  51.  
  52. function Balance : integer;
  53. begin
  54.   Balance := 0;
  55.   S := S + Fract;
  56.   if S >= 0 then
  57.     begin
  58.       S := S - 1.0;
  59.       Balance := 1;
  60.     end;
  61. end; { Balance }
  62.  
  63. procedure DrawExponent(X1, Y1, MaxExponent : integer);
  64. var
  65.   I         : integer;
  66.   StrNumber : WrkString;
  67. begin
  68.   Y1 := Y1 - 3;
  69.   X1 := X1 + 1;
  70.   DrawAscii(X1, Y1, 1, 49);
  71.   DrawAscii(X1, Y1, 1, 48);
  72.   Str(MaxExponent:3, StrNumber);
  73.   Y1 := Y1 - 3;
  74.   X1 := X1 - 7;
  75.   for I := 1 to 3 do
  76.     DrawAscii(X1, Y1, 1, Ord(StrNumber[I]));
  77. end; { DrawExponent }
  78.  
  79. begin { DrawAxis }
  80.   LineStyleLoc := LinestyleGlb;
  81.   SetLineStyle(0);
  82.   DirectModeLoc := DirectModeGlb;
  83.   DirectModeGlb := true;
  84.   with Window[WindowNdxGlb] do
  85.   begin
  86.     X1RefLoc := X1;
  87.     X2RefLoc := X2;
  88.     Y1RefLoc := Y1;
  89.     Y2RefLoc := Y2;
  90.     ReDefineWindow(WindowNdxGlb, X1 + XLeft, Y1 + YTop,
  91.                    X2 - XRight, Y2 - YBottom);
  92.     SelectWindow(WindowNdxGlb);
  93.   end;
  94.   if (XDens < 0) xor (YDens < 0) then
  95.   begin
  96.     HeaderLoc := HeaderGlb;
  97.     HeaderGlb := false;
  98.     DrawBorder;
  99.     HeaderGlb := HeaderLoc;
  100.   end;
  101.   XDens := abs(XDens);
  102.   YDens := abs(YDens);
  103.   if XDens > 9 then
  104.     XDens := 0;
  105.   if YDens > 9 then
  106.     YDens := 0;
  107.   Xk0 := (X1RefGlb + 4) shl 3;
  108.   Yk0 := Y2RefGlb - 14;
  109.   Yk1 := Y1RefGlb + 6;
  110.   Xk1 := Xk0;
  111.   Yk2 := Yk0;
  112.   Xk2 := (X2RefGlb - 2) shl 3 + 7;
  113.   if (XAxis >= 0) or (YAxis >= 0) then
  114.   begin
  115.     ClippingLoc := ClippingGlb;
  116.     ClippingGlb := true;
  117.     with Window[WindowNdxGlb] do
  118.     begin
  119.       X1RefLoc2 := X1;
  120.       X2RefLoc2 := X2;
  121.       Y1RefLoc2 := Y1;
  122.       Y2RefLoc2 := Y2;
  123.     end;
  124.     ReDefineWindow(WindowNdxGlb, X1RefLoc2 + 4, Y1RefLoc2 + 6,
  125.                                  X2RefLoc2 - 2, Y2RefLoc2 - 14);
  126.     SelectWindow(WindowNdxGlb);
  127.     DirectModeGlb := false;
  128.     if (XAxis >= 0) then
  129.     begin
  130.       SetLineStyle(XAxis);
  131.       DrawLine(X1WldGlb, Y1WldGlb + Y2WldGlb, X2WldGlb, Y1WldGlb + Y2WldGlb);
  132.       SetLineStyle(0);
  133.     end;
  134.     if (YAxis >= 0) then
  135.     begin
  136.       SetLinestyle(YAxis);
  137.       DrawLine(0, Y1WldGlb, 0, Y2WldGlb);
  138.       SetLineStyle(0);
  139.     end;
  140.     ClippingGlb := ClippingLoc;
  141.     DirectModeGlb := true;
  142.     ReDefineWindow(WindowNdxGlb, X1RefLoc2, Y1RefLoc2, X2RefLoc2, Y2RefLoc2);
  143.     SelectWindow(WindowNdxGlb);
  144.   end;
  145.   if YDens >= 2 then
  146.   begin
  147.     DrawLine(Xk0, Yk0, Xk1, Yk1);
  148.     if Arrows then
  149.     begin
  150.       DrawLine(Xk0, Yk1, Xk0 - 4, Yk1 + 4);
  151.       DrawLine(Xk0, Yk1, Xk0 + 4, Yk1 + 4);
  152.       DP(Xk0, Yk1 - 1);
  153.     end;
  154.   end;
  155.   if XDens >= 2 then
  156.   begin
  157.     DrawLine(Xk0, Yk0, Xk2 + 1, Yk2);
  158.     if Arrows then
  159.     begin
  160.       DrawLine(Xk2, Yk2, Xk2 - 4, Yk2 - 4);
  161.       DrawLine(Xk2, Yk2, Xk2 - 4, Yk2 + 4);
  162.     end;
  163.   end;
  164.   if (abs(Yk0 - Yk1) >= 35) and (abs(Xk2 - Xk1) >= 150) then
  165.   begin
  166.     DrawLine(Xk0, Yk0, Xk0 - 4, Yk0);
  167.     DrawLine(Xk0, Yk0, Xk0, Yk0 + 4);
  168.     Delta := Y2RefGlb - Y1RefGlb - 20;
  169.     NPoints := Delta div 7;
  170.     NDiff := Delta - (NPoints shl 3) + NPoints;
  171.     if YDens >= 4 then
  172.     begin
  173.       if abs(Y2WldGlb) > abs(Y1WldGlb) then
  174.         MaxExponentY := GetExponent(Y2WldGlb)
  175.       else
  176.         MaxExponentY := GetExponent(Y1WldGlb);
  177.       DrawNum(X1RefGlb shl 3, Yk0 + 1, MaxExponentY, Y1WldGlb);
  178.       if MaxExponentY <> 0 then
  179.         DrawExponent(X1RefGlb shl 3 + 1, Yk1 + 2, MaxExponentY);
  180.     end;
  181.     Fract := NDiff / NPoints;
  182.     S := -Fract;
  183.     Ys := Yk0;
  184.     Difference := (Y2WldGlb - Y1WldGlb) / NPoints;
  185.     for I := 1 to NPoints do
  186.     begin
  187.       Ys := Ys - 7 - Balance;
  188.       if (YDens > 2) and (Ys > Y1RefGlb + 13) then
  189.       begin
  190.         Number := Y1WldGlb + I * Difference;
  191.         DrawLine(Xk0, Ys, Xk0 - 4, Ys);
  192.         if YDens >= 4 then
  193.           if I mod (10 - YDens) = 0 then
  194.             DrawNum(X1RefGlb shl 3, Ys + 1, MaxExponentY, Number);
  195.       end;
  196.     end;
  197.     if XDens >= 4 then
  198.     begin
  199.       if abs(X2WldGlb) > abs(X1WldGlb) then
  200.         MaxExponentX := GetExponent(X2WldGlb)
  201.       else
  202.         MaxExponentX := GetExponent(X1WldGlb);
  203.       DrawNum(Xk0 - 14, Yk0 + 10, MaxExponentX, X1WldGlb);
  204.       if MaxExponentX <> 0 then
  205.         DrawExponent(Xk2 - 13, Yk0 + 10, MaxExponentX);
  206.     end;
  207.     Delta := abs(X2RefGlb - X1RefGlb) shl 3 - 41;
  208.     NPoints := Delta div 30;
  209.     NDiff := Delta - (NPoints shl 5) + (NPoints shl 1);
  210.     Fract := NDiff / NPoints;
  211.     S := -Fract;
  212.     Xs := Xk0 - 1;
  213.     Difference := (X2WldGlb - X1WldGlb) / NPoints;
  214.     for I := 1 to NPoints do
  215.     begin
  216.       Xs := Xs + 30 + Balance;
  217.       if (XDens > 2) and (Xs < X2RefGlb shl 3 + 7 - 24) then
  218.       begin
  219.         Number := X1WldGlb + I * Difference;
  220.         DrawLine(Xs, Yk0, Xs, Yk0 + 4);
  221.         if XDens >= 4 then
  222.           if I mod (10 - XDens) = 0 then
  223.             DrawNum(Xs - 14, Yk0 + 10, MaxExponentX, Number);
  224.       end;
  225.     end;
  226.   end;
  227.   ReDefineWindow(WindowNdxGlb, X1RefLoc, Y1RefLoc, X2RefLoc, Y2RefLoc);
  228.   SelectWindow(WindowNdxGlb);
  229.   DirectModeGlb := DirectModeLoc;
  230.   SetLineStyle(LineStyleLoc);
  231.   AxisGlb := true;
  232.   X1Glb := XLeft;
  233.   X2Glb := XRight;
  234.   Y1Glb := YTop;
  235.   Y2Glb := YBottom;
  236. end; { DrawAxis }
  237.  
  238. procedure ResetAxis;
  239. begin
  240.   AxisGlb := true;
  241. end; { ResetAxis }
  242.