nCircle
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 :
- Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
- Version d'Asymptote et éditeur utilisé pour les figures Asymptote
- Distribution LaTeX et éditeur utilisé pour les tex.
On va gagner du temps dans les réponses !
Re: nCircle
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 :
*** 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
- import graph;
- size(400);
- draw(Circle((0,0),1),dot());
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 !
Re: nCircle
*** 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
- import graph;
- size(200);
- 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
*** 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
- import graph;
- size(200);
- draw(Circle((0,0),1),orange);
- 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;
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 !
Re: nCircle
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 !
Re: nCircle
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
Principe de construction :
*** 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
- unitsize(2cm);
- pair z0=(0,0), z1=(7,0),
- c0=(1,3), c1=(5,5);
- // On déduit du quadruplet de points précédents (z0, c0, c1, z1)
- // (par construction de 6 milieux) le point z2 sur la courbe de bézier.
- // En procédant de même pour les quadruplets (z0, m0, m3, z2)
- // et (z2, m4, m2, z1), on obtiendrait deux nouveaux points de la courbe,
- // et c'est en continuant ainsi, par récursivité, que la courbe est construite.
- pair m0=(z0+c0)/2,
- m1=(c0+c1)/2,
- m2=(c1+z1)/2,
- m3=(m0+m1)/2,
- m4=(m1+m2)/2,
- z2=(m3+m4)/2;
- // Courbe (spline) de Bézier cubique (définie par 4 points).
- path CourbeBezier = z0 .. controls c0 and c1 .. z1;
- draw(CourbeBezier,2bp+blue);
- // Les traits et points de construction
- path lignebrisee = z0 -- c0 -- c1 -- z1;
- draw(lignebrisee^^m0--m1--m2^^m3--m4,dashed);
- dot(lignebrisee^^m0--m1--m2^^m3--m4^^z2,5bp+red);
- // Pour finir, on ajoute le nom des points.
- label("$z_0$",z0,S); label("$z_1$",z1,S);
- label("$c_0$",c0,N); label("$c_1$",c1,N);
- label("$m_0$",m0,NW); label("$m_1$",m1,N);
- label("$m_2$",m2,NE); label("$m_3$",m3,N);
- label("$m_4$",m4,N); label("$z_2$",z2,N);
- 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 !
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.
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 !