76 lines
1.9 KiB
Ada
76 lines
1.9 KiB
Ada
with
|
|
ada.Numerics.generic_elementary_Functions;
|
|
|
|
package body cached_Trigonometry
|
|
is
|
|
Sin_Cache : array (0 .. slot_Count - 1) of Float_Type;
|
|
Cos_Cache : array (0 .. slot_Count - 1) of Float_Type;
|
|
|
|
Pi_x_2 : constant := ada.Numerics.Pi * 2.0;
|
|
last_slot_Index : constant Float_Type := Float_Type (slot_Count - 1);
|
|
index_Factor : constant Float_Type := last_slot_Index / Pi_x_2;
|
|
|
|
|
|
|
|
function Cos (Angle : in Float_Type) return Float_Type
|
|
is
|
|
Index : standard.Integer := standard.Integer (Angle * index_Factor) mod slot_Count;
|
|
begin
|
|
if Index < 0 then
|
|
Index := Index + slot_Count;
|
|
end if;
|
|
|
|
return Cos_Cache (Index);
|
|
end Cos;
|
|
|
|
|
|
|
|
function Sin (Angle : in Float_Type) return Float_Type
|
|
is
|
|
Index : standard.Integer := standard.Integer (Angle * index_Factor) mod slot_Count;
|
|
begin
|
|
if Index < 0 then
|
|
Index := Index + slot_Count;
|
|
end if;
|
|
|
|
return Sin_Cache (Index);
|
|
end Sin;
|
|
|
|
|
|
|
|
procedure get (Angle : in Float_Type; the_Cos : out Float_Type;
|
|
the_Sin : out Float_Type)
|
|
is
|
|
Index : standard.Integer := standard.Integer (Angle * index_Factor) mod slot_Count;
|
|
begin
|
|
if Index < 0 then
|
|
Index := Index + slot_Count;
|
|
end if;
|
|
|
|
the_Sin := Sin_Cache (Index);
|
|
the_Cos := Cos_Cache (Index);
|
|
end get;
|
|
|
|
|
|
|
|
|
|
-- TODO: Tan, arcCos, etc
|
|
|
|
|
|
package Functions is new Ada.Numerics.generic_elementary_Functions (Float_Type);
|
|
|
|
begin
|
|
for Each in cos_Cache'Range
|
|
loop
|
|
cos_Cache (Each) := Functions.cos ( Float_Type (Each) / Float_Type (slot_Count - 1)
|
|
* Pi_x_2);
|
|
end loop;
|
|
|
|
|
|
for Each in sin_Cache'Range
|
|
loop
|
|
sin_Cache (Each) := Functions.sin ( Float_Type (Each) / Float_Type (slot_Count - 1)
|
|
* Pi_x_2);
|
|
end loop;
|
|
end cached_Trigonometry;
|