Make your own free website on Tripod.com

 with Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO;
 use  Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO;

 procedure jlgrace is
   New_File,Old_File : File_Type;
   type tabela is array(-421 .. 421,-421 .. 423) of Character;
   quadro : tabela;
   so : Character;
   XX, YY, Xmax, Ymax, Xmin, Ymin, Ultimo_Xx,Ultimo_Yy,Nxx,Nyy: Float;
   Hsize, Vsize, NumeroPontos, ContagemPontos,A,B,Indice: Integer;
   Nome_Arquivo,Nome_Saida:String(1..99);
   N,NS:Natural;
   Numero_Pontos_Intermediarios:Natural:=0;
 begin
    Hsize:=541;--Isto e' a largura do grafico.
    Vsize:=641;--Isto e' a altura do grafico.
    --ambos os valores anteriores devem ser inteiros, positivos
    --e IMPARES e o maior valor permitido eh 841.

    Put_Line("Entre o arquivo contendo a tabela, Ex: table.dat");
    Get_Line(Nome_Arquivo,N);

    Open(Old_File,in_file,Nome_Arquivo(1..N));

    Put_Line("Entre o valor minimo de X ");
    Get(Xmin);
    Put_Line("Entre o valor maximo de X ");
    Get(Xmax);
    Put_Line("Entre o valor minimo de Y ");
    Get(Ymin);
    Put_Line("Entre o valor maximo de Y ");
    Get(Ymax);
    Put_Line("Entre o numero de pontos do grafico");
    Get(NumeroPontos);
    Put_Line("Entre o numero de pontos intermediarios");
    Get(Numero_Pontos_Intermediarios);
    Put_Line("Entre o nome do arquivo de saida sem a extencao .xpm");
    Get_Line(Nome_Saida,NS); --Ainda nao sei porque preciso escrever 2 vezes!
    Get_Line(Nome_Saida,NS);
    Put_Line("Grafico salvo em " & Nome_Saida(1..Ns) & ".xpm");

    Hsize:=(Hsize-1)/2;
    Vsize:=(Vsize-1)/2;
 --Os caracteres que vem abaixo sao proprios do formato .xpm.
   for a in -Vsize-1 .. Vsize +1 loop
     quadro(a, -Hsize -1) := '"';
     quadro(a, Hsize +1) :='"';
     quadro(a, Hsize+2) :=',';
     quadro(a, Hsize+3) :=' ';
   end loop;
     quadro(Vsize+1,Hsize +2) :='}';
     quadro(Vsize+1,Hsize +3) :=';';
   for a in -Vsize-1 .. Vsize+1 loop
      for b in -Hsize .. Hsize loop
        quadro(a,b) :=' ';
      end loop;
   end loop;

   b:=-Hsize;

   a:= Integer(Float(Vsize) - Float(2*Vsize) * Ymax/(Ymax-Ymin));
   if b <= Hsize and b >= -Hsize and a <= Vsize and a >= -Vsize then
   for b in -Hsize .. Hsize loop --Isto faz a linha horizontal Y=0
       quadro(-a,b):= 'y'; --Essa inversao esta relacionada com &
   end loop;
   end if;

   b:= Integer(Float(Hsize)- Float(2*Hsize) * Xmax/(Xmax-Xmin));
   if a <= Vsize and a >= -Vsize and  b <= Hsize and b >= -Hsize  then
   for a in -Vsize .. Vsize loop --Isto faz a linha vertical X=0
       quadro(a,b):='y';
   end loop;
   end if;

   b:=-Hsize;

   Contagempontos:=0;

   while Contagempontos < numeropontos  loop
        --Isto importa os dados.

        Get(Old_File,xx);
        Get(Old_File,yy);

       --Esse 0- abaixo esta relatado com a orientacao do grafico.    &
       --E' que a saida tem um for de a de - um valor para + o que faria o grafico
       --de ponta cabeca, isso foi uma das varias maneiras possiveis de se
       --resolver esse problema. Se mudace de + para - eu teria que alterar
       --coisas no inicio do programa, como os '}', etc.

       a:=0-Integer( Float(Vsize) + (YY - Ymax )*(Float(2*Vsize)/(Ymax-Ymin)));
       b:=Integer( Float(Hsize) + (XX - Xmax )*(Float(2*Hsize))/(Xmax-Xmin));

       if -Vsize <= a and a <=Vsize and b <= Hsize and b >= -Hsize then
         quadro(a,b):='x';
       end if;

       --Aqui eu ponho alguns pontos intermediarios.
       if Contagempontos>0 and Numero_Pontos_Intermediarios /= 0 then
          for Indice in 1..Numero_Pontos_Intermediarios loop
             Nxx:=Ultimo_Xx+(Xx - Ultimo_Xx) * Float(Indice) /Float(Numero_Pontos_Intermediarios+1);
             Nyy:=Ultimo_Yy+(yy - Ultimo_yy) * Float(Indice) /Float(Numero_Pontos_Intermediarios+1);

             a:=0-Integer( Float(Vsize) + (NYY - Ymax )*(Float(2*Vsize)/(Ymax-Ymin)));
             b:=Integer( Float(Hsize) + (NXX - Xmax )*(Float(2*Hsize))/(Xmax-Xmin));

             if -Vsize <= a and a <=Vsize and b <= Hsize and b >= -Hsize then
               quadro(a,b):='x';
             end if;
          end loop;
       end if;

       Ultimo_Xx:=Xx;
       Ultimo_Yy:=Yy;

       Contagempontos:=Contagempontos+1;

   end loop;

   --A linha abaixo cria um arquivo de texto que sera o grafico.

   Create(New_file, Out_File, Nome_Saida(1..NS) & ".xpm");
   Put_Line(New_file, "/* XPM */");
   Put_Line(New_file, "static char * figura_xpm[] = {");
   Put(New_file, '"');
   Put(New_File,Hsize*2+1);
   Put(New_File,' ');
   Put(New_File,Vsize*2+1);
   Put(New_File," 3 1");-- 3 eh o numero de cores.
   Put(New_file, '"');
   Put(New_file, ',');
   Put_Line(New_file, " ");
   Put(New_file,'"');
   Put(New_file, "         c #FFFFFFFFFFFF"); --Isso eh a cor branca
   Put(New_file, '"');
   Put(New_file, ',');
   Put_Line(New_file, " ");
   Put(New_file,'"');
   Put(New_file, "y        c #FFFF00000000"); --Claro que voce pode alterar as cores
   Put(New_file, '"');
   Put(New_file, ',');
   Put_Line(New_file, " ");
   Put(New_file, '"');
   Put(New_file, "x        c #00000000FFFF");
   Put(New_file, '"');
   Put(New_file, ',');
   New_Line(New_file);

   for a in -Vsize-1 .. Vsize+1 loop
       for b in -Hsize -1 .. Hsize +3 loop
           so:=quadro(a,b);
          Put(New_file,so);
       end loop;
    Put_Line(New_file," ");
   end loop;
   Close(New_file);
   Close(Old_File);
 end jlgrace;


syntax highlighted by Code2HTML, v. 0.9