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;
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:
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
[^] # Re: Et par rapport à pgf/Tikz et autres ?
Posté par Philippe Ivaldi . En réponse au journal METAPOST 1.0 est sorti. Évalué à 1.
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