%@AUTEUR:Guillaume Connan
prologues:=2;

input courbes;
input geo;

color vert_e, turquoise, orange, vert_fonce, rose, vert_mer, bleu_ciel, or, rouge_v,bleu_m,bleu,bleu_f;
vert_e:=(0,0.790002,0.340007);
turquoise:=(0.250999,0.878399,0.815699);
orange:=(0.589999,0.269997,0.080004);
vert_fonce:=(0,1.4*0.392193,0);
rose:=(1.0, 0.752907, 0.796106);
bleu_ciel:=(1.2*0.529405,1.2*0.807794,1);%.2*0.921598);
or:=(1,0.843104,0);
rouge_v:=(0.829997,0.099994,0.119999);
bleu_m:=(0.7*0.529405,0.7*0.807794,0.7);%*0.921598);
bleu_f:=(0.211762,0.3231176,0.3686392);
bleu:=(0.529405,0.807794,1);

%SERIE INTEGRALE

vardef axes =
  drawarrow (ux*xmin,0) -- (ux*xmax,0); % axe des x
  drawarrow ((0,uy*ymin) -- (0,uy*ymax))  ; % axe des y
  label.rt(btex $x$ etex,(xmax*ux,0)); % label de l'axe des x
  label.urt(btex $y$ etex,(0,ymax*uy)); % label de l'axe des y
enddef;


beginfig(1);
  ux:=0.5cm; uy:=ux;
  xmin:=-0.5; xmax:=8;
  ymin:=-0.5; ymax:=6;
%Axe
axes;

%Fonction, graphe 
vardef f(expr x) =7*((0.8)**x) enddef;
vardef fx(expr x) =x enddef;

vardef trace (suffix g)(expr a,b,inc) =
    save i; numeric i;
    for i=a step inc until b:
     (i*ux,f(i)*uy) ..
    endfor (b*ux,f(b)*uy)
  enddef;

%Rectangles

% une macro non parfaite pour obtenir le min de f sur un intervalle, 
% cela suppose qu'elle soit bien reguliere......
vardef minf(suffix fx,fy)(expr a,b) =
    save m,i; numeric m,i;
    m:=fy(a);
    for i=a step (b-a)/100 until b:
      if m>fy(i): m:=fy(i); fi;
    endfor;
    m
enddef;

%rectangle en dessous de la courbe colorié en bleu, utilise la macro precedente
  vardef trace_rectangles_min (suffix fx,fy)(expr a,b,inc) =
    save i; numeric i;
    for i=a step inc until b-inc:
      path p; numeric m;
      m:=minf(fx,fy,i,i+inc);
      p = (i*ux,0)--((i+inc)*ux,0)--((i+inc)*ux,m*uy)--(i*ux,m*uy)--cycle;
      fill p withcolor bleu_ciel;
      draw p;
    endfor;

enddef;

trace_rectangles_min(fx,f,1,xmax-1,0.75);  


draw trace(g,1,7.8,.1);
label.rt(btex $y=f(x)$ etex,((xmax-.2)*ux,(f(xmax-.2))*uy));
endfig;
end