Mettre un path dans une boucle

Tout ce qui concerne le langage Asymptote. Ce langage est supporté sur le forum via les balises asy.

Modérateur : gdm_asy

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Mettre un path dans une boucle

Message par Zaf11000 »

Bonjours à tous,
Est-ce que quelqu'un a essayé de définir un contour dans une boucle "for", par exemple, dans :

Code : Tout sélectionner

real[] x={1,2,3,4,5,6,6,8,8,9,10};
real[] y={1,1,2,4,5,3,5,5,6,7,7};
path chemin=(x[0],y[0])..(x[1],y[1])..(x[2],y[2])..(x[3],y[3])..(x[4],y[4])..(x[5],y[5])..(x[6],y[6])..(x[7],y[7])..(x[8],y[8])..(x[9],y[9])..(x[10],y[10])..cycle;
comment utiliser une boucle pour définir la dernière ligne ?

Merci.
Dernière modification par MB le mardi 17 août 2010, 13:17, modifié 2 fois.
Raison : Balises Code !

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: [Asymptote] Mettre un path dans une boucle

Message par OG »

Code : Tout sélectionner

size(200,0);

real[] x={1,2,3,4,5,6,6,8,8,9,10};
real[] y={1,1,2,4,5,3,5,5,6,7,7};

guide g;
path p;
for (int i=0;i<x.length ;++i ) {
  g=g..(x[i],y[i]);
  p=p..(x[i],y[i]);
}
draw(g,blue);
draw(p);
Le bon chemin est g. Un guide est comme un path mais sans les points de contrôle qui ne sont déterminés qu'à l'affichage (ou lors d'un path c=g). Pour p, à chaque ajout asymptote détermine un point de contrôle du à l'ajout d'un point. Donc les deux résultats sont différents. Ceci est expliqué dans l'exemple "mexican hat" de la doc.

O.G.

Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Re: [Asymptote] Mettre un path dans une boucle

Message par Zaf11000 »

Merci O.G
Ce que tu me proposes m'intéresse dans la mesure où le travail se fait dans une boucle "for", hélas le chemin obtenu n'est pas un contour fermé.
En fait j'ai besoin d'entourer un nuage de points pas un contour fermé, d'où l'avantage de "..cycle".
Je ne sais pas comment fermer cette ligne.

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: [Asymptote] Mettre un path dans une boucle

Message par OG »

Code : Tout sélectionner

path g=g..cycle;

Arnaud
Modérateur global
Modérateur global
Messages : 7095
Inscription : lundi 28 août 2006, 13:18
Localisation : Allemagne

Re: [Asymptote] Mettre un path dans une boucle

Message par Arnaud »

Bon on recommence : Zaf11000, merci de poster les questions dans le bon forum, à savoir Latex et pas Logiciels mathématiques.
Arnaud
Un peu d'info - Pyromaths - Pas d'aide en MP (non plus)

Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Re: [Asymptote] Mettre un path dans une boucle

Message par Zaf11000 »

Génial !
ça marche, merci O.G je me sauve j'ai cours à 4 h.

Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Re: [Asymptote] Mettre un path dans une boucle

Message par Zaf11000 »

Désolé,
Asymptote me fait perdre la tête !

Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Re: [Asymptote] Mettre un path dans une boucle

Message par Zaf11000 »

Bonsoir,
O.G, ton exemple d'utilisation de "guide" m'a bien servi mais je suis obligé de définir les points du contour moi-même, mais j'aimerais dessiner le contour uniquement à partir de mon nuage de points.
J'ai cherché un peu par tout, je pense que la réponse est dans le package contour.asy, mais comme il n'y a pas trop de doc, je n'ai pas pu l'exploiter.
As-tu une idée ?
Merci.

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: [Asymptote] Mettre un path dans une boucle

Message par OG »

Bonjour

En fait je n'ai pas bien compris ce que tu voulais faire.
Philippe Ivaldi a implémenté l'algo qui te donne l'enveloppe convexe d'un nuage
de points, évidemment c'est un polygône convexe et pas un truc courbe.

O.G.

Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Re: [Asymptote] Mettre un path dans une boucle

Message par Zaf11000 »

Bonsoir,
Je voudrais construire une enveloppe convexe pour un nuage de points pour série double, pas une enveloppe polygonale mais comme une courbe lissée (courbe de Bézier).
J'ai trouvé une source C d'application d'un algorithme de Gerard Berry, l'adaptation à l'environnement d'Asymptote ne parait pas évident, par ailleurs mes recherches ne m'ont pas permis de mettre la main sur l'algorithme de Philippe Ivaldi.
Si tu as un lien ça m'intéresse beaucoup.
Merci.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Utilisation de hull_pi

Message par GMaths »

Zaf11000 a écrit :par ailleurs mes recherches ne m'ont pas permis de mettre la main sur l'algorithme de Philippe Ivaldi.
Si tu as un lien ça m'intéresse beaucoup.
Un lien vers des exemples d'utilisation d'hull_pi.

J'imagine que tu as déjà mis tous les packages de Philippe (un lien déjà donné) dans ton dossier .asy
mais je précise que pour hull_pi, tu devras remplacer la ligne 126 par :

Code : Tout sélectionner

nodes.cyclic=true;
Un exemple :

Code : Tout sélectionner

import hull_pi;
size(200,0);

real[] x={1,2,3,4,5,6,7,8,9};
real[] y={1,4,3,4.5,5,3.5,5.2,2.3,7};

pair[] hull=hull(pairs(x,y),depthMin=0,depthMax=3,angleMin=0,angleMax=360);

path unejoliecourbe(pair[] c){
  guide g;
  for (int k=0; k < c.length; ++k) 
    g=g.. tension 3 .. c[k];
  return g..cycle;
}

draw(unejoliecourbe(hull),3bp+.8green);
draw(polygon(hull),1bp+blue);
dot(pairs(x,y),2bp+red);

shipout(bbox(3mm,white));
2010-03-06_090809.png
Dans la fonction unejoliecourbe que j'ai dû définir pour obtenir ce que tu veux,
(Dans hull_pi, Philippe a écrit l'algorithme pour déterminer les points utiles mais il s'est limité à la fonction path polygon(pair[] c), qui trace ce qu'elle dit, pour les relier : probablement à cause du genre de problème qui se passe dans l'exemple.)
j'ai été contraint de modifier la tension (par défaut à 1) à 3, sinon l'un des points ne se trouvait pas à l'intérieur.
Probablement faudra t-il modifier la fonction pour pouvoir passer la tension en paramètre... et donner ainsi plus de souplesse, suivant les exemples.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message par GMaths »

J'avais oublié la tension dans l'ajout de cycle.

Voilà avec la tension passée en paramètre :

Code : Tout sélectionner

import hull_pi;
size(150,0);

real[] x={1,2,3,4,5,6,7,8,9};
real[] y={1,4,3,4.5,5,3.5,5.2,2.3,7};

pair[] hull=hull(pairs(x,y),depthMin=0,depthMax=3,angleMin=0,angleMax=360);

path unejolieenveloppe(pair[] c, real t=1){
  guide g;
  for (int k=0; k < c.length; ++k) 
    g=g.. tension t .. c[k];
  return g.. tension t .. cycle;
}

draw(unejolieenveloppe(hull),3bp+.8green);
draw(unejolieenveloppe(hull,t=2),2bp+.8blue);
draw(unejolieenveloppe(hull,t=3),2bp+.8orange);

dot(pairs(x,y),3bp+black);

shipout(bbox(3mm,white));
zaf110000_hull_pi.jpg
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message par GMaths »

Ajout d'un paramètre k par défaut à 1, pour pouvoir appliquer à l'enveloppe une homothétie de centre "le point moyen du nuage" et de rapport k :

Code : Tout sélectionner

import hull_pi;
size(150,0);

real[] x={1,2,3,4,5,6,7,8,9};
real[] y={1,4,3,4.5,5,3.5,5.2,2.3,7};

pair[] hull=hull(pairs(x,y),depthMin=0,depthMax=3,angleMin=0,angleMax=360);

path unejolieenveloppe(pair[] c, real t=1, real k=1){
  guide g;
  for (int k=0; k < c.length; ++k) 
    g=g.. tension t .. c[k];
  path p=g.. tension t .. cycle;
  pair omega=sum(c)/c.length;
  p=shift(omega)*scale(k)*shift(-omega)*p;
  return p;
}

draw(unejolieenveloppe(hull,t=2),1bp+.8green);
draw(unejolieenveloppe(hull,t=2,k=1.1),1bp+.8blue);
draw(unejolieenveloppe(hull,t=2,k=1.2),1bp+.8orange);

dot(pairs(x,y),3bp+black);

shipout(bbox(3mm,white));

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: [Asymptote] Mettre un path dans une boucle

Message par OG »

Bonjour

Jolis exemples. Mais il me semble que pour une enveloppe convexe elle n'est pas
très convexe non ?
Il vaudrait peut-être mieux
pair[] hull=hull(pairs(x,y),depthMin=infinity,depthMax=0,angleMin=0,angleMax=360);
cela évitera d'avoir à modifier la tension.

O.G.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message par GMaths »

OG a écrit :Jolis exemples.
... que je mettrai plus tard dans la galerie : je vais attendre que Philippe rectifie la ligne citée dans hull_pi (pour pouvoir mettre un lien vers l'extension corrigée) et au cas où il y ajouterait des choses qui simplifierait les exemples.
OG a écrit :elle n'est pas très convexe non ?
Je n'ai pas dit que cela l'était... ;-)
... et j'avais oublié cette demande... sûrement parce que j'aime personnellement que cela ne le soit pas. ;-)
Dernière modification par GMaths le samedi 06 mars 2010, 11:36, modifié 1 fois.

Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Re: [Asymptote] Mettre un path dans une boucle

Message par Zaf11000 »

Bonjour et merci Gaëtan,
Cela répond tout à fait à ma question et à demande,mais l'enveloppe passe par les points extrêmes du nuage, pour éviter ceci je vais modifier les coordonnées des points extrêmes pour obtenir une enveloppe entourant les points du nuage sans passer par les points.

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message par GMaths »

Zaf11000 a écrit :l'enveloppe passe par les points extrêmes du nuage, pour éviter ceci je vais modifier les coordonnées des points extrêmes pour obtenir une enveloppe entourant les points du nuage sans passer par les points.
Ce n'est pas le cas, si tu choisis k>1.

A ce propos, plutôt que d'appliquer une homothétie, il faudrait que je bricole autre chose... pour obtenir une courbe décalée d'une distance fixe choisie.

OG
Modérateur
Modérateur
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: [Asymptote] Mettre un path dans une boucle

Message par OG »

As-tu essayé l'homothétie de Gaëtan pour éviter que cela passe par les points ?

Une autre idée serait de translater chaque point de l'enveloppe convexe par un vecteur de longueur un paramètre
(au choix) de direction orthogonale au segment point précédent-point suivant.


O.G

Zaf11000
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 126
Inscription : jeudi 18 février 2010, 22:52

Re: [Asymptote] Mettre un path dans une boucle

Message par Zaf11000 »

Bonjour Olivier,
Je ne connais pas l'homothétie de Gaëtan, mais je suis en tain de faire ce que tu me proposes, mais la translation (donc un vecteur fixe) ne résout pas le problème.
Je pensais translaté dans un sens les points les plus "à gauche" et dans un autre les points les plus "à droite".

GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2031
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message par GMaths »

OG a écrit :Une autre idée serait de translater chaque point de l'enveloppe convexe par un vecteur de longueur un paramètre
(au choix) de direction orthogonale au segment point précédent-point suivant.
J'ai fait cela... mais le rendu n'est pas terrible avec les seuls points du chemin p.
J'y travaille.