[grid et graph_pi] 2ème épisode

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[grid et graph_pi] 2ème épisode

Messagepar maurice » Jeudi 30 Septembre 2010, 20:11

Bonsoir,
Je voulais poser une question sur graph_pi et grid.
Mais je me rends compte que la problème que j'ai chez moi ne se produit pas sur le forum ...
Voici le code :

Code: Tout sélectionner
    import graph_pi;
    size(12cm,5.5cm,IgnoreAspect);
    graphicrules(xmin=-2,xmax=2,ymin=-0.1,ymax=7);
    grid(xStep=1,yStep=1,xstep=0.25,ystep=0.25);
    cartesianaxis(Arrow(HookHead));
    labeloij();
    labelx("$O$",0,SW);


qui donne

102571fa9bde4ca9f1f64bdd8a5821ce.png

Code: Tout sélectionner
import graph_pi;
//unitsize(x=3cm,y=0.5cm);
size(12cm,5.5cm,IgnoreAspect);
graphicrules(xmin=-2,xmax=2,ymin=-0.1,ymax=7);
grid(xStep=1,yStep=1,xstep=0.25,ystep=0.25);
cartesianaxis(Arrow(HookHead));
labeloij();
labelx("$O$",0,SW);


Chez moi, il y a bien les lignes de la grilles sauf pour les unités : x=1, x=2, x=-1, y=1, y=2, ... ou il n' y a rien ...

Alors que si je remplace laligne grid( ... par

Code: Tout sélectionner
 grid(xStep=1,yStep=1,xstep=0.25,ystep=0.25,dotted,dotted);


Cela ne se produit pas ...

Si quelqu'un peut m'expliquer ce phénomène ? ...
Y'a-t-il eu une nouvelle version de graph_pi ?

Maurice

PS : je n'ai pas la permission d'attacher des pièces, je ne peux pas vous montrer ce que j'obtiens ...
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: [grid et graph_pi] 2e épisode

Messagepar chellier » Jeudi 30 Septembre 2010, 20:29

maurice a écrit:Si quelqu'un peut m'expliquer ce phénomène ? ...
Y'a-t-il eu une nouvelle version de graph_pi ?

Bonsoir,
Je n'ai pas ce problème. Tu peux essayer cette version de graph_pi

maurice a écrit:PS : je n'ai pas la permission d'attacher des pièces, je ne paux pas vous montrer ce que j'obtiens ...

Tu peux en faire la demande dans "Panneau de l'utilisateur -> Groupes d'utilisateurs".

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2e épisode

Messagepar maurice » Jeudi 30 Septembre 2010, 22:08

chellier a écrit:Bonsoir,
Je n'ai pas ce problème. Tu peux essayer cette version de graph_pi
Christophe


C'est la version que j'avais. Ca n'a donc rien changé ...

Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2e épisode

Messagepar maurice » Jeudi 30 Septembre 2010, 22:17

J'ai changé la ligne grid( ... par :
Code: Tout sélectionner
grid(xStep=1,yStep=1,xstep=0.25,ystep=0.25,nullpen,nullpen);


Je n'obtient que les axes ; ce qui n'est pas le cas sur le forum :

cf0ee1a3b5ade7800a24c88eb2e23f5d.png

Code: Tout sélectionner
import graph_pi;
//unitsize(x=3cm,y=0.5cm);
size(12cm,5.5cm,IgnoreAspect);
graphicrules(xmin=-2,xmax=2,ymin=-0.1,ymax=7);
grid(xStep=1,yStep=1,xstep=0.25,ystep=0.25,nullpen,nullpen);
cartesianaxis(Arrow(HookHead));
labeloij();
labelx("$O$",0,SW);


Avec

Code: Tout sélectionner
grid(xStep=1,yStep=1,xstep=0.25,ystep=0.25,lightgray,lightgray);

J'obtiens la grille en entier.

??????

Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar MB » Jeudi 30 Septembre 2010, 22:39

maurice a écrit:PS : je n'ai pas la permission d'attacher des pièces, je ne peux pas vous montrer ce que j'obtiens ...


C'est fait.
MB (Pas d'aide en Message Privé)
Merci d'utiliser $\LaTeX$ (voir ici) et d'éviter le style SMS pour la lisibilité des messages.
MB
Administrateur
 
Messages: 6890
Inscription: Samedi 28 Mai 2005, 13:23
Localisation: Créteil
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar maurice » Jeudi 30 Septembre 2010, 22:47

C'est en lien avec le sujet d'hier :
http://forum.mathematex.net/asymptote-f34/comment-faire-disparaitre-les-bords-t11587.html
où tu disais :

chellier a écrit:Rajoute p=nullpen dans xaxis et yaxis :

Code: Tout sélectionner
xaxis(pic, BottomTop, xmin, xmax,Ticks("%",extend=true,Step=xStep,step=xstep,pTick=pTick,ptick=ptick),above=above, p=nullpen);
yaxis(pic, LeftRight, ymin, ymax,Ticks("%",extend=true,Step=yStep,step=ystep,pTick=pTick,ptick=ptick),above=above, p=nullpen);


Si j'enlève les modifs, ca s'arrange !
J'aurais du m'en douté.
Ce que je ne comprends pas c'est que tu ais fait ces mêmes modifs et que ca passe bien chez toi !

Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2e épisode

Messagepar chellier » Vendredi 01 Octobre 2010, 09:30

maurice a écrit:
chellier a écrit:Bonsoir,
Je n'ai pas ce problème. Tu peux essayer cette version de graph_pi
Christophe


C'est la version que j'avais. Ca n'a donc rien changé ...

Maurice

:shock:
En es-tu sûr ? Ne te fies pas à la date au début du document. Cette version est mise à jour avec la modification que je t'avais proposée.

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar OG » Vendredi 01 Octobre 2010, 09:39

Bonjour

J'ai regardé et j'ai les mêmes effets que maurice !

grap_pi utilise la routine xaxis de graph
Code: Tout sélectionner
void grid(picture pic=currentpicture,
          real xmin=pic.userMin.x, real xmax=pic.userMax.x,
          real ymin=pic.userMin.y, real ymax=pic.userMax.y,
          real xStep=1, real xstep=.5,
          real yStep=1, real ystep=.5,
          pen pTick=nullpen, pen ptick=grey, bool above=false)
{
  draw(pic,box((xmin,ymin),(xmax,ymax)),invisible);
  xaxis(pic, BottomTop, xmin, xmax,
        Ticks("%",extend=true,Step=xStep,step=xstep,pTick=pTick,ptick=ptick),
        above=above, p=nullpen);
  yaxis(pic, LeftRight, ymin, ymax,
        Ticks("%",extend=true,Step=yStep,step=ystep,pTick=pTick,ptick=ptick),
        above=above, p=nullpen);
}


et voici dans la doc la commande xaxis

Code: Tout sélectionner
void xaxis(picture pic=currentpicture, Label L="", axis axis=YZero,
                real xmin=-infinity, real xmax=infinity, pen p=currentpen,
                ticks ticks=NoTicks, arrowbar arrow=None, bool above=false)

Et ici le pen p par défaut est currentpen et pas nullpen.

Je fais trois tests pour voir les mélanges de pTick dans le Ticks et l'argument
pen p de xaxis.

541177efc2305c7620ccba8b1415a1ac.png

Code: Tout sélectionner
import graph;
size(200,200,IgnoreAspect);

real f(real t) {return t;}

draw(graph(f,0,10),red);
yaxis("$y$",LeftRight,
RightTicks(begin=false,end=false,extend=true,ptick=grey),
above=true,
p=nullpen
);

xaxis(BottomTop,0,10,
Ticks("%",extend=true,Step=1,step=.5,pTick=nullpen,ptick=lightgrey),
above=false,
p=nullpen
);


et

58b57e55f6863618e876526cda77f3e2.png

Code: Tout sélectionner
import graph;
size(200,200,IgnoreAspect);

real f(real t) {return t;}

draw(graph(f,0,10),red);
yaxis("$y$",LeftRight,
RightTicks(begin=false,end=false,extend=true,ptick=grey),
above=true
);

xaxis(BottomTop,0,10,
Ticks("%",extend=true,Step=1,step=.5,pTick=nullpen,ptick=lightgrey),
above=false
);


b677630a864582837d88c8fb56a91771.png

Code: Tout sélectionner
import graph;
size(200,200,IgnoreAspect);

real f(real t) {return t;}

draw(graph(f,0,10),red);
yaxis("$y$",LeftRight,
RightTicks(begin=false,end=false,extend=true,ptick=grey),
above=true,
p=nullpen
);

xaxis(BottomTop,0,10,
Ticks("%",extend=true,Step=1,step=.5,pTick=currentpen,ptick=lightgrey),
above=false,
p=nullpen
);



Je précise. Ubuntu 64 04.10, asymptote svn du jour.

O.G.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [grid et graph_pi] 2ème épisode

Messagepar OG » Vendredi 01 Octobre 2010, 09:52

Re

Je suis allé voir graph.asy.
Si pTick=nullpen, on lui affecte la valeur de p (qui doit être par défaut currentpen). (de même ptick)
Si on a mis p=nullpen, on a au final un "vrai" nullpen: pas de tracé.

graph_pi.asy devrait être modifié en respectant p=currentpen.

O.G.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [grid et graph_pi] 2ème épisode

Messagepar chellier » Vendredi 01 Octobre 2010, 09:58

Ce qui est curieux c'est que ça fonctionne bien chez moi... Je reverrai ça ce soir, là je suis sur mon téléphone.

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar maurice » Vendredi 01 Octobre 2010, 13:45

Bonjour,

J'ai remplacer dans grid, pen pTick=nullpen par pen pTick=currentpen et ca a l'air de fonctionner.
Merci OG.

MB a écrit:
maurice a écrit:PS : je n'ai pas la permission d'attacher des pièces, je ne peux pas vous montrer ce que j'obtiens ...


C'est fait.

Merci MB.

chellier a écrit:
maurice a écrit:
chellier a écrit:Bonsoir,
Je n'ai pas ce problème. Tu peux essayer cette version de graph_pi
Christophe


C'est la version que j'avais. Ca n'a donc rien changé ...

Maurice

:shock:
En es-tu sûr ? Ne te fies pas à la date au début du document. Cette version est mise à jour avec la modification que je t'avais proposée.

Christophe


Il est possible que j'ai loupé un truc hier soir ... Du coup pour être sur, je l'ai re-téléchargé
Merci Chellier.

Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar chellier » Vendredi 01 Octobre 2010, 18:44

Bon, j'ai tout regardé... en fait je ne me souvenais plus que j'avais un graph_pi.asy tout modifié, je crois bien me souvenir que les modifications venaient de Philippe Ivaldi lui-même, mais je ne retrouve pas les messages ni le forum... Avec cette version je n'ai aucun soucis. Je la mets ici pour ceux qui veulent voir les modifications et qui voudraient la tester :

Code: Tout sélectionner
// Copyright (c) 2007, Philippe Ivaldi.
// Version: $Id: graph_pi.asy,v 0.0 "2007/01/27 10:35:52" Philippe Ivaldi Exp $
// Last modified: Fri Mar 28 15:57:10 CET 2008

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or (at
// your option) any later version.

// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
// 02110-1301, USA.

// Commentary:

// THANKS:

// BUGS:

// INSTALLATION:
//   copier ce fichier dans le sous-répertoire $HOME/.asy
//   Move this file in the sub-directory $HOME/.asy

//CODE:

import graph;
import base_pi;
import markers;
usepackage("mathrsfs");

int None=0, onX=1, onY=2, onXY=3;
// Real functions
typedef real realfunction(real);

struct graphicrules
{// used to comunicate graphicrules to cartesianaxis.
  real xmin,xmax;
  real ymin,ymax;
  bool xcrop,ycrop;
  void set(picture pic=currentpicture){
    xlimits(pic,xmin, xmax, xcrop);
    ylimits(pic,ymin, ymax, ycrop);
 }
};
graphicrules init() {return new graphicrules;}
graphicrules graphicrules = new graphicrules;
void graph_pi_exitfunction(){};

/*ANCgraphicrulesANC*/
void graphicrules(picture pic=currentpicture, real unit=1cm,
                  real xunit=unit != 0 ? unit : 0,
                  real yunit=unit != 0 ? unit : 0,
                  real xmin=-infinity, real xmax=infinity, real ymin=-infinity, real ymax=infinity,
                  bool crop=NoCrop, bool xcrop=crop, bool ycrop=crop)
{
  graphicrules.xmin=xmin;
  graphicrules.xmax=xmax;
  graphicrules.ymin=ymin;
  graphicrules.xmax=xmax;
  graphicrules.ymax=ymax;
  graphicrules.xcrop=xcrop;
  graphicrules.ycrop=ycrop;
  pic.unitsize(x=xunit,y=yunit);
  // xlimits(pic,xmin, xmax, xcrop);
  // ylimits(pic,ymin, ymax, ycrop);
  graphicrules.set(pic);
  graph_pi_exitfunction = new void() {
    graphicrules.set(pic);
    // xlimits(pic,xmin, xmax, xcrop);
    // ylimits(pic,ymin, ymax, ycrop);
  };

}

ticklabel NoZero(string s=defaultformat) {
  return new string(real x) {
    if (x!=0) return format(s,x);
    else return "";
  };
}


ticklabel labelfrac(real ep=1/10^5, real factor=1,
                    string symbol="",
                    bool signin=false, bool symbolin=true,
                    bool displaystyle=false,
                    bool zero=true)
{
  return new string(real x)
    {
      return texfrac(rational(x/factor), symbol, signin, symbolin, displaystyle, zero);
    };
}

ticklabel labelfrac=labelfrac();

// *=======================================================*
// *....................Graph paper....................*
// *=======================================================*
/*ANCmillimeterpaperANC*/
picture millimeterpaper(picture pic=currentpicture, pair O=(0,0),
                        real xmin=infinity, real xmax=infinity,
                        real ymin=infinity, real ymax=infinity,
                        pen p=.5bp+orange)
{
  picture opic;
  real
    cofx=pic.xunitsize/cm,
    cofy=pic.yunitsize/cm;
  real
    xmin= (xmin <= infinity) ? pic.userMin.x*cofx : xmin*cofx,
    xmax= (xmax <= infinity) ? pic.userMax.x*cofx : xmax*cofx,
    ymin= (ymin <= infinity) ? pic.userMin.y*cofy : ymin*cofy,
    ymax= (ymax <= infinity) ? pic.userMax.y*cofy : ymax*cofy;
  path
    ph=(xmin*cm,0)--(xmax*cm,0),
    pv=(0,ymin*cm)--(0,ymax*cm);
  real [] step={5, 1, .5, .1};
  pen [] p_={ p, scale(.7)*p, scale(.4)*p, scale(.2)*p};

  for (int j=0; j<4; ++j)
    {
      for (real i=O.y; i<= ymax; i+=step[j])
        draw(opic, shift(0,i*cm)*ph, p_[j]);
      for (real i=O.y; i>=ymin ; i-=step[j])
        draw(opic, shift(0,i*cm)*ph, p_[j]);
      for (real i=O.x; i<=xmax; i+=step[j])
        draw(opic, shift(i*cm,0)*pv, p_[j]);
      for (real i=O.x; i>=xmin; i-=step[j])
        draw(opic, shift(i*cm,0)*pv, p_[j]);
    }

  return opic;
}

// *=======================================================*
// *.....................Axis and grid.....................*
// *=======================================================*
/*ANCgridANC*/
void grid(picture pic=currentpicture,
          real xmin=pic.userMin.x, real xmax=pic.userMax.x,
          real ymin=pic.userMin.y, real ymax=pic.userMax.y,
          real xStep=1, real xstep=.5,
          real yStep=1, real ystep=.5,
          pen pTick=currentpen, pen ptick=grey, bool above=false)
{
  draw(pic,box((xmin,ymin),(xmax,ymax)),invisible);
  xaxis(pic, BottomTop, xmin, xmax,
        Ticks("%",extend=true,Step=xStep,step=xstep,pTick=pTick,ptick=ptick),
        above=above, p=nullpen);
  yaxis(pic, LeftRight, ymin, ymax,
        Ticks("%",extend=true,Step=yStep,step=ystep,pTick=pTick,ptick=ptick),
        above=above, p=nullpen);
}

/*ANCcartesianaxisANC*/
void cartesianaxis(picture pic=currentpicture,
                   Label Lx=Label("$x$",align=2S),
                   Label Ly=Label("$y$",align=2W),
                   real xmin=-infinity, real xmax=infinity,
                   real ymin=-infinity, real ymax=infinity,
                   real extrawidth=1, real extraheight=extrawidth,
                   pen p=currentpen,
                   ticks xticks=Ticks("%",pTick=nullpen, ptick=grey),
                   ticks yticks=Ticks("%",pTick=nullpen, ptick=grey),
                   bool viewxaxis=true,
                   bool viewyaxis=true,
                   bool above=true,
                   arrowbar arrow=Arrow)
{
  graphicrules.set(pic);
  xmin=(xmin == -infinity) ? pic.userMin.x : xmin;
  xmax=(xmax == infinity) ? pic.userMax.x : xmax;
  ymin=(ymin == -infinity) ? pic.userMin.y : ymin;
  ymax=(ymax == infinity) ? pic.userMax.y : ymax;
  extraheight= pic.yunitsize != 0 ? cm*extraheight/(2*pic.yunitsize) : 0;
  extrawidth = pic.xunitsize != 0 ? cm*extrawidth/(2*pic.xunitsize) : 0;
  if (viewxaxis)
    {
        yequals(pic, Lx, 0, xmin-extrawidth, xmax+extrawidth, p, above, arrow=arrow);
        yequals(pic, 0, xmin, xmax, p, xticks, above);
    }
  if (viewyaxis)
    {
      xequals(pic, Ly, 0, ymin-extraheight, ymax+extraheight, p, above, arrow=arrow);
      xequals(pic, 0, ymin, ymax, p, yticks, above);
    }
}

real labelijmargin=1;

/*ANClabeloijANC*/
void labeloij(picture pic=currentpicture,
              Label Lo=Label("$O$",NoFill),
              Label Li=Label("$\overrightarrow{\imath}$",NoFill),
              Label Lj=Label("$\overrightarrow{\jmath}$",NoFill),
              pen p=scale(2)*currentpen,
              pair diro=SW, pair diri=labelijmargin*S, pair dirj=labelijmargin*1.5*W,
              filltype filltype=NoFill, arrowbar arrow=Arrow(2mm),
              marker marker=dot)
{
  if (Lo.filltype==NoFill) Lo.filltype=filltype;
  if (Li.filltype==NoFill) Li.filltype=filltype;
  if (Lj.filltype==NoFill) Lj.filltype=filltype;
  labelx(pic, Lo, 0, diro, p);
  draw(pic, Li, (0,0)--(1,0), diri, p, arrow);
  draw(pic, Lj, (0,0)--(0,1), dirj, p, arrow);
  if(marker != nomarker) draw(pic, (0,0), p, marker);
}

real labelIJmargin=1;

/*ANClabeloIJANC*/
void labeloIJ(picture pic=currentpicture,
              Label Lo=Label("$O$",NoFill),
              Label LI=Label("$I$",NoFill),
              Label LJ=Label("$J$",NoFill),
              pair diro=SW, pair dirI=labelIJmargin*S, pair dirJ=labelIJmargin*W,
              pen p=currentpen,
              filltype filltype=NoFill,
              marker marker=dot)
{
  if (Lo.filltype==NoFill) Lo.filltype=filltype;
  if (LI.filltype==NoFill) LI.filltype=filltype;
  if (LJ.filltype==NoFill) LJ.filltype=filltype;
  labelx(pic, LI, 1, dirI, p);
  labely(pic, LJ, 1, dirJ, p);
  labelx(pic, Lo, 0, diro, p);
  if(marker != nomarker) draw(pic, (0,0), p, marker);
}

// *=======================================================*
// *....................Recursivegraph.....................*
// *=======================================================*
typedef void recursiveroutime(picture, real F(real), real, int, int,
                              Label, align, pen, arrowbar, arrowbar,
                              margin, Label, marker);

/*ANCrecursiveoptionANC*/
recursiveroutime recursiveoption(Label L="u",
                                 bool labelbegin=true,
                                 bool labelend=true,
                                 bool labelinner=true,
                                 bool labelalternate=false,
                                 string format="",
                                 int labelplace=onX,
                                 pen px=nullpen,
                                 pen py=nullpen,
                                 bool startonyaxis=false,
                                 arrowbar circuitarrow=None,
                                 marker automarker=marker(cross(4)),
                                 marker xaxismarker=nomarker,
                                 marker yaxismarker=nomarker,
                                 marker xmarker=nomarker,
                                 marker fmarker=nomarker)
{
  return new void(picture pic, real F(real), real u0, int n0, int n,
                  Label L_, align align,
                  pen p, arrowbar arrow, arrowbar bar,
                  margin margin, Label legend, marker marker_)
    {
      real [] u;
      u[n0]=u0;
      for(int i=n0+1;i<n;++i) u[i]=F(u[i-1]);
      guide g= (labelplace==2 || labelplace==3 || startonyaxis) ? nullpath : (u[n0],0);
      bool addlabelautomark;
      for(int i=n0; i < n-1; ++i) {
        g=g--(u[i],u[i+1])--(u[i+1],u[i+1]);
      }
      g = ((labelplace==2 || labelplace==3 || startonyaxis) && u0<0) ? (0,u0)--(u0,u0)--(u0,0)--g : g;
      draw(pic, L_,g, align, p, arrow, bar, margin, legend, marker_);
      if (circuitarrow!=None)
        {
          if (labelplace==2 || labelplace==3 || startonyaxis)
            {
              draw(pic, (0,u[n0])--(u[n0],u[n0]), p, circuitarrow);
              draw(pic, (u[n0],u[n0])--(u[n0],u[n0+1]), p, circuitarrow);
            }
          else
            {
              draw(pic, (u[n0],0)--(u[n0],u[n0+1]), p, circuitarrow);
            }
          draw(pic, (u[n0],u[n0+1])--(u[n0+1],u[n0+1]), p, circuitarrow);
          for(int i=n0+1; i < n-1; ++i) {
            draw(pic, (u[i],u[i])--(u[i],u[i+1]), p, circuitarrow);
            draw(pic, (u[i],u[i+1])--(u[i+1],u[i+1]), p, circuitarrow);
          }
        }
      if (px==nullpen)
        if (labelplace==onX || labelplace==onXY) px=dotted; else px=invisible;
      if (py==nullpen)
        if (labelplace==onY || labelplace==onXY) py=dotted; else py=invisible;
      Label L=L.copy();

      bool Le=(L.s=="");
      bool fe= (format=="");
      bool Lno=(L.s=="%");
      string Ls=L.s;
      for (int i=n0; i<n; ++i)
        {
          addlabelautomark=((i==n0 && labelbegin) || (i!=n0 && labelinner) || (i==n-1 && labelend));
          if (i>n0)
            {
              if (px!=invisible)
                {
                  draw(pic,(u[i],u[i])--(u[i],0),px);
                  if (addlabelautomark) add(pic,automarker.f, (u[i],u[i]));
                }
            }
          if (i>n0)
            {
              if (py!=invisible)
                {
                  if (addlabelautomark) add(pic,automarker.f, (u[i-1],u[i]));
                  draw(pic,(u[i-1],u[i])--(0,u[i]),py);
                }
            }
          if (Le)
            L.s=format(format == "" ? defaultformat : format,u[i]);
          else if (Lno) L.s=""; else
            if (fe) L.s="$" + Ls + "_{" + (string) i + "}$"; else
              L.s="$" + Ls + "_{" + (string) i + "}" + format(format,u[i]) + "$";
          if (labelplace==1 || labelplace==3)
            {//Label on xaxis
              L.position((u[i],0));
              L.align(L.align,S);
              if (labelalternate && i!=n0) {L.align(-L.align.dir);}
              L.s=baseline(L.s,"$p_{1234567890}$");
              if (addlabelautomark) label(pic,L);
              if (xaxismarker==nomarker && addlabelautomark) add(pic,automarker.f, (u[i],0));
            }
          if (labelplace==2 || labelplace==3)
            {//Label on yaxis
              L.position((0,u[i]));
              L.align(L.align,W);
              if (labelalternate && i!=n0) {L.align(-L.align.dir);}
              L.s=baseline(L.s,"$w_{1234567890}$");
              if (addlabelautomark) label(pic,L);
              if (yaxismarker==nomarker && addlabelautomark) add(pic,automarker.f, (0,u[i]));
            }
          add(pic,xaxismarker.f, (u[i],0));
          if (i>n0 || startonyaxis) add(pic,yaxismarker.f, (0,u[i]));
          if (i>n0 || startonyaxis) add(pic,xmarker.f, (u[i],u[i]));
          if (i>n0) add(pic,fmarker.f, (u[i-1],u[i]));
        }
    };
}

recursiveroutime DefaultRecursiveOption=recursiveoption();

struct recursivegraph
{
  real f(real);
  real u0;
  int n0;
  int n;
  recursiveroutime recursiveroutime=DefaultRecursiveOption;
  void draw(picture pic=currentpicture,
            Label L, align align,
            pen p, arrowbar arrow, arrowbar bar,
            margin margin, Label legend, marker marker)
  {recursiveroutime(pic, f, u0, n0, n,
                    L, align,
                    p, arrow, bar,
                    margin, legend, marker);};
};
recursivegraph operator init() {return new recursivegraph;}

recursivegraph recursivegraph(real F(real), real u0, int n0=0, int n)
{
  recursivegraph orec= new recursivegraph;
  orec.f=F;
  orec.u0=u0;
  orec.n0=n0;
  orec.n=n;
  return orec;
}


void draw(picture pic=currentpicture, Label L="", recursivegraph g, recursiveroutime lr=DefaultRecursiveOption,align align=NoAlign,
          pen p=currentpen, arrowbar arrow=None, arrowbar bar=None,
          margin margin=NoMargin, Label legend="", marker marker=nomarker)
{
  g.recursiveroutime=lr;
  g.draw(pic, L, align, p, arrow, bar, margin, legend, marker);
}

guide graph(picture pic=currentpicture, real f(real),
            int n=ngraph, interpolate join=operator --)
{
  return graph(pic, f, a=pic.userMin.x, b=pic.userMax.x, n, join);
}


/*ANCgraphpoint(...)ANC*/
void graphpoint(picture pic=currentpicture,
                Label L="",
                real f(real), real xCoordinate,
                real xmin=0, real ymin=0,
                int draw=onXY,
                pen px=nullpen, pen py=px,
                arrowbar arrow=None, arrowbar bar=None,
                margin marginy=NoMargin, margin marginx=NoMargin,
                bool extend=false, bool extendx=extend, bool extendy=extend,
                Label legendx="", Label legendy="",
                marker markerx=nomarker, marker markery=nomarker)
{/*DOC Mark a point on a curve defined by real f(real). DOC*/
  /*EXAgraphpoint(...)EXA*/
  real xmax,ymax;
  if (extendy) {
    xmin=pic.userMin.x;
    xmax=pic.userMax.x;
  } else xmax=xCoordinate;
  if (extendx) {
    ymin=pic.userMin.y;
    ymax=pic.userMax.y;
  } else ymax=f(xCoordinate);
  px = (px==nullpen) ? currentpen+linetype("6 6") : px;
  py = (py==nullpen) ? currentpen+linetype("6 6") : py;
  L.align(L.align,NE);
  label(pic, L, (xCoordinate,f(xCoordinate)));
  if (draw==onX || draw==onXY)
    draw(pic, (xCoordinate,ymin)--(xCoordinate,ymax),
         p=px, arrow=arrow, bar=bar, margin=marginx, legend=legendx, marker=markerx);
  if (draw==onY || draw==onXY)
    draw(pic, (xmin,ymax)--(xmax,ymax),
         p=py, arrow=arrow, bar=bar, margin=marginy, legend=legendy, marker=markery);
}

// *=======================================================*
// *.....................About tangent.....................*
// *=======================================================*
/*ANCtangentANC*/
path tangent(path g, real x, path b=box(userMin(currentpicture),userMax(currentpicture)))
{//Return the tangent with the maximun size allowed by b (cyclic path)
  if (!cyclic(b)) abort("tangent: path b is not a cyclic path...");
  pair pt=point(g,intersectsv(g,x)[0]);
  real t=intersectp(g,pt);
  real rt=intersectp(reverse(g),pt);
  pair dirr=dir(g,t);
  pair dll=intersectionpointsd(b,pt,shift(pt)*dirr)[0];
  pair dlr=intersectionpointsd(b,pt,shift(pt)*(-dirr))[0];
  return dll--dlr;
}

/*ANCaddtangentANC*/
void addtangent(picture pic=currentpicture,
                path g,
                pair pt,//Point on the path g
                real size=infinity,//ABSOLUTE size of the tangent line (infinity=maximun size according the size of the pic)
                bool drawright=true,//Draw the tangent at the right
                bool drawleft=true,//... left
                pair v=(infinity,infinity),//A finite value forces the value of the derivative
                pair vr=v,//A finite value forces the value of the derivative at right
                pair vl=v,//A finite value forces the value of the derivative at left
                arrowbar arrow=null,//null=automatic determination
                margin margin=NoMargin,//Useful with size=infinity
                Label legend="",
                pen p=currentpen,
                real dt=2,//Increase this number can help to discern tangent at the right and tgt at the left.
                bool differentiable=true)//Set it "true" maybe useful if you are sure that "g is differentiable" at this point.
{
  arrowbar arrow_=arrow;
  pair dir_r,dir_l;
  if (intersect(g,pt).length<2) abort("addtangent: the point is not on the path.");
  real t=intersectp(g,pt);
  if (!differentiable) {
    path subpa,subpb;
    subpa=subpath(g,0,t-dt/2);
    subpb=subpath(g,t+dt/2,length(g));
    dir_l=(vl.x<infinity || vl.y<infinity) ? dir((0,0)--vl,.5) : dir(subpa,length(subpa));
    dir_r=(vr.x<infinity || vr.y<infinity) ? dir((0,0)--vr,.5) : dir(subpb,0);
  } else {
    if (v.x<infinity || v.y<infinity) dir_r=dir((0,0)--v,.5);
    else if (vr.x<infinity || vr.y<infinity) dir_r=dir((0,0)--vr,.5);
    else if (vl.x<infinity || vl.y<infinity) dir_r=dir((0,0)--vl,.5);
    else dir_r=dir(g,t);
    dir_l=dir_r;
  }
  pair dr_a,dl_a;
  pair dr_b,dl_b;
  dl_a=shift(pt)*(-dir_l);
  dl_b=shift(pt)*dir_l;
  dr_a=shift(pt)*dir_r;
  dr_b=shift(pt)*(-dir_r);
  if (size==infinity) {
    draw(pic,g,invisible);
    dl_a=intersectionpointsd(box(userMin(currentpicture),userMax(currentpicture)),pt,dl_a)[0];
    dl_b=intersectionpointsd(box(userMin(currentpicture),userMax(currentpicture)),pt,dl_b)[0];
    dr_a=intersectionpointsd(box(userMin(currentpicture),userMax(currentpicture)),pt,dr_a)[0];
    dr_b=intersectionpointsd(box(userMin(currentpicture),userMax(currentpicture)),pt,dr_b)[0];
    if (arrow_==null) arrow_=None;
    if (drawright && drawleft) {
      draw(dl_a--dl_b,p=p,arrow=arrow_,margin=margin, legend=legend);
      if (!differentiable) draw(dr_a--dr_b,p=p,arrow=arrow_);
    } else if (drawright) draw(pt--dr_a,p=p,arrow=arrow_,margin=margin, legend=legend);
    else if (drawleft) draw(pt--dl_a,p=p,arrow=arrow_,margin=margin, legend=legend);
  } else {//Fixed size
    dl_a=shift((0,0))*(-size*unit(pic.calculateTransform()*dir_l));
    dl_b=shift((0,0))*(size*unit(pic.calculateTransform()*dir_l));
    dr_a=shift((0,0))*(size*unit(pic.calculateTransform()*dir_r));
    dr_b=shift((0,0))*(-size*unit(pic.calculateTransform()*dir_r));
    picture pict;
    if (drawright && drawleft) {
      if (differentiable) {
        if (arrow_==null) arrow_=Arrows;
        draw(pict,dl_a--dl_b,p,arrow=arrow_,margin=margin, legend=legend);
      } else {
        if (arrow_==null) arrow_=Arrow;
        draw(pict,(0,0)--dl_a,p,arrow=arrow_,margin=margin, legend=legend);
        draw(pict,(0,0)--dr_a,p,arrow=arrow_,margin=margin, legend=legend);
      }
    } else {
      if (arrow_==null) arrow_=Arrow;
      if (drawleft) draw(pict,(0,0)--dl_a,p,arrow=arrow_,margin=margin, legend=legend);
      else if (drawright) draw(pict,(0,0)--dr_a,p,arrow=arrow_,margin=margin, legend=legend);
    }
    add(pic,pict,pt);
  }
}

void addtangent(picture pic=currentpicture,
                path g,
                real x,//x-Coodinate
                real size=infinity,//ABSOLUTE size of the tangent line (infinity=maximun size according the size of the pic)
                bool drawright=true,//Draw the tangent at the right
                bool drawleft=true,//... left
                pair v=(infinity,infinity),//A finite (x OR y) value forces the value of the derivative
                pair vr=v,//A finite value forces the value of the derivative at right
                pair vl=v,//A finite value forces the value of the derivative at left
                arrowbar arrow=null,//null=automatic determination
                margin margin=NoMargin,//Useful with size=infinity
                Label legend="",
                pen p=currentpen,
                real dt=2,//Increase this number can help to discern tangent at the right and tgt at the left.
                bool differentiable=true)//Set it "true" maybe useful if you are sure that "g is differentiable" at this point.
{
  addtangent(pic,g,point(g,intersectsv(g,x)[0]),size,drawright,drawleft,v,vr,vl,arrow,margin,legend,p,dt,differentiable);
}


// *=======================================================*
// *.....................Special marks.....................*
// *=======================================================*
// On picture pic, add to path g the frame f rotated by the direction of path g
// at the begin or the end of the path g.
markroutine dirmarkextremroutine(bool begin=true, bool end=true) {
  return new void(picture pic=currentpicture, frame f, path g) {
    if(!begin && !end) return;
    else {
      real [] pos;
      if (begin){
        add(pic, rotate(degrees(pic.calculateTransform()*dir(g,arctime(g,0))))*f, point(g,0));
      }
      if (end) {
        add(pic, rotate(180+degrees(pic.calculateTransform()*dir(g,length(g))))*f, relpoint(g,1));
      }
    }
  };
}

// A new marker constructor which uses the markroutine dirmarkendroutine.
marker markerextrem(frame f,bool begin=true, bool end=true,bool above=true)
{
  return marker(f=f,markroutine=dirmarkextremroutine(begin=begin,end=end),above=above);
}

real graphmarksize=sqrt(2)*dotsize(currentpen);
real graphmarksize(){return graphmarksize;}
// *=======================================================*
// *................How define a new marker................*
// *=======================================================*
// 1. Definition of a mark as frame.
frame arcpicture(real radius=graphmarksize(), real angle=90, pen p=currentpen)
{
  frame ofr;
  draw(ofr, shift((-radius,0))*arc((0,0),radius,-angle/2,angle/2),p);
  return ofr;
}

// 2. Definition of the marker itself
marker ArcMarkerExtrem(real radius=graphmarksize(), real angle=180,
                       bool begin=true, bool end=true,
                       pen p=currentpen, bool above=true)
{
  return markerextrem(f=arcpicture(radius=radius,angle=angle,p=p),
                      begin=begin,end=end,above=above);
}

// 3. Definition of an alias to use default values.
marker ArcMarkerExtrem=ArcMarkerExtrem();
//End of section 'How define a new marker'


// HookMarkerExtrem
frame hookpicture(real height=graphmarksize(), real width=height/sqrt(2), real angle=90, pen p=currentpen)
{
  // if (!(width<infinity)) width=graphmarksize()/2;
  frame ofr;
  draw(ofr, (0,height)--(0,-height),p);
  draw(ofr, (0,height)--(-width,height),p);
  draw(ofr, (0,-height)--(-width,-height),p);
  return ofr;
}

marker HookMarkerExtrem(real height=graphmarksize(), real width=height/2,
                        bool begin=true, bool end=true,
                        pen p=currentpen, bool above=true)
{
  return markerextrem(f=hookpicture(height=height,width=width,p=p),
                      begin=begin,end=end,above=above);
}

marker HookMarkerExtrem=HookMarkerExtrem();
//// End HookMarkerExtrem

//CircleMarkerExtrem
frame circlepicture(real radius=graphmarksize(), filltype filltype=NoFill, pen p=currentpen)
{
  frame ofr;
  filltype filltype_=filltype;
  path cle=shift((-radius,0))*scale(radius)*unitcircle;
  filltype.fill(ofr,cle,p);
  if (filltype_==NoFill) draw(ofr, cle,p);
  return ofr;
}

marker CircleMarkerExtrem(real radius=graphmarksize(), real angle=90,
                          bool begin=true, bool end=true,
                          pen p=currentpen, filltype filltype=NoFill,
                          bool above=true)
{
  return markerextrem(f=circlepicture(radius=radius,p=p,filltype=filltype),
                      begin=begin,end=end,above=above);
}

marker CircleMarkerExtrem=CircleMarkerExtrem();
// End CircleMarkerExtrem


exitfcn currentexitfunction=atexit();

atexit(new void() {
    graph_pi_exitfunction();
    if(currentexitfunction != null) currentexitfunction();
  });


Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar maurice » Vendredi 01 Octobre 2010, 20:01

Bonsoir,

chellier a écrit:Bon, j'ai tout regardé... en fait je ne me souvenais plus que j'avais un graph_pi.asy tout modifié, je crois bien me souvenir que les modifications venaient de Philippe Ivaldi lui-même, mais je ne retrouve pas les messages ni le forum... Avec cette version je n'ai aucun soucis. Je la mets ici pour ceux qui veulent voir les modifications et qui voudraient la tester
Christophe


Les modifications concernent seulement grid ou y-a-t-il d'autres changements ?

Maurice
Asymptote :
----> Démarrage rapide : http://cgmaths.fr/Atelier/Asymptote/Asymptote.html
----> Documentation 3D : http://www.mathco.tuxfamily.org et si ça ne marche pas, essayez la version pdf
maurice
Méga-utilisateur
 
Messages: 399
Inscription: Jeudi 25 Mars 2010, 13:49
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar chellier » Vendredi 01 Octobre 2010, 20:19

maurice a écrit:Les modifications concernent seulement grid ou y-a-t-il d'autres changements ?
Maurice


Il y a l'apparition d'une fonction :
Code: Tout sélectionner
void graph_pi_exitfunction(){};

utilisée dans graphicrules.

On trouve aussi :
Code: Tout sélectionner
exitfcn currentexitfunction=atexit();

atexit(new void() {
    graph_pi_exitfunction();
    if(currentexitfunction != null) currentexitfunction();

À la fin du fichier, et peut-être d'autres choses, je n'ai pas encore tout regardé en détail.

Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant

Re: [grid et graph_pi] 2ème épisode

Messagepar OG » Vendredi 01 Octobre 2010, 20:46

Fais un diff.
En tout cas grid est modifié, pTick=currentpen maintenant.

O.G.
OG
Modérateur
 
Messages: 2276
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [grid et graph_pi] 2ème épisode

Messagepar chellier » Vendredi 01 Octobre 2010, 20:58

OG a écrit:En tout cas grid est modifié, pTick=currentpen maintenant.
O.G.

Exact, ça m'avait échappé :oops:

Le diff :
Code: Tout sélectionner
27c27
< //   copier ce fichier dans le sous-r�pertoire $HOME/.asy
---
> //   copier ce fichier dans le sous-répertoire $HOME/.asy
53d52
< void graph_pi_exitfunction(){};
68a68,69
>   xlimits(pic,xmin, xmax, xcrop);
>   ylimits(pic,ymin, ymax, ycrop);
70,78d70
<   // xlimits(pic,xmin, xmax, xcrop);
<   // ylimits(pic,ymin, ymax, ycrop);
<   graphicrules.set(pic);
<   graph_pi_exitfunction = new void() {
<     graphicrules.set(pic);
<     // xlimits(pic,xmin, xmax, xcrop);
<     // ylimits(pic,ymin, ymax, ycrop);
<   };
<
126c118
<
---
>   
138c130
<
---
>   
151c143
<           pen pTick=currentpen, pen ptick=grey, bool above=false)
---
>           pen pTick=nullpen, pen ptick=grey, bool above=false)
154,159c146,147
<   xaxis(pic, BottomTop, xmin, xmax,
<         Ticks("%",extend=true,Step=xStep,step=xstep,pTick=pTick,ptick=ptick),
<         above=above, p=nullpen);
<   yaxis(pic, LeftRight, ymin, ymax,
<         Ticks("%",extend=true,Step=yStep,step=ystep,pTick=pTick,ptick=ptick),
<         above=above, p=nullpen);
---
>   xaxis(pic, BottomTop, xmin, xmax, Ticks("%",extend=true,Step=xStep,step=xstep,pTick=pTick,ptick=ptick), above=above, p=nullpen);
>   yaxis(pic, LeftRight, ymin, ymax, Ticks("%",extend=true,Step=yStep,step=ystep,pTick=pTick,ptick=ptick), above=above, p=nullpen);
289c277
<           draw(pic, (u[n0],u[n0+1])--(u[n0+1],u[n0+1]), p, circuitarrow);
---
>           draw(pic, (u[n0],u[n0+1])--(u[n0+1],u[n0+1]), p, circuitarrow);         
293c281
<           }
---
>           }         
300c288
<
---
>       
447c435
<   pair dll=intersectionpointsd(b,pt,shift(pt)*dirr)[0];
---
>   pair dll=intersectionpointsd(b,pt,shift(pt)*dirr)[0];   
449c437
<   return dll--dlr;
---
>   return dll--dlr;
494c482
<     dl_a=intersectionpointsd(box(userMin(currentpicture),userMax(currentpicture)),pt,dl_a)[0];
---
>     dl_a=intersectionpointsd(box(userMin(currentpicture),userMax(currentpicture)),pt,dl_a)[0];   
500c488
<       draw(dl_a--dl_b,p=p,arrow=arrow_,margin=margin, legend=legend);
---
>       draw(dl_a--dl_b,p=p,arrow=arrow_,margin=margin, legend=legend);
646,653d633
<
< exitfcn currentexitfunction=atexit();
<
< atexit(new void() {
<     graph_pi_exitfunction();
<     if(currentexitfunction != null) currentexitfunction();
<   });
<


Christophe
chellier
Modérateur
 
Messages: 355
Inscription: Samedi 25 Juillet 2009, 11:25
Localisation: Le Creusot
Statut actuel: Actif et salarié | Enseignant


Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité