44 lines
1.2 KiB
Ada
44 lines
1.2 KiB
Ada
package body cached_Rotation
|
|
is
|
|
use ada.Numerics,
|
|
float_elementary_Functions;
|
|
|
|
|
|
the_Cache : array (0 .. slot_Count - 1) of aliased Matrix_2x2_type;
|
|
|
|
Pi_x_2 : constant := 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 to_Rotation (Angle : in Float_type) return access constant Matrix_2x2_type
|
|
is
|
|
the_Index : standard.Integer := standard.Integer (Angle * index_Factor) mod slot_Count;
|
|
begin
|
|
if the_Index < 0
|
|
then
|
|
the_index := the_Index + slot_Count;
|
|
end if;
|
|
|
|
return the_Cache (the_Index)'Access;
|
|
end to_Rotation;
|
|
|
|
|
|
|
|
begin
|
|
for Each in the_Cache'Range
|
|
loop
|
|
declare
|
|
Angle : constant Float_type := ( Float_type (Each) / Float_type (slot_Count - 1)
|
|
* Pi_x_2);
|
|
|
|
C : constant Float_type := Cos (Angle);
|
|
S : constant Float_type := Sin (Angle);
|
|
begin
|
|
the_Cache (Each) := to_Matrix_2x2 (C, -S,
|
|
S, C);
|
|
end;
|
|
end loop;
|
|
end cached_Rotation;
|