gnoga_2.1.2_5f127c56/test/plot_test.adb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
with Ada.Numerics.Elementary_Functions;

with Gnoga.Application.Singleton;
with Gnoga.Gui.Base;
with Gnoga.Gui.Element.Canvas.Context_2D.Plotting;
with Gnoga.Gui.Element.Common;
with Gnoga.Gui.View;
with Gnoga.Gui.Window;

procedure Plot_Test is
   package Math renames Ada.Numerics.Elementary_Functions;

   procedure On_Quit (Object : in out Gnoga.Gui.Base.Base_Type'Class);

   X_Limit : constant := 8.0;
   Y_Limit : constant := 2.0;

   Win  : Gnoga.Gui.Window.Window_Type;
   View : Gnoga.Gui.View.View_Type;
   Plot : Gnoga.Gui.Element.Canvas.Context_2D.Plotting.Plot_Info;
   Quit : Gnoga.Gui.Element.Common.Button_Type;
   List : Gnoga.Gui.Element.Canvas.Context_2D.Plotting.Point_List (1 .. Integer (20 * X_Limit) + 5);
   Last : Positive := List'Last;

   procedure On_Quit (Object : in out Gnoga.Gui.Base.Base_Type'Class) is
      pragma Unreferenced (Object);
   begin -- On_Quit
      View.Remove;
      Gnoga.Application.Singleton.End_Application;
   end On_Quit;
begin -- Plot_Test
--     Gnoga.Application.Open_URL;
   Gnoga.Application.Title (Name => "Plot Test");
   Gnoga.Application.HTML_On_Close (HTML => "Plot Test Finished");
   Gnoga.Application.Singleton.Initialize (Main_Window => Win);
   View.Create (Parent => Win);
   View.Text_Alignment (Value => Gnoga.Gui.Element.Center);
   Plot.Create
     (Parent => View, Width => 500, Height => 500, X_Min => -X_Limit, X_Max => X_Limit, Y_Min => -Y_Limit,
      Y_Max  => Y_Limit);
   Plot.Border;
   View.New_Line;
   Plot.Axes (Interval => 1.0, Length => 10);
   Plot.Point (Position => (X => -1.0, Y => 1.5), Color => "green");
   Plot.Point (Position => (X => 0.0, Y => 1.5), Color => "green");
   Plot.Point (Position => (X => 1.0, Y => 1.5), Color => "green");
   Plot.Line (From => (X => -X_Limit, Y => Y_Limit), To => (X => X_Limit, Y => -Y_Limit), Color => "blue");
   List (List'First) := (X => -X_Limit, Y => Math.Sin (-X_Limit) / (-X_Limit));

   All_Points :
   for I in List'First + 1 .. List'Last loop
      List (I).X := List (I - 1).X + 0.1;

      if List (I).X = 0.0 then
         List (I).Y := 1.0;
      else
         List (I).Y := Math.Sin (List (I).X) / List (I).X;
      end if;

      if List (I).X > X_Limit then
         Last := I;

         exit All_Points;
      end if;
   end loop All_Points;

   Plot.Graph (List => List (List'First .. Last), Color => "red");
   Quit.Create (Parent => View, Content => "Quit");
   Quit.On_Click_Handler (Handler => On_Quit'Unrestricted_Access);

   Gnoga.Application.Singleton.Message_Loop;
end Plot_Test;