     with ConsAKD; use ConsAKD;
     with CursAKD; use CursAKD;
     with FloaAKD; use FloaAKD;
     with MathAKD; use MathAKD;
     with TextAKD; use TextAKD;

     package body DOS_011_Plot is
     ----------------------------------------------------------------------
     ----------------------------------------------------------------------

     procedure Demo is
     ----------------------------------------------------------------------
       X_Data, Y_Data : Vector_Type ( 1..100 ) := ( others => 0.0 );
       Dum            : character;
       Data_File      : File_Type;
       Data_File_Name : string ( 1..12 ) := "PlotDemo.Dat";
     begin
       Put_Line ( Copyright );
       New_Line;
       Put_Line ( Description );
       New_Line;
       Put_Line ( "Demonstration of Plot_XY for 100 points." );
       New_Line;
       Ask ( Data_File_Name, "Data File Name:  ", Data_File_Name );
       Open ( Data_File, In_File, Data_File_Name );
       for Index in 1..100 loop
	 exit when End_Of_File ( Data_File );
	 Get ( Data_File, X_Data ( Index ) );
	 exit when End_Of_File ( Data_File );
	 Get ( Data_File, Y_Data ( Index ) );
       end loop;
       Close ( Data_File );
       Clear_Screen;
       Plot_XY ( X_Data, Y_Data, Adjust => true );
       Move ( 24, 0 );
       Pause;
     end Demo;

     procedure Plot_XY (
       X_Data : in     Vector_Type;
       Y_Data : in     Vector_Type;
       Symbol : in     character := 'o';
       Adjust : in     boolean := true;
       X_Min  : in     float   := 0.0;
       X_Max  : in     float   := 1.0;
       Y_Min  : in     float   := 0.0;
       Y_Max  : in     float   := 1.0 ) is
     ----------------------------------------------------------------------
       X_Min_New : float := X_Min;
       X_Max_New : float := X_Max;
       Y_Min_New : float := Y_Min;
       Y_Max_New : float := Y_Max;
       X_New     : natural;
       Y_New     : natural;
     begin
       if Adjust then
	 X_Min_New := Min ( X_Data );
	 X_Max_New := Max ( X_Data );
	 Y_Min_New := Min ( Y_Data );
	 Y_Max_New := Max ( Y_Data );
       end if;
       for Index in X_Data'range loop
	 Translate ( X_New, Y_New, X_Data ( Index ), Y_Data ( Index ),
	   X_Min_New, X_Max_New, Y_Min_New, Y_Max_New );
	 Move ( Y_New, X_New );
	 Put ( Symbol );
       end loop;
     end Plot_XY;

     procedure Translate (
       X_New :    out natural;
       Y_New :    out natural;
       X_Old : in     float;
       Y_Old : in     float;
       X_Min : in     float :=  0.0;
       X_Max : in     float :=  1.0;
       Y_Min : in     float :=  0.0;
       Y_Max : in     float :=  1.0 ) is
     ----------------------------------------------------------------------
     begin
       if X_Max - X_Min /= 0.0 then
	 X_New := natural ( 79.0 * ( X_Old - X_Min ) / ( X_Max - X_Min ) );
       else
	 X_New := 40;
       end if;
       if Y_Max - Y_Min /= 0.0 then
	 Y_New := 23 -
		  natural ( 23.0 * ( Y_Old - Y_Min ) / ( Y_Max - Y_Min ) );
       else
	 Y_New := 12;
       end if;
     end Translate;

     ----------------------------------------------------------------------
     ----------------------------------------------------------------------
     end DOS_011_Plot;
