Page 1 sur 3

Mettre un path dans une boucle

MessagePosté: Mercredi 03 Mars 2010, 13:43
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Mercredi 03 Mars 2010, 14:00
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Mercredi 03 Mars 2010, 15:04
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Mercredi 03 Mars 2010, 15:09
par OG
Code: Tout sélectionner
path g=g..cycle;

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Mercredi 03 Mars 2010, 15:11
par Arnaud
Bon on recommence : Zaf11000, merci de poster les questions dans le bon forum, à savoir Latex et pas Logiciels mathématiques.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Mercredi 03 Mars 2010, 15:13
par Zaf11000
Génial !
ça marche, merci O.G je me sauve j'ai cours à 4 h.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Mercredi 03 Mars 2010, 17:52
par Zaf11000
Désolé,
Asymptote me fait perdre la tête !

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Jeudi 04 Mars 2010, 22:30
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Vendredi 05 Mars 2010, 09:02
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Vendredi 05 Mars 2010, 23:01
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.

Re: [Asymptote] Utilisation de hull_pi

MessagePosté: Samedi 06 Mars 2010, 09:12
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
2010-03-06_090809.png (6.94 Kio) Vu 955 fois


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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 09:49
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
zaf110000_hull_pi.jpg (6.7 Kio) Vu 922 fois

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 10:36
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));

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:25
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:35
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. ;-)

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:36
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:40
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.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:43
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

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:48
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".

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:49
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.