path : dans un sens et dans l'autre...

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 !
maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

path : dans un sens et dans l'autre...

Message non lu par maurice » ven. 4 juin 2010, 15:56

Bonjour, j'ai écris le code suivant :

Code : Tout sélectionner

               pair A,B,C,D,O;
           A=(0,0);
           B=(0,1);
           C=(1,1);
           D=(1,0);
           O=(A+C)/2;
                path chemin1=((A+O)/2--(B+O)/2--(O+C)/2--(O+D)/2);
                path chemin2=((O+D)/2--(O+C)/2--(B+O)/2--(A+O)/2);
      path g1,g2,g3,g4;
           g1=scale(1/2,A)*(rotate(-90,O)*chemin2);
           g2=scale(1/2,B)*chemin1;
           g3=scale(1/2,C)*chemin1;
           g4=scale(1/2,D)*(rotate(90,O)*chemin2);
      path h1=g1--g2--g3--g4;
      path p1,p2,p3,p4;
           p1=scale(1/2,A)*(rotate(-90,O)*chemin1);
           p2=scale(1/2,B)*chemin2;
           p3=scale(1/2,C)*chemin2;
           p4=scale(1/2,D)*(rotate(90,O)*chemin1);
      path h2=p4--p3--p2--p1;


Les chemins h1 et h2 sont superposables mais ne sont pas parcourus dans le même sens.
Existe-t-il une commande qui permet de passer d'un chemin h1 au chemin h2 (chemin superposable à g1 mais parcouru dans le sens contraire) ?

merci

Maurice
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

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

Re: path : dans un sens et dans l'autre...

Message non lu par GM » ven. 4 juin 2010, 16:24

maurice a écrit :Les chemins h1 et h2 sont superposables

donc quel intérêt d'en définir deux de façon aussi compliquée ?
maurice a écrit :Existe-t-il une commande qui permet de passer d'un chemin h1 au chemin h2 (chemin superposable à g1 mais parcouru dans le sens contraire) ?

passer d'un chemin à l'autre ??
g1 ??

Je n'ai pas tout compris à ce que tu essayes de faire mais reverse(nomdupath) me semble correspondre à ce que tu demandes.

Si tu veux que l'on t'aide à optimiser ton code, il faudra donner des précisions sur ce que tu veux faire. ;-)
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 !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: path : dans un sens et dans l'autre...

Message non lu par maurice » ven. 4 juin 2010, 16:52

Merci, ca correspond bien à ce que je cherchais.

Je n'ai pas tout compris à ce que tu essayes de faire mais reverse(nomdupath) me semble correspondre à ce que tu demandes.


C'était pour construire la courbe de Peano : Un chemin dans un carrée. On coupe de carré en 4 carrés. Dans chaque carré on construit un chemin homothétique au chemin de départ tourné de 90 ou -90 degré, puis on joint les quatre chemins et on recommence ...
Le problème était de joindre les chemins. Sans tenir compte du sens de parcours ca ne produisait pas la bonne figure.
Voici le code avec la commande reverse :

Code : Tout sélectionner

//Courbe de Peano avec Asymptote 1.91

import geometry;

//Taille de l'image
unitsize(10cm);

//Fonction récursive
void Peano(path chemin, int n) {
      pair A,B,C,D,O;
           A=(0,0);
           B=(0,1);
           C=(1,1);
           D=(1,0);
           O=(A+C)/2;
      path g1,g2,g3,g4;
           g1=scale(1/2,A)*(rotate(-90,O)*reverse(chemin));
           g2=scale(1/2,B)*chemin;
           g3=scale(1/2,C)*chemin;
           g4=scale(1/2,D)*(rotate(90,O)*reverse(chemin));
      path h=g1--g2--g3--g4;
      if (n>0) {
         Peano(h,n-1);
      }
      else draw(h);
}

//Initialisation
pair A,B,C,D,O;
     A=(0,0);
     B=(0,1);
     C=(1,1);
     D=(1,0);
     O=(A+C)/2;

draw(A--B--C--D--cycle);

path g=((A+O)/2--(B+O)/2--(O+C)/2--(O+D)/2);

int n=2;

Peano(g,n);


Je suis bien sur preneur de tout conseil pouvant améliorer le code.

Merci encore.

Maurice
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

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

Re: path : dans un sens et dans l'autre...

Message non lu par GM » ven. 4 juin 2010, 18:14

maurice a écrit :Je suis bien sur preneur de tout conseil pouvant améliorer le code.

Pas de le temps de le faire dans l'instant.

Si tu faisais cela pour t'entrainer sur Asymptote... cela ne va pas t'intéresser mais je te signale tout de même qu'il y a une certaine courbe de Hilbert qui est susceptible de t'intéresser dans les exemples de Philippe, ici. ;-)
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 !

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: path : dans un sens et dans l'autre...

Message non lu par maurice » ven. 4 juin 2010, 20:15

Je m'entraine, je fais des fractales ...
Les exemples de Philippe sont sans doute interessants mais le L_system sera pour plus tard...
merci.
maurice
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

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

Re: path : dans un sens et dans l'autre...

Message non lu par GM » sam. 5 juin 2010, 10:39

maurice a écrit :Je suis bien sur preneur de tout conseil pouvant améliorer le code.


J'ai regardé et je n'ai pas d'amélioration à proposer. :)

J'ai uniquement, comme distraction, cherché à proposer une autre façon de faire.
J'ai préféré définir le path dans un carré centré en O,
pour utiliser des transformations de centre O.

Figure asymptote 8b75c13db8378f6e759f956779f0227d
*** 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. size(200);
  2.  
  3. //Fonction récursive
  4. void Peano(path chemin, int n) {
  5. transform h=scale(.5),
  6. r=rotate(90),
  7. t=shift(-1/4,1/4), ti=inverse(t),
  8. s=xscale(-1);
  9. path p1=t*h*chemin,
  10. p2=ti*r*h*chemin;
  11. path p=s*p2--p1--reverse(s*p1)--reverse(p2);
  12.  
  13. if(n>0) Peano(p,n-1); else draw(p);
  14. }
  15.  
  16. /////////////////////////////////////////
  17. /////////////////////////////////////////
  18.  
  19. draw(shift(-.5,-.5)*unitsquare,blue);
  20.  
  21. // définition d'un path g à l'intérieur du carré
  22. // de centre O et de côté 1, qui vient d'être dessiné.
  23. real k=.25;
  24. path g=scale(k)*((-1,-1)--(-1,1)--(1,1)--(1,-1));
  25.  
  26. int n=4;
  27. Peano(g,n);
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: path : dans un sens et dans l'autre...

Message non lu par GM » sam. 5 juin 2010, 10:54

Quelques modifications pour obtenir un petit délire personnel :

Figure asymptote a94f4dd18db2b620fb7efd5e079fabb7
*** 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. // L'exemple précédent avec quelques modifications :
  2. // 1. un nouveau path g
  3. // 2. le type de jonction changé dans la fonction
  4. // renommée "delire". <img class="smilies" src="./images/smilies/icon_e_smile.gif" alt=":-)" title="Sourire" />)
  5. // 3. ajout d'un stylo.
  6.  
  7. size(200);
  8.  
  9. //Fonction récursive
  10. void delire(path chemin, int n, pen stylo=red) {
  11. transform h=scale(.5),
  12. r=rotate(90),
  13. t=shift(-1/4,1/4), ti=inverse(t),
  14. s=xscale(-1);
  15. path p1=t*h*chemin,
  16. p2=ti*r*h*chemin;
  17. path p=s*p2..p1..reverse(s*p1)..reverse(p2);
  18.  
  19. if(n>0) delire(p,n-1); else draw(p,stylo);
  20. }
  21.  
  22. /////////////////////////////////////////
  23. /////////////////////////////////////////
  24.  
  25. // définition d'un path g à l'intérieur du carré
  26. // de centre O et de côté 1.
  27. real k=.2;
  28. path g=scale(k)*((-1,-1){NNW}..(0,1)..{SSE}(1,-1));
  29.  
  30. int n=3;
  31. delire(g,n);
  32.  
  33. shipout(bbox(10));
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 !

projetmbc
Messages : 34
Enregistré le : mer. 17 mars 2010, 08:31

Re: path : dans un sens et dans l'autre...

Message non lu par projetmbc » sam. 5 juin 2010, 11:55

Très joli tout ceci...

maurice
Messages : 262
Enregistré le : jeu. 25 mars 2010, 13:00
Contact :

Re: path : dans un sens et dans l'autre...

Message non lu par maurice » sam. 5 juin 2010, 16:41

Merci pour les exemples qui m'ont permis de découvrir 3 transformation que je ne connaissais pas :
scale(x); xscale(a); inverse();

Maurice
Doc 3D
Si ça ne marche pas, essayez la version pdf

Fedora 23 -- Asymptote 2.35 -- TeXlive 2013 -- emacs et/ou gedit

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

Re: path : dans un sens et dans l'autre...

Message non lu par GM » sam. 5 juin 2010, 17:16

maurice a écrit :Merci pour les exemples qui m'ont permis de découvrir 3 transformation que je ne connaissais pas :
scale(x); xscale(a); inverse();


Les transformations de base :

6.4 Transforms

Asymptote makes extensive use of affine transforms. A pair (x,y) is transformed by the transform t=(t.x,t.y,t.xx,t.xy,t.yx,t.yy) to (x’,y’), where

Code : Tout sélectionner

x’ = t.x + t.xx * x + t.xy * y
y’ = t.y + t.yx * x + t.yy * y

This is equivalent to the PostScript transformation [t.xx t.yx t.xy t.yy t.x t.y].

Transforms can be applied to pairs, guides, paths, pens, strings, transforms, frames, and pictures by multiplication (via the binary operator *) on the left (see [circle], page 30 for an example).

Transforms can be composed with one another and inverted with the function

Code : Tout sélectionner

transform inverse(transform t); 

they can also be raised to any integer power with the ^ operator.

The built-in transforms are :

Code : Tout sélectionner

transform identity();

the identity transform;

Code : Tout sélectionner

transform shift(pair z);

translates by the pair z;

Code : Tout sélectionner

transform shift(real x, real y);

translates by the pair (x,y);

Code : Tout sélectionner

transform xscale(real x);

scales by x in the x direction;

Code : Tout sélectionner

transform yscale(real y);

scales by y in the y direction;

Code : Tout sélectionner

transform scale(real s);

scale by s in both x and y directions;

Code : Tout sélectionner

transform scale(real x, real y);

scale by x in the x direction and by y in the y direction;

Code : Tout sélectionner

transform slant(real s);

maps (x,y) –> (x+s*y,y);

Code : Tout sélectionner

transform rotate(real angle, pair z=(0,0));

rotates by angle in degrees about z;

Code : Tout sélectionner

transform reflect(pair a, pair b);

reflects about the line a--b.

The implicit initializer for transforms is identity(). The routines shift(transform t) and shiftless(transform t) return the transforms (t.x,t.y,0,0,0,0) and (0,0,t.xx,t.xy,t.yx,t.yy) respectively.


Les transformations ajoutées par l'extension geometry :

transform hprojection(line,bool)
transform projection(line)
transform projection(line,line,bool)
transform projection(point,point)
transform projection(point,point,point,point,bool)
transform reflect(line)
transform reflect(line,line)
transform rotate(explicit vector)
transform scale(real,line,line,bool)
transform scale(real,point)
transform scale(real,point,point,point,point,bool)
transform scaleO(real)
transform vprojection(line,bool)
transform xscale(real,point)
transform xscaleO(real)
transform yscale(real,point)
transform yscaleO(real)
transforms rotateO(real)


On les trouve dans l'index ici.


A ce propos, tu utilisais une syntaxe pour scale que l'on doit à geometry mais par ailleurs, tu n'utilises pas la structure point de Philippe.
Je t'ai proposé des exemples sans geometry, mais si je devais l'utiliser, j'en profiterais pour utiliser le type point plutôt que le type pair.
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