Mettre un path dans une boucle

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Mettre un path dans une boucle

Messagepar Zaf11000 » Mercredi 03 Mars 2010, 13:43

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 édition par MB le Mardi 17 Août 2010, 12:17, édité 2 fois.
Raison: Balises Code !
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: [Asymptote] Mettre un path dans une boucle

Messagepar OG » Mercredi 03 Mars 2010, 14:00

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.
OG
Modérateur
 
Messages: 2262
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Zaf11000 » Mercredi 03 Mars 2010, 15:04

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.
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar OG » Mercredi 03 Mars 2010, 15:09

Code: Tout sélectionner
path g=g..cycle;
OG
Modérateur
 
Messages: 2262
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Arnaud » Mercredi 03 Mars 2010, 15:11

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
LaTeX - Exemples de formules LaTeX

Pas d'aide en MP (non plus)
Arnaud
Modérateur
 
Messages: 7115
Inscription: Lundi 28 Août 2006, 12:18
Localisation: Allemagne
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Zaf11000 » Mercredi 03 Mars 2010, 15:13

Génial !
ça marche, merci O.G je me sauve j'ai cours à 4 h.
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Zaf11000 » Mercredi 03 Mars 2010, 17:52

Désolé,
Asymptote me fait perdre la tête !
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Zaf11000 » Jeudi 04 Mars 2010, 22:30

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.
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar OG » Vendredi 05 Mars 2010, 09:02

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.
OG
Modérateur
 
Messages: 2262
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Zaf11000 » Vendredi 05 Mars 2010, 23:01

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.
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Utilisation de hull_pi

Messagepar GMaths » Samedi 06 Mars 2010, 09:12

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 663 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.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar GMaths » Samedi 06 Mars 2010, 09:49

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 630 fois
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar GMaths » Samedi 06 Mars 2010, 10:36

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));
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar OG » Samedi 06 Mars 2010, 11:25

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.
OG
Modérateur
 
Messages: 2262
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Mettre un path dans une boucle

Messagepar GMaths » Samedi 06 Mars 2010, 11:35

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 édition par GMaths le Samedi 06 Mars 2010, 11:36, édité 1 fois.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Zaf11000 » Samedi 06 Mars 2010, 11:36

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.
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar GMaths » Samedi 06 Mars 2010, 11:40

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.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar OG » Samedi 06 Mars 2010, 11:43

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
OG
Modérateur
 
Messages: 2262
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Mettre un path dans une boucle

Messagepar Zaf11000 » Samedi 06 Mars 2010, 11:48

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".
Zaf11000
Kilo-utilisateur
 
Messages: 126
Inscription: Jeudi 18 Février 2010, 22:52
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Mettre un path dans une boucle

Messagepar GMaths » Samedi 06 Mars 2010, 11:49

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.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Suivante

Retourner vers Asymptote

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités