home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* FASTTRIG.PAS *)
- (* Schnelle Sinus-, Cosinus- und Tangens-Funktion *)
-
- FUNCTION Tan (x: REAL): REAL;
- BEGIN Tan := Sin(x) / Cos(x) END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE FastTrigInit; (* vor Gebrauch von FASTTRIG einmal aufrufen ! *)
-
- CONST Pi_durch_180 = 0.01745329252;
-
- VAR i : REAL; j : INTEGER;
-
- BEGIN
- i := 0.0; j := 0;
- REPEAT (* Initialisieren der Tangens-Tabelle bis 80 Grad *)
- TanTab[j] := Tan(i * Pi_durch_180);
- i := i + TrigInter; j := Succ(j);
- UNTIL i > 80.0;
- i := 0.0; j := 0;
- REPEAT (* Sinus- und Cosinus-Tabelle *)
- SinTab[j] := Sin(i * Pi_durch_180);
- CosTab[j] := Cos(i * Pi_durch_180);
- i := i + TrigInter; j := Succ(j);
- UNTIL i > 90.0;
- END;
- (* ----------------------------------------------------------------------- *)
- (*$A-*) (* nur fuer Turbo Pascal, da Rekursion !!! *)
- (* ----------------------------------------------------------------------- *)
- FUNCTION FastSin (alpha: REAL): REAL; (* Winkel alpha im Gradmass ! *)
-
- FUNCTION S (alpha: REAL): REAL;
- VAR a : INTEGER;
- BEGIN
- a := Trunc(alpha);
- IF Frac(alpha) <> 0.0 THEN
- S := SinTab[a] + Frac(alpha) * (SinTab[Succ(a)] - SinTab[a])
- ELSE
- S := SinTab[a];
- END;
-
- BEGIN (* FastSin *)
- (* alpha := alpha / TrigInter; diese Zeile nur wenn TrigInter <> 1 *)
- IF alpha < 0.0 THEN FastSin := -FastSin(-alpha)
- ELSE IF alpha <= 90.0 THEN FastSin := S(alpha)
- ELSE IF alpha <= 180.0 THEN FastSin := S(180.0-alpha)
- ELSE IF alpha <= 270.0 THEN FastSin := -S(alpha-180.0)
- ELSE IF alpha <= 360.0 THEN FastSin := -S(360.0-alpha)
- ELSE BEGIN (* alpha > 360 Grad *)
- alpha := Trunc(alpha) MOD 360 + Frac(alpha);
- FastSin := FastSin(alpha);
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- FUNCTION FastCos (alpha: REAL): REAL; (* alpha im Gradmass ! *)
-
- FUNCTION C (alpha: REAL): REAL;
- VAR a : INTEGER;
- BEGIN
- a := Trunc(alpha);
- IF Frac(alpha) <> 0.0 THEN
- C := CosTab[a] + Frac(alpha) * (CosTab[Succ(a)] - CosTab[a])
- ELSE
- C := CosTab[a];
- END;
-
- BEGIN (* FastCos *)
- (* alpha := alpha / TrigInter; diese Zeile nur wenn TrigInter <> 1 *)
- IF alpha < 0.0 THEN FastCos := FastCos(-alpha)
- ELSE IF alpha <= 90.0 THEN FastCos := C(alpha)
- ELSE IF alpha <= 180.0 THEN FastCos := -C(180.0-alpha)
- ELSE IF alpha <= 270.0 THEN FastCos := -C(alpha-180.0)
- ELSE IF alpha <= 360.0 THEN FastCos := C(360.0-alpha)
- ELSE BEGIN (* alpha > 360 Grad *)
- alpha := Trunc(alpha) MOD 360 + Frac(alpha);
- FastCos := FastCos(alpha);
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- FUNCTION FastTan (alpha: REAL): REAL; (* alpha im Gradmass ! *)
-
- FUNCTION T (alpha: REAL): REAL;
- VAR a : INTEGER;
- BEGIN
- a := Trunc(alpha);
- IF Frac(alpha) <> 0.0 THEN
- T := TanTab[a] + Frac(alpha) * (TanTab[Succ(a)] - TanTab[a])
- ELSE
- T := TanTab[a];
- END;
-
- BEGIN (* FastTan *)
- (* alpha := alpha / TrigInter; diese Zeile nur wenn TrigInter <> 1 *)
- IF alpha < 0.0 THEN FastTan := -FastTan(-alpha)
- ELSE IF alpha <= 90.0 THEN FastTan := T(alpha)
- ELSE IF alpha <= 180.0 THEN FastTan := T(180.0-alpha)
- ELSE IF alpha <= 270.0 THEN FastTan := -T(alpha-180.0)
- ELSE IF alpha <= 360.0 THEN FastTan := -T(360.0-alpha)
- ELSE BEGIN (* alpha > 360 Grad *)
- alpha := Trunc(alpha) MOD 360 + Frac(alpha);
- FastTan := FastTan(alpha);
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- (* FASTTRIG.PAS *)
-