home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 03 / fasttrig / fasttrig.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-01-05  |  4.1 KB  |  106 lines

  1. (* ----------------------------------------------------------------------- *)
  2. (*                             FASTTRIG.PAS                                *)
  3. (*          Schnelle Sinus-, Cosinus- und Tangens-Funktion                 *)
  4.  
  5. FUNCTION Tan (x: REAL): REAL;
  6. BEGIN  Tan := Sin(x) / Cos(x)  END;
  7. (* ----------------------------------------------------------------------- *)
  8. PROCEDURE FastTrigInit;     (* vor Gebrauch von FASTTRIG einmal aufrufen ! *)
  9.  
  10. CONST  Pi_durch_180 = 0.01745329252;
  11.  
  12. VAR    i : REAL;  j : INTEGER;
  13.  
  14. BEGIN
  15.   i := 0.0;    j := 0;
  16.   REPEAT                 (* Initialisieren der Tangens-Tabelle bis 80 Grad *)
  17.     TanTab[j] := Tan(i * Pi_durch_180);
  18.     i := i + TrigInter;    j := Succ(j);
  19.   UNTIL i > 80.0;
  20.   i := 0.0;    j := 0;
  21.   REPEAT                                     (* Sinus- und Cosinus-Tabelle *)
  22.     SinTab[j] := Sin(i * Pi_durch_180);
  23.     CosTab[j] := Cos(i * Pi_durch_180);
  24.     i := i + TrigInter;    j := Succ(j);
  25.   UNTIL i > 90.0;
  26. END;
  27. (* ----------------------------------------------------------------------- *)
  28. (*$A-*)                         (* nur fuer Turbo Pascal, da Rekursion !!! *)
  29. (* ----------------------------------------------------------------------- *)
  30. FUNCTION FastSin (alpha: REAL): REAL;        (* Winkel alpha im Gradmass ! *)
  31.  
  32.   FUNCTION S (alpha: REAL): REAL;
  33.   VAR  a : INTEGER;
  34.   BEGIN
  35.     a := Trunc(alpha);
  36.     IF Frac(alpha) <> 0.0 THEN
  37.       S := SinTab[a] + Frac(alpha) * (SinTab[Succ(a)] - SinTab[a])
  38.     ELSE
  39.       S := SinTab[a];
  40.   END;
  41.  
  42. BEGIN  (* FastSin *)
  43.   (* alpha := alpha / TrigInter;       diese Zeile nur wenn TrigInter <> 1 *)
  44.   IF      alpha <    0.0 THEN FastSin := -FastSin(-alpha)
  45.   ELSE IF alpha <=  90.0 THEN FastSin :=  S(alpha)
  46.   ELSE IF alpha <= 180.0 THEN FastSin :=  S(180.0-alpha)
  47.   ELSE IF alpha <= 270.0 THEN FastSin := -S(alpha-180.0)
  48.   ELSE IF alpha <= 360.0 THEN FastSin := -S(360.0-alpha)
  49.   ELSE BEGIN                                           (* alpha > 360 Grad *)
  50.     alpha := Trunc(alpha) MOD 360 + Frac(alpha);
  51.     FastSin := FastSin(alpha);
  52.   END;
  53. END;
  54. (* ----------------------------------------------------------------------- *)
  55. FUNCTION FastCos (alpha: REAL): REAL;               (* alpha im Gradmass ! *)
  56.  
  57.   FUNCTION C (alpha: REAL): REAL;
  58.   VAR  a : INTEGER;
  59.   BEGIN
  60.     a := Trunc(alpha);
  61.     IF Frac(alpha) <> 0.0 THEN
  62.       C := CosTab[a] + Frac(alpha) * (CosTab[Succ(a)] - CosTab[a])
  63.     ELSE
  64.       C := CosTab[a];
  65.   END;
  66.  
  67. BEGIN  (* FastCos *)
  68.   (* alpha := alpha / TrigInter;       diese Zeile nur wenn TrigInter <> 1 *)
  69.   IF      alpha <    0.0 THEN FastCos := FastCos(-alpha)
  70.   ELSE IF alpha <=  90.0 THEN FastCos :=  C(alpha)
  71.   ELSE IF alpha <= 180.0 THEN FastCos := -C(180.0-alpha)
  72.   ELSE IF alpha <= 270.0 THEN FastCos := -C(alpha-180.0)
  73.   ELSE IF alpha <= 360.0 THEN FastCos :=  C(360.0-alpha)
  74.   ELSE BEGIN                                           (* alpha > 360 Grad *)
  75.     alpha := Trunc(alpha) MOD 360 + Frac(alpha);
  76.     FastCos := FastCos(alpha);
  77.   END;
  78. END;
  79. (* ----------------------------------------------------------------------- *)
  80. FUNCTION FastTan (alpha: REAL): REAL;               (* alpha im Gradmass ! *)
  81.  
  82.   FUNCTION T (alpha: REAL): REAL;
  83.   VAR  a : INTEGER;
  84.   BEGIN
  85.     a := Trunc(alpha);
  86.     IF Frac(alpha) <> 0.0 THEN
  87.       T := TanTab[a] + Frac(alpha) * (TanTab[Succ(a)] - TanTab[a])
  88.     ELSE
  89.       T := TanTab[a];
  90.   END;
  91.  
  92. BEGIN  (* FastTan *)
  93.   (* alpha := alpha / TrigInter;       diese Zeile nur wenn TrigInter <> 1 *)
  94.   IF      alpha <    0.0 THEN FastTan := -FastTan(-alpha)
  95.   ELSE IF alpha <=  90.0 THEN FastTan :=  T(alpha)
  96.   ELSE IF alpha <= 180.0 THEN FastTan :=  T(180.0-alpha)
  97.   ELSE IF alpha <= 270.0 THEN FastTan := -T(alpha-180.0)
  98.   ELSE IF alpha <= 360.0 THEN FastTan := -T(360.0-alpha)
  99.   ELSE BEGIN                                           (* alpha > 360 Grad *)
  100.     alpha := Trunc(alpha) MOD 360 + Frac(alpha);
  101.     FastTan := FastTan(alpha);
  102.   END;
  103. END;
  104. (* ----------------------------------------------------------------------- *)
  105. (*                             FASTTRIG.PAS                                *)
  106.