Page 1 sur 1

nCircle

Posté : mar. 13 nov. 2012, 19:13
par zariski
Bonsoir
j'ai trouvé cette routine : path Circle(pair c, real r, int n=nCircle);

Mais que signifie donc : nCircle ???

Merci

Re: nCircle

Posté : mar. 13 nov. 2012, 19:53
par GM
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());

Re: nCircle

Posté : mar. 13 nov. 2012, 20:04
par GM
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;

Re: nCircle

Posté : mar. 13 nov. 2012, 21:24
par zariski
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

Re: nCircle

Posté : mar. 13 nov. 2012, 23:13
par GM
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.