• [^] # Re: Et par rapport à pgf/Tikz et autres ?

    Posté par . En réponse au journal METAPOST 1.0 est sorti. Évalué à 1.

    Tout d'abord il a un problème:
    en Metapost tu prends un cercle défini par 4 noeuds alors qu'avec Asymptote tu en prends un défini par 400 points.
    Je dois quand même avouer qu'Asymptote est globalement plus lent que Metapost, c'est connu.

    Ensuite tu a bien cerné le problème, l'utilisation de "arclength" est très gourmande (surtout avec Asymptote) pour un résultat somme toute approximatif.
    Je développe actuellement le module de géométrie pour Asymptote en définissant les objets "line", "circle", "ellipse" etc..
    Je travaille sur la définition des objets non sur leur représentation (le path); cela me fait gagner en précision et en rapidité.
    Ensuite on peut tracer les objets avec autant de points que l'on veux en modifiant une variable globale.
    Comme normalement on ne trace les objets qu'une seule fois, le temps de compilation reste réduit.

    Voici ce que j'obtiens avec mon module en développement:
    8<------8<------8<------8<------8<------8<------8<------8<------
    import geo_dev;

    ellipse el=ellipse((0,0),100,1);
    write(el.e);
    write(arclength(el));
    8<------8<------8<------8<------8<------8<------8<------8<------

    $ time asy essai [1]

    e=0.999949998749938
    l=400.109832972265

    real 0m0.930s
    user 0m0.840s
    sys 0m0.010s

    Attention, le 'arclength' utilisé s'applique ici à l'objet 'ellipse' et appelle des routines qui me sont propres (c'est l'histoire des signature: deux routines peuvent avoir le même nom à condition qu'elles aient des paramètres différents); elles sont basées sur l'approximation d'une intégrale elliptique grâce aux algorithmes trouvés ici: http://www.nrbook.com/b/bookcpdf/c6-11.pdf

    La valeur de 'e', l'excentricité, est calculée à 1e-18.
    Avec le logiciel (libre bien sûr) de calcul formel Maxima j'obtiens:

    (%i1) 4*100*elliptic_ec(0.999949998749938^2);
    (%o1) 400.1098329722645


    Voici ce que j'obtiens avec Metapost et 999 points

    8<------8<------8<------8<------8<------8<------8<------8<------
    u=1;
    path ellipse;
    pair a;
    N=999;
    pas=360/(N+1);
    ellipse=(u,0)..
    for i=1 upto N:
    ((u,0) rotated (pas*i))..
    endfor cycle;

    ellipse:=ellipse xscaled 100;

    show(arclength(ellipse));
    8<------8<------8<------8<------8<------8<------8<------8<------

    $ time mpost essai.mp

    >> 400.11249 )
    Transcript written on essai.log.

    real 0m0.197s
    user 0m0.170s
    sys 0m0.010s

    soit une erreur de -2.657028e-3, ce qui est très convenable.
    Cependant avec la précision de calcul d'Asymptote on peut se resservir des résultats dans d'autres calculs sans trop de crainte sur les erreurs d'arrondi.
    D'ailleurs si Metapost ou même pstricks ont du mal avec la 3D c'est bien à cause des problèmes d'arrondi.

    Si ça t'intéresse, tu peux voire mon travail de dev ici:
    http://piprim.tuxfamily.org/asymptote/travaux/
    On remarquera en particulier la possibilité de travailler dans un repère cartésien quelconque, chaque objet étant lié à son propre repère, le tout de façon complètement transparente pour l'utilisateur.

    [1] Pour que ces résultat soient comparables voici ce que donne la compilation de ton code chez moi:
    real 0m0.243s
    user 0m0.140s
    sys 0m0.010s