Mettre un path dans une boucle

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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));
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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. :-)
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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 ?
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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};
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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 ?
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu par Zaf11000 »

Une ellipse, avec comme foyers les points extrêmes, ne couvre pas forcément tout le nuage.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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 ?
OG
Modérateur spécialisé
Modérateur spécialisé
Messages : 2293
Inscription : lundi 12 mars 2007, 11:20
Localisation : Rouen

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu par Zaf11000 »

Voici ce qu j'obtiens avec une ellipse :
Pièces jointes
AvecUneEllipse2.png
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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 ?
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.. : : :)
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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 ? :?
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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:
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.
Zaf11000

Re: [Asymptote] Mettre un path dans une boucle

Message non lu 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.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message