Page 2 sur 3

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 11:49
par GMaths
Zaf11000 a écrit:Je ne connais pas l'homothétie de Gaëtan

Tu n'as pas testé ce que je t'ai donné donc :

GMaths a écrit: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:55
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.


C'est ce que je voulais dire là :

GMaths a écrit: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.


Comme je l'ai écrit : j'y travaille. :-)

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 12:15
par Zaf11000
Je viens de tester la proposition de Gaëtan sur plusieurs exemples, c'est très beau !!! mais c'est vrai qu'il y des nuages où l'enveloppe convexe ne convient pas, c'est sûrement réalisable mais à quel prix ?

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 12:20
par GMaths
Zaf11000 a écrit:l'enveloppe convexe

Je le redis : moi je ne me suis pas soucié qu'elle soit convexe !

... mais OG l'avait relevé et t'a dit quoi modifier.

Regarde dans hull_pi, tu pourras y lire :

Code: Tout sélectionner
pair[] hull(pair[] c, real depthMin=infinity, real depthMax=0,
            real angleMin=360, real angleMax=0, int pivot=-1)


et le commentaire : With default parameter, return the convex hull.

Zaf11000 a écrit:... ne convient pas, c'est sûrement réalisable mais à quel prix ?


Qu'est ce qui ne convient pas ? Sois plus précis, stp.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 12:54
par GMaths
GMaths a écrit:Comme je l'ai écrit : j'y travaille. :-)


J'ai pondu cela en 5mn... mais j'ai perdu un temps certain à trouver une erreur (j'avais une réaffectation de variable k utilisée pour deux choses)
... et depuis à chercher certains incohérences au niveau des longueurs : je dois avoir une seconde erreur.

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, real m=0){
  guide g,gr;
  path p;
  for (int i=0; i < c.length; ++i) g=g.. tension t .. c[i];
  p=g.. tension t .. cycle;
  dot(p,2bp+blue);  // à supprimer après débogage
  if(m!=0){
    for (int i=0; i < c.length; ++i){
      c[i]=rotate(90,c[i])*shift(-m*dir(p,i))*c[i];
      gr = gr .. tension t .. c[i];
    }
    p = gr .. tension t .. cycle;
    dot(p,2bp+red); // à supprimer après débogage
  }
  pair omega=sum(c)/c.length;
  p=shift(omega)*scale(k)*shift(-omega)*p;
  return p;
}

draw(unejolieenveloppe(hull),1bp+.8green);
draw(unejolieenveloppe(hull,m=.2),1bp+.8blue);
draw(unejolieenveloppe(hull,m=.4),1bp+.8orange);

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

shipout(bbox(3mm,white));


Je reverrai le problème plus tard.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 13:11
par GMaths
GMaths a écrit:Je reverrai le problème plus tard.

En faisant autre chose... j'ai un peu réfléchi : le problème venait de c qui était redéfini.

Avec ceci, cela va mieux :
Code: Tout sélectionner
import hull_pi;
size(120,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, real m=0){
  guide g,gr;
  path p;
  pair[] c2=new pair[c.length];
  for (int i=0; i < c.length; ++i) g=g.. tension t .. c[i];
  p=g.. tension t .. cycle;
  if(m!=0){
    for (int i=0; i < c.length; ++i){
      c2[i]=rotate(90,c[i])*shift(-m*dir(p,i))*c[i];
      gr = gr .. tension t .. c2[i];
    }
    p = gr .. tension t .. cycle;
  }
  pair omega=sum(c)/c.length;
  p=shift(omega)*scale(k)*shift(-omega)*p;
  return p;
}

draw(unejolieenveloppe(hull),1bp+.8green);
draw(unejolieenveloppe(hull,m=.1),1bp+.8blue);
draw(unejolieenveloppe(hull,m=.5),1bp+.8orange);
draw(unejolieenveloppe(hull,m=1),1bp+.8white);

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

shipout(bbox(3mm,white));


2010-03-06_131122.png

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 14:03
par Zaf11000
Pou cet exemple le résultat n'est pas terrible !!
real[] x={1,2,3,4,5,6,7,8,9};
real[] y={1,2,3,3.5,4,4.25,4.27,4.29,4.30};

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 14:25
par GMaths
Zaf11000 a écrit:Pou cet exemple le résultat n'est pas terrible !!
real[] x={1,2,3,4,5,6,7,8,9};
real[] y={1,2,3,3.5,4,4.25,4.27,4.29,4.30};


Pour de telles configurations, pourquoi ne pas te contenter de tracerdes ellipses avec les points extrêmes, comme foyers.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 14:30
par Zaf11000
Je te donnerais bien un exemple concret mais je ne sais pas comment afficher une image pdf dans le forum, je viens de poster un message à ce sujet, je n'ai pas encore de réponse, peux-tu me le dire s'il te plait ?

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 14:39
par Zaf11000
Une ellipse, avec comme foyers les points extrêmes, ne couvre pas forcément tout le nuage.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 14:43
par GMaths
Zaf11000 a écrit:Je te donnerais bien un exemple concret

Mais tu m'en as donné un : je l'ai testé et effectivement j'ai vu.

Zaf11000 a écrit:mais je ne sais pas comment afficher une image pdf dans le forum

Je vais laisser un administrateur/modérateur te répondre...

... mais en attendant, tu peux te servir de ce site : http://imageshack.us/ pour mettre ton pdf en ligne et obtenir un lien à coller dans ton message.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 14:49
par GMaths
Zaf11000 a écrit:Une ellipse, avec comme foyers les points extrêmes, ne couvre pas forcément tout le nuage.

Tu as tant d'exemples que cela à faire ? et qui sont imprévisibles ?
Car pour l'exemple que tu donnais, l'ellipse est facile à trouver.
Ma question est pour savoir si cela vaut le coup de développer une routine qui sache traiter tous les cas les plus imprévisibles ?

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 14:54
par OG
Difficile de faire un truc automatique qui convient dans tous les cas.
Il y a déjà pas mal d'idées avec le travail de Gaëtan.
Après il faut ajuster à la main.

O.G.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 21:49
par Zaf11000
Voici ce qu j'obtiens avec une ellipse :

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 22:02
par GMaths
Zaf11000 a écrit:Voici ce qu j'obtiens avec une ellipse :

Oui, cela donne bien ce que j'avais imaginé.
Là, c'est convexe... sur la précédente, l'enveloppe ne l'est pas.

La question est : as-tu des dizaines de figures à faire ainsi, de formes variables, qui justifient de faire une routine qui serait capable de prendre en compte toutes les formes de nuages de points ?

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 22:11
par Zaf11000
Certainement non ! mais je suis fasciné par la beauté du mélange mathématiques-informatique, ce que l'on peut réaliser à l'aide de l'outil informatique, bon c'est sûr qu'il y a des logiciels avec des interfaces utilisateur qui font de belles chose mais on dispose pas de la même liberté, et puis rien quel plaisir de voir sortir de beaux résultats après un compilation.. : : :)

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 22:25
par GMaths
GMaths a écrit:sur la précédente, l'enveloppe ne l'est pas.

Apparemment, je parle d'une figure et d'un message qui n'existe plus.

Ne pouvait-on simplement réduire la taille de la figure au lieu de la supprimer ? :?

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 22:30
par Zaf11000
Avec certains logiciels je peux avoir un résultat correct comm :

AvecWord.png

Mais évidemment j'ai décidé de passer à LaTex et Asymptote. :mrgreen:

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 22:35
par GMaths
Zaf11000 a écrit:Avec certains logiciels je peux avoir un résultat correct

oui mais apparemment, tu as créé l'ensemble "manuellement", non automatiquement... donc si c'est pour faire comme cela, je ne vois pas le problème pour le faire : il suffit de choisir les points correctement.

Re: [Asymptote] Mettre un path dans une boucle

MessagePosté: Samedi 06 Mars 2010, 22:51
par Zaf11000
Bon, à l'origine j'ai une série double, comme je souhait par la suite tracer mon nuage de points avec Asymptote, du coup j'aimerais avoir la possibilité d'entourer mon nuage avec asymptote, bien sûr ce n'est pas d'une grande importance, mais ce serait tellement pratique et plaisant de le faire par programme.