{skladanie vlneni}

uses graph,crt;
type pole = array[1..5] of real;

var gd,gm:integer;
input_key:char;
frekvencia,faza,amplituda:pole;
n:integer;

procedure init_values;
          begin
          n:=2;
          frekvencia[1]:=15;
          faza[1]      :=0;
          amplituda[1] :=1;

          frekvencia[2]:=18;
          faza[2]      :=0;
          amplituda[2] :=1;

          end;

procedure read_values;
          var i:integer;
          begin
          repeat
          writeln('> zadajte pocet vlneni, ktore ideme skladat');
          writeln('> n=1 az 5, ak sa zvoli n=0 tak puojde DEMO');
          write('     n = ');
          readln(n);
          until (n>=0) and (n<=5);

          if n=0 then init_values
          else begin
               for i:=1 to n do begin
                             writeln('Zadajte frekvenciu (v Hz) vlnencia c. ',i:1);
                             write('     f',i:1,'= ');
                             readln(frekvencia[i]);
                                end;
               writeln('========================================');
               for i:=1 to n do begin
                             writeln('Zadajte amplitudu (napr 1) vlnencia c. ',i:1);
                             write('     A',i:1,'= ');
                             readln(amplituda[i]);
                                end;
               writeln('========================================');
               for i:=1 to n do begin
                             writeln('Zadajte fazu (v deg) vlnencia c. ',i:1);
                             write('     fi',i:1,'= ');
                             readln(faza[i]);
                                end;

               end;

          end;

function color(n:integer):word;
         var c:word;
         begin
         case n of
         1:c:=4;
         2:c:=9;
         3:c:=3;
         4:c:=14;
         5:c:=5;
         end;
         color:=c;
         end;

procedure open_graph;
          begin
          initgraph(gd,gm,'c:\bp\bgi');
          end;

procedure close_graph;
          begin
          CloseGraph;
          end;


procedure write_state;
          var f1_str,f2_str,fi1_str:string;
          r1,r2,r3:string;
          begin
          setcolor(11);
          {str(f1,f1_str);
          str(f2,f2_str);
          str(get_fi1('deg'):3:0,fi1_str);
          r1:='f_horizon.:'+f1_str;
          r2:='f_vertik.:'+f2_str;
          r3:='faza_fi_vertik.:'+fi1_str;
          outtextxy(0,0,r1);
          outtextxy(0,10,r2);
          outtextxy(0,20,r3);}
          end;

function y(n:integer; t:real):real;
         begin
         y:=amplituda[n]*sin(2*pi*frekvencia[n]*t+faza[n]*pi/180);
         end;

procedure paint;
          var i,m:integer;
          f1,f:real;
          input_key:char;
          j:integer;{jednotka dlzky}
          g1,g2:integer;
          begin
          open_graph;

          j:=30;{px}
          g1:=trunc(getmaxy/6);
          g2:=4*trunc(getmaxy/6);

          clearviewport;
          write_state;

          {
          1 - blue
          2 - dark green
          3 - green
          4 - red
          5 - viol.
          6 - brown
          7 - gray
          8 - dark gray
          9 - aqua
          10- light green
          11- light aqua
          12- light red
          13- light viol.
          14- yellow
          15- white
          }

          setcolor(7);
          line(0,g1,getmaxx,g1);
          line(0,g1-j,0,g1+j);
          setcolor(8);
          line(0,g2,getmaxx,g2);
          line(0,g2-2*j,0,g2+2*j);

          delay(2000);

          for i:= 0 to getmaxx do begin
             for m:=1 to n do begin
             setcolor(color(m));
             line((i-1),g1-round(j*y(m,(i-1)/getmaxx)),i,g1-round(j*y(m,i/getmaxx)))
             end;

          f1:=0;
          f:=0;
          for m:=1 to n do begin
          f1:=f1+y(m,(i-1)/getmaxx);
          f:=f+y(m,i/getmaxx);
          end;
          setcolor(15);
          line((i-1),g2-round(j*f1),i,g2-round(j*f));

          line(i,getmaxy-10,i,getmaxy);
          delay(round(10000*1/getmaxx));
          setcolor(0);
          line(i,getmaxy-20,i,getmaxy);

          end;{end for i}

          repeat
          until KeyPressed;
          input_key:=readkey;
          if input_key=#27 then halt;
          close_graph;
          end;

begin

repeat
writeln('> skladanie kmitov');
writeln('- skladanie rovnobeznych sinusovych kmitov -> casovy graf pre t=0s az t=1s');
writeln('- [Esc] > okoncenie programu; [ina klavesa] > znovuzadanie hodnuot');

read_values;
paint;
until false;

end.
