Page 3 sur 3

Re: Distance entre un point et une conique

Posté : mer. 12 mai 2010, 12:38
par Hippyom
GM a écrit :Si on a trois ou quatre points alignés ou quasi alignés... ok, il y a un risque d'avoir une conique dégénérée... mais pas en forme d'aiguille à coudre. :mrgreen:

C'est précisément la réponse à une question que je me posais. ^^

GM a écrit :il y a un problème évident du code ... CAR la courbe ne passe pas par l'un des points.

Si tu parles de geometry.asy, j'ai bien essayé d'y jeter un coup d'oeil pour essayer de comprendre certaines erreurs renvoyant à ce code mais pour quelqu'un qui, comme moi, découvre tout juste Asymptote, c'est assez incompréhensible :mrgreen:

Re: Distance entre un point et une conique

Posté : mer. 12 mai 2010, 16:07
par OG
Bonjour

Plutôt que de faire un sujet d'analyse fonctionnelle, j'ai regardé.
Les coefficients sont importants, mais les points appartiennent bien
à l'ellipse.
Le problème a lieu lors du cast (pas casting à Cannes) de l'ellipse en un chemin.
Grosso modo, on fait varier l'angle de 0 à 360 et on met les points bout à bout
selon un guide et à la fin on donne un beau chemin. Pour l'ellipse avec ce
chemin on raccorde (chemin cyclique) et il m'est avis que le problème
a lieu à ce moment, un pb de tangente qui prend le dessus sur le reste
et te crée une petite excroissance à ton ellipse.
Je ne veux pas faire tomber le serveur de Gaëtan, il est possible
d'augmenter le paramètre ellipsenodesnumberfactor. Voici le code.
Si tu agrandis tu verras qu'à cet endroit ce n'est pas extraordinaire non plus,
la faute à la tangente...

Code : Tout sélectionner

import geometry;
size(5cm,0);
defaultpen(fontsize(10pt));
real[] tab={0,270,-1,39,-246,88,-291,142,-342,200,-398,261,-463};
real Phi=tab[0]; // la première valeur correspond à la latitude géographique
currentcoordsys=cartesiansystem((tab[1],tab[2]), i=(1,0), j=(0,1));
point o=(tab[1],tab[2]),
      p1=(tab[3],tab[4]),
      p2=(tab[5],tab[6]),
      p3=(tab[7],tab[8]),
      p4=(tab[9],tab[10]),
      p5=(tab[11],tab[12]);
real ech=1;
ellipsenodesnumberfactor=2500;
conic co=ellipse(ech*p1,ech*p2,ech*p3,ech*p4,ech*p5);
draw(co);
//dot((path)co);
dot(ech*p1, green);
dot(ech*p2, green);
dot(ech*p3, green);
dot(ech*p4, green);
dot(ech*p5, green);
//dot(o,blue);
bqe bqeco=bqe(p1,p2,p3,p4,p5);

int i=-1;
for(real k: bqeco.a) label("$a["+string(++i)+"]="+string(k)+"$",1.02truepoint(S));
label("dr\^ole d'"+conictype(bqeco),truepoint(N));

real[] v=bqeco.a;
for(int j=0;j<5;++j)
  {
    real x=tab[2*j+3];
    real y=tab[2*j+4];
    real s=v[0]*x*x+v[1]*x*y+v[2]*y*y+v[3]*x+v[4]*y+v[5];
    write(s);
  }



O.G.

Re: Distance entre un point et une conique

Posté : lun. 17 mai 2010, 08:33
par Hippyom
Bonjour,
désolé je ne pouvais pas répondre plus tôt.
Merci pour le code et les explications, en augmentant le paramètre ellipsenodesnumberfactor cela réduit effectivement la petite "excroissance" qui gêne :D . Mais j'avoue que je ne suis pas sûr d'avoir bien compris le rôle de ce paramètre : c'est le nombre d'itérations totales utilisées pour la fabrication du "chemin" ?

Re: Distance entre un point et une conique

Posté : lun. 17 mai 2010, 10:07
par GM
OG a écrit :Je ne veux pas faire tomber le serveur de Gaëtan, il est possible
d'augmenter le paramètre ellipsenodesnumberfactor.

Bon réflexe de te poser la question de la charge. Merci.

Comme je peux relancer le serveur s'il plante, moi je tente le coup. :-)

Figure asymptote 3627b326b651a0d001e7bcd86f4337ea
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1.  
  2. import geometry;
  3. size(300);
  4. real[] tab={0,270,-1,39,-246,88,-291,142,-342,200,-398,261,-463};
  5. real Phi=tab[0]; // la première valeur correspond à la latitude géographique
  6. currentcoordsys=cartesiansystem((tab[1],tab[2]), i=(1,0), j=(0,1));
  7. point o=(tab[1],tab[2]),
  8. p1=(tab[3],tab[4]),
  9. p2=(tab[5],tab[6]),
  10. p3=(tab[7],tab[8]),
  11. p4=(tab[9],tab[10]),
  12. p5=(tab[11],tab[12]);
  13. real ech=1;
  14. ellipsenodesnumberfactor=2500;
  15. conic co=ellipse(ech*p1,ech*p2,ech*p3,ech*p4,ech*p5);
  16. draw(co);
  17. //dot((path)co);
  18. dot(ech*p1, green);
  19. dot(ech*p2, green);
  20. dot(ech*p3, green);
  21. dot(ech*p4, green);
  22. dot(ech*p5, green);
  23. //dot(o,blue);

Ah... cela ressemble davantage à une ellipse. :-)

Re: Distance entre un point et une conique

Posté : lun. 17 mai 2010, 12:45
par OG
Bonjour

Pour l'effet produit je me suis trompé. C'est plutôt la répartition des points
qui créé un effet de bord là où l'ellipse est très pointue et non pas à la déclaration
"chemin fermé" (cycle). Grosso modo 2 points sont très proches au niveau du "pic"
mais les précédents et suivant sont plus loin, ce qui crée cette anomalie.
Avec "dot(co)" on voit la répartition très concentrée sur la zone plate
et au contraire très éparses sur la zone dite pointue.
Je pense qu'il est possible d'obtenir un résultat raisonnable avec
250 points, mais à condition de changer la dite répartition...

O.G.

Re: Distance entre un point et une conique

Posté : mer. 23 juin 2010, 22:29
par OG
Bonsoir

J'ai travaillé un peu sur le code de arcfromcenter et fait quelques modifications :
une autre distribution des points sur l'ellipse.

En attendant voici une solution simple qui permet de tracer l'ellipse sans avoir
à augmenter de façon inconsidérée le nombre de points.

Figure asymptote 1e4a69a8f96e60adc27b5c48b77f6f0c
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1.  
  2. import geometry;
  3. size(5cm,0);
  4. defaultpen(fontsize(10pt));
  5. real[] tab={0,270,-1,39,-246,88,-291,142,-342,200,-398,261,-463};
  6. real Phi=tab[0]; // la première valeur correspond à la latitude géographique
  7. currentcoordsys=cartesiansystem((tab[1],tab[2]), i=(1,0), j=(0,1));
  8. point o=(tab[1],tab[2]),
  9. p1=(tab[3],tab[4]),
  10. p2=(tab[5],tab[6]),
  11. p3=(tab[7],tab[8]),
  12. p4=(tab[9],tab[10]),
  13. p5=(tab[11],tab[12]);
  14. real ech=1;
  15.  
  16. //ellipsenodesnumberfactor=2500;
  17. ellipse co=ellipse(ech*p1,ech*p2,ech*p3,ech*p4,ech*p5);
  18. coordsys Rp=currentcoordsys;//coordsys(co);
  19. path gg=shift(Rp.O)*shift(co.C.x*Rp.i+co.C.y*Rp.j)*rotate(co.angle)*scale(co.a,co.b)*unitcircle;
  20. draw(gg);
  21. dot(ech*p1, green);
  22. dot(ech*p2, green);
  23. dot(ech*p3, green);
  24. dot(ech*p4, green);
  25. dot(ech*p5, green);
  26.  


O.G.

Re: Distance entre un point et une conique

Posté : dim. 25 juil. 2010, 13:22
par pivaldi
Bonjour à tous,

Je viens de « commiter » une correction dans geometry.asy que l'on peut récupérer ici en attendant qu'elle soit dans la version stable.

Le problème venait effectivement du casting de ellipse à « path ».
1. j'utilisai un guide au lieu d'un path (une erreur de débutant :oops: )
2. Si « l'étirement » de l'ellipse est supérieur à 10 j'ai décidé, arbitrairement, de multiplier le nombre de point utilisé par floor(étirement/5) et surtout de joindre les points par des segments (join=operator --;) alors que par défaut interpolate join = operator ..;.

Je ne sais d'ailleurs toujours pas si c'est une bonne idée d'utiliser operator .. par défaut. Il y a des recommandations là-dessus ? Je crois que c'est assez controversé…

Re: Distance entre un point et une conique

Posté : dim. 25 juil. 2010, 14:02
par pivaldi
Re,

J'ai aussi ajouté la bonne solution donnée par Olivier ; je ne l'avais pas vue dans mes courriels.
C'est effectivement une très bonne méthode, je regrette de ne pas y avoir pensé :(.
Voilà, le rendu est blindé maintenant (faudrait juste optimiser un peu).