Previous Up Next

Chapitre 18  Quelques compléments

18.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)

18.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;
}:;

Previous Up Next