{Jozef Sivek ml. oktober 2004
program na demonstraciu pouzitia fourierovho rozvoja na aproximaciu semikonstantnych funkcii,
inu funkcia ktoru budem aproximovat na R bude cervene v pozadi}
program fourierovrad;
uses crt, graph;
const d=2*pi;{definicny obor funkcie real; T=2pi}
      l=520;{sirka grafu px}
      time=300;{cas prekreslenia}

      v=99;{viska grafu px}

      x=5; {poloha nuly v grafe}
      y=240;

      ended=1;{spusob prechodu 1time}


var gd,gm,I: integer;

procedure g_blackbox(x,y,x2,y2:integer);
     var I:integer;
     begin
     setcolor(0);
     for I:=0 to (x2-x) do begin
                line(x+I,y,x+I,y2);
                          end;
     setcolor(10);
     end;

procedure g_xy(x,y:integer);
          begin
          setcolor(1);
          line(0,y,640,y);{os x}
          line(x,0,x,480);
          end;


function sin_rad(x:real;stupen:integer):real;
         var I:integer;
             rad:real;
         begin
         rad:=0;
           for I:=1 to stupen do begin
             rad:=rad+( (1/(I*2-1)) * sin( (I*2-1)*x ) );
           end;
         sin_rad:=rad;
         end;

procedure draw_fx(stupen:integer);
          var I:integer;

          begin
          moveto(x,y);
          setcolor(6);
           for I:=1 to l do begin
            lineto(x+I, trunc(y-( ((4*v)/pi)*sin_rad(((I/l)*d),stupen)  )) );

            end;
          end;

procedure draw_general;
          var I:integer;
          begin
          setcolor(4);
          moveto(x+1,y-v);
          for I:=1 to l do begin
                           if ((I/l)*d)<=pi then lineto(I+x,y-v)
                                                 else lineto(I+x,y+v);
                           end;
          end;


begin

gd := Detect;
InitGraph(gd, gm,'c:/bp/bgi');
if GraphResult <> grOk then
  Halt(1);

I:=0;
readkey;

  repeat
   inc(I);

   g_blackbox(6,100,600,380);
   g_xy(x,y);

   draw_general;
   draw_fx(I);

   if ended=1 then delay(time)
              else readkey;

  until keypressed;

draw_fx(1);
end.
