nCircle

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
zariski
Messages : 141
Enregistré le : dim. 30 sept. 2012, 18:50

nCircle

Message non lu par zariski » mar. 13 nov. 2012, 19:13

Bonsoir
j'ai trouvé cette routine : path Circle(pair c, real r, int n=nCircle);

Mais que signifie donc : nCircle ???

Merci
Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: nCircle

Message non lu par GM » mar. 13 nov. 2012, 19:53

Bonsoir,

Le contenu de graph_settings.asy est le suivant. Il y est défini des constantes.

Code : Tout sélectionner

// Number of function samples.
int ngraph=100;
int nCircle=400;

// Number of mesh intervals.
int nmesh=10;

real ticksize=1mm;
real Ticksize=2*ticksize;
real ylabelwidth=2.0;
real axislabelfactor=1.5;
real axiscoverage=0.8;

real epsilon=10*realEpsilon;

restricted bool Crop=true;
restricted bool NoCrop=false;


et donc dans graph.asy, les fonctions :

Code : Tout sélectionner

Arc(pair c, real r, real angle1, real angle2, int n=nCircle)

Code : Tout sélectionner

Arc(pair c, explicit pair z1, explicit pair z2, bool direction=CCW, int n=nCircle)

Code : Tout sélectionner

Circle(pair c, real r, int n=nCircle)


sont définies à l'aide de la fonction suivante qui les précède :

Code : Tout sélectionner

path Arc(pair c, real r, real angle1, real angle2, bool direction, int n=nCircle)
{
  angle1=radians(angle1);
  angle2=radians(angle2);
  if(direction) {
    if(angle1 >= angle2) angle1 -= 2pi;
  } else if(angle2 >= angle1) angle2 -= 2pi;
  return shift(c)*polargraph(new real(real t){return r;},angle1,angle2,n,
                             operator ..);
}


C'est donc pour résumé, une constante entière égale à 400, qui est le nombre de points par défaut pour le tracé de tout arc de cercle via l'une des fonctions précédentes.

Tu peux essayer de les compter :mrgreen: :

Figure asymptote 71ea59e5db4c164c02b7b449f7ec5bb5
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2. size(400);
  3. draw(Circle((0,0),1),dot());
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: nCircle

Message non lu par GM » mar. 13 nov. 2012, 20:04

Je complète mon message avec cet exemple :

Figure asymptote 2680bad0957aa21e275a53fe7788d9f7
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2. size(200);
  3. draw(unitcircle,dot());


... qui montre que la fonction unitcircle, avec seulement 4 points, est moins précise.

Ce n'est pas flagrant quand on les superpose

Figure asymptote b5af91d22853045d5a9962f6c12d2eda
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2. size(200);
  3. draw(Circle((0,0),1),orange);
  4. draw(unitcircle,dot());


... mais je cite la doc :
In general, a path is specified as a list of points (or other paths) interconnected with --, which denotes a straight line segment, or .., which denotes a cubic spline (see Chapter 5 [Bezier curves], page 22). Specifying a final ..cycle creates a cyclic path that connects smoothly back to the initial node, as in this approximation (accurate to within 0.06%) of a unit circle:

Code : Tout sélectionner

path unitcircle=E..N..W..S..cycle;
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

zariski
Messages : 141
Enregistré le : dim. 30 sept. 2012, 18:50

Re: nCircle

Message non lu par zariski » mar. 13 nov. 2012, 21:24

Suis scotché par tant de savoir !!
J'ai mis un peu de temps à comprendre mais c'est OK.
Il suffit d'assimiler le fait qu'Asymptote construit des courbes "régulières" qu'en utilisant un nombre de points relativement important !

Mais au fait comment as tu fait jusqu'à présent pour en savoir autant sur Asymptote ?

Merci pour tout et pour mes questions à venir ! :D
Windows 11- Ubuntu 20.10 - WinEdit - TexStudio - TeXMaker - TeXLive2022

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: nCircle

Message non lu par GM » mar. 13 nov. 2012, 23:13

zariski a écrit :Suis scotché par tant de savoir !!

Houla... pas tant que cela.
Je n'aurais pas su te répondre aussi précisément si je n'avais pas fait une recherche sur le mot "ncircle" dans les fichiers asy du dossier d'installation d'Asymptote.
Donc ma capacité est plus de savoir chercher que celle de savoir... un peu contraint par le fait que j'ai en fait une mauvaise mémoire. Je suis le premier utilisateur de mes galeries d'exemples pour me souvenir de ce que j'ai cherché et trouvé les années antérieures.

zariski a écrit :Il suffit d'assimiler le fait qu'Asymptote construit des courbes "régulières" qu'en utilisant un nombre de points relativement important !


Des splines cubiques d'interpolation... d'après l'algorithme de Hobby http://melusine.eu.org/hypermail/syracuse/att-0550/hobby.pdf

Une autre explication en français, simple à lire au début... et puis qui vire aussi à des choses très complexes : http://perso.univ-rennes1.fr/benjamin.b ... plines.pdf

Image

Principe de construction :

Figure asymptote 143f02709e97f09f2d2c3312fd257022
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. unitsize(2cm);
  2.  
  3. pair z0=(0,0), z1=(7,0),
  4. c0=(1,3), c1=(5,5);
  5.  
  6. // On déduit du quadruplet de points précédents (z0, c0, c1, z1)
  7. // (par construction de 6 milieux) le point z2 sur la courbe de bézier.
  8. // En procédant de même pour les quadruplets (z0, m0, m3, z2)
  9. // et (z2, m4, m2, z1), on obtiendrait deux nouveaux points de la courbe,
  10. // et c'est en continuant ainsi, par récursivité, que la courbe est construite.
  11.  
  12. pair m0=(z0+c0)/2,
  13. m1=(c0+c1)/2,
  14. m2=(c1+z1)/2,
  15. m3=(m0+m1)/2,
  16. m4=(m1+m2)/2,
  17. z2=(m3+m4)/2;
  18.  
  19. // Courbe (spline) de Bézier cubique (définie par 4 points).
  20. path CourbeBezier = z0 .. controls c0 and c1 .. z1;
  21. draw(CourbeBezier,2bp+blue);
  22.  
  23. // Les traits et points de construction
  24. path lignebrisee = z0 -- c0 -- c1 -- z1;
  25. draw(lignebrisee^^m0--m1--m2^^m3--m4,dashed);
  26. dot(lignebrisee^^m0--m1--m2^^m3--m4^^z2,5bp+red);
  27.  
  28. // Pour finir, on ajoute le nom des points.
  29. label("$z_0$",z0,S); label("$z_1$",z1,S);
  30. label("$c_0$",c0,N); label("$c_1$",c1,N);
  31. label("$m_0$",m0,NW); label("$m_1$",m1,N);
  32. label("$m_2$",m2,NE); label("$m_3$",m3,N);
  33. label("$m_4$",m4,N); label("$z_2$",z2,N);
  34.  
  35. shipout(bbox(3mm,white));


et l'auteur explique la généralisation à la 3D : http://www.math.ualberta.ca/~bowman/publications/asy3d.pdf

Ne pas me demander d'expliquer ! :mrgreen:

zariski a écrit :Mais au fait comment as tu fait jusqu'à présent pour en savoir autant sur Asymptote ?

Laborieusement et avec du temps.
En regardant les galeries d'exemples existantes (officielle et de Philippe) et en créant la mienne pour mémoriser ce que j'apprenais. Puis en regardant de plus en plus souvent dans les fichiers asy du dossier d'installation... dont je ne comprends qu'une petite partie mais une partie grandissante.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

Répondre