# Chapitre 17 Quelques compléments

## 17.1 Pour réutiliser le graphe d’une fonction utilisateur

Lorsque `Xcas` fait le graphe `G` d’une fonction utilisateur `g`, dans la réponse, il va figurer l’expression formelle de `g(x)` et si cette fonction contient des tests, lorsque on va reutiliser `G` il y aura un message d’erreur car il ne sait pas évaluer les tests contenus dans `g(x)`. Pour ne pas avoir ce genre d’erreurs, il faut alors commencer l’écriture de la fonction `g` par un test sur le type de ses arguments qui est : si les arguments ne sont pas réels on renvoie la fonction quotée.
Exemple

    g(x):={
    si type(x)!=DOM_FLOAT alors
      retourne 'g'(x);
    fsi;
    si x<=-1 alors
      retourne -1;
    fsi;
    si -1<x  et x<1 alors
      retourne sin(pi*x/2);
    fsi;
    si 1<= x alors
    retourne 1;
    fsi;
    }:;
    f(x,y):={
    si type(x)!=DOM_FLOAT et type(y)!=DOM_FLOAT alors
      retourne 'f'(x,y)
    fsi;
    si x^2+y^2<=2 alors
      retourne 2
    fsi;
    si x^2+y^2>2 alors
      retourne x^2+y^2
    fsi;
    }
    :;

On tape par exempple :
`G:=plotfunc(g(x))` ou
`F:=plotfunc(f(x,y),[x=-4..4,y=-4..4]);` et pour voir le cercle x2+y2=2 :
`plotparam([x,sqrt(2-x```^```2),2],[x,y],affichage=1);`
`plotparam([x,-sqrt(2-x```^```2),2],[x,y],affichage=1)`

## 17.2 Les programmes de quadrillage

Voici les programmes qui permettent de paire du papier quadrillé (`papierq`), du papier triangulé (`papiert`), du papier pointé (`papierp`).

`u` est le pas en `x`,
`v` est le pas en `y`,
les lignes sont parallèles à `y=x*tan(t)` avec `0<t<pi` et à `y=cste` dans le rectangle `[x1,x2]*[y1,y2]`

    papierq(u,v,t,x1,x2,y1,y2):={
      local x3,y3,y4,L,k,q,j,j0;
      si normal(t-pi)>=0 ou normal(t)<=0  alors return "0<=t<=pi";fsi;
      si x2<x1 alors j:=x1;x1:=x2;x2:=j;fsi;
      si y2<y1 alors j:=y1;y1:=y2;y2:=j;fsi;
      L:=polygone(x1+i*y1,x1+i*y2,x2+i*y2,x2+i*y1);
      pour k de y1 jusque y2 pas v faire
        L:=L,segment(x1+i*k,x2+i*k);
      fpour;
      si normal(t-pi/2)==0 alors
        pour j de x1 jusque x2 pas u faire
          L:=L,segment(j+i*y1,j+i*y2);
        fpour;
        return L;
      fsi;
      k:=evalf((y2-y1)/tan(t));
      si normal(t-pi/2)<0 alors
        q:=floor(k/u+1e-12);
        pour j de x1-q*u jusque x1 pas u faire
          y3:=tan(t)*(x2-j)+y1;
          y4:=tan(t)*(x1-j)+y1;
          x3:=(y2-y1)/tan(t)+j;
          si y3<y2 alors L:=L,segment (x1+i*y4,x2+i*y3); fsi;
          si x3<x2 alors L:=L,segment (x1+i*y4,x3+i*y2); fsi;
        fpour;
        pour j de x1 jusque x2 pas u faire
          y3:=tan(t)*(x2-j)+y1;
          x3:=(y2-y1)/tan(t)+j;
          si y3<y2 alors L:=L,segment (j+i*y1,x2+i*y3); fsi;
          si x3<x2 alors L:=L,segment (j+i*y1,x3+i*y2); fsi;
        fpour;
        return L;
      fsi;
      si normal(t-pi/2)>0 alors
        j:=x1; tantque j<=x2 faire
          y3:=tan(t)*(x1-j)+y1;
          x3:=(y2-y1)/tan(t)+j;
          si y3<y2 alors L:=L,segment (j+i*y1,x1+i*y3); fsi;
          si x3>x1 alors L:=L,segment (j+i*y1,x3+i*y2); fsi;
          j:=j+u;
        ftantque;
        q:=ceil(k/u-1e-12);
        tantque j<=x2-q*u faire
          y3:=tan(t)*(x1-j)+y1;
          y4:=tan(t)*(x2-j)+y1;
          x3:=(y2-y1)/tan(t)+j;
          si normal(y3-y2)<0 alors L:=L,segment (x2+i*y4,x1+i*y3); fsi;
          si normal(x3-x1)>0 alors L:=L,segment (x2+i*y4,x3+i*y2); fsi;
          j:=j+u;
        ftantque;
        return L;
      fsi;
    }
    :;
    papiert(u,v,t,x1,x2,y1,y2):={
      local x3,y3,y4,L,k,q,j,u1,t1,L;
      //si normal(t-pi/2)==0 alors retourne -atan(v/u)+pi; fsi;
      u1:=v/tan(t);
      si normal(u1-u)==0 alors t1:=pi/2; fsi;
      si normal(u1-u)>0 alors t1:=atan(v/(u1-u)); fsi;
      si normal(u1-u)<0 alors t1:=atan(v/(u1-u))+pi; fsi;
      L:=papierq(u,v,t,x1,x2,y1,y2);
      L:=L,papierq(u,v,t1,x1,x2,y1,y2);
      retourne L;
    }:;
    papierp(u,v,t,x1,x2,y1,y2):={
      local j,k,L,q,q2,x3;
      si normal(t-pi)>=0 ou normal(t)<=0  alors return "0<t<pi";fsi;
      L:=NULL;
      L:=L,polygone(x1+i*y1,x2+i*y1,x2+i*y2,x1+i*y2);
      si x2<x1 alors j:=x1;x1:=x2;x2:=j;fsi;
      si y2<y1 alors j:=y1;y1:=y2;y2:=j;fsi;
      pour j de y1 jusque y2 pas v faire
        x3:=evalf((j-y1)/tan(t));
        q:=floor(x3/u+1e-12);
        pour k de x1-q*u+x3 jusque x2 pas u faire
          L:=L,point(k+i*j);
        fpour;
      fpour;
      retourne L;
    }:;