Distance entre un point et une conique

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
Hippyom
Messages : 39
Enregistré le : jeu. 8 avr. 2010, 08:57
Localisation : Poitiers

Re: Distance entre un point et une conique

Message non lu par Hippyom » mer. 12 mai 2010, 12:38

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:
Y.M.

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: Distance entre un point et une conique

Message non lu par OG » mer. 12 mai 2010, 16:07

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.

Hippyom
Messages : 39
Enregistré le : jeu. 8 avr. 2010, 08:57
Localisation : Poitiers

Re: Distance entre un point et une conique

Message non lu par Hippyom » lun. 17 mai 2010, 08:33

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" ?
Y.M.

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Distance entre un point et une conique

Message non lu par GM » lun. 17 mai 2010, 10:07

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. :-)
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: Distance entre un point et une conique

Message non lu par OG » lun. 17 mai 2010, 12:45

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.

OG
V.I.P.
V.I.P.
Messages : 142
Enregistré le : dim. 7 mars 2010, 22:27

Re: Distance entre un point et une conique

Message non lu par OG » mer. 23 juin 2010, 22:29

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.

Avatar du membre
pivaldi
V.I.P.
V.I.P.
Messages : 24
Enregistré le : jeu. 11 mars 2010, 21:09
Contact :

Re: Distance entre un point et une conique

Message non lu par pivaldi » dim. 25 juil. 2010, 13:22

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é…

Avatar du membre
pivaldi
V.I.P.
V.I.P.
Messages : 24
Enregistré le : jeu. 11 mars 2010, 21:09
Contact :

Re: Distance entre un point et une conique

Message non lu par pivaldi » dim. 25 juil. 2010, 14:02

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).

Répondre