Asymptote Demarrage Rapide
Asymptote Demarrage Rapide
Asymptote Demarrage Rapide
6 j u il l et 2 01 1
Dmarrage rapide
cgmaths.fr/Atelier/Asymptote/Asymptote.html
Version 1.1
Christophe G ROSPELLIER
Asymptote
Dmarrage rapide
II Installation III Les diffrentes compilations 1 Options de compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Compilation lintrieur dun chier .tex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IV Quelques gnralits 1 Units, dimensions de la gure . . 2 Quelques commandes de dessins a draw . . . . . . . . . . . . . b ll . . . . . . . . . . . . . . . c label . . . . . . . . . . . . . . V Transformations VI Quelques gures basiques VIIQuelques modules 1 markers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 geometry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 trembling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Axes et repres . . . . . . . . . . . . . . . . . . . . . b Reprsentations de fonctions . . . . . . . . . . . . . c Extension graph_pi . . . . . . . . . . . . . . . . . . . 5 animation . . . . . . . . . . . . . . . . . . . . . . . . . . . . a Cration danimations autonomes . . . . . . . . . . b Inclure une animation externe dans un chier .tex c Inclure le code dans un chier .tex . . . . . . . . . . Annexe A Structures Annexe B Quelques macros de marquage 3D Annexe C crire sur une surface Annexe D Perspective cavalire Annexe E Fichier macros3D.asy
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
Copyright 2010-2011 Christophe Grospellier cgmaths.fr/Atelier/Asymptote/Asymptote.html Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Lesser General Public License (see the le LICENSE in the top-level source directory). 2
II INSTALLATION
Asymptote
Dmarrage rapide
Introduction
Cette documentation, trs incomplte, est avant tout destine ceux qui voudraient dbuter avec Asymptote. Si vous utilisez dj ce logiciel depuis quelque temps, vous ne devriez pas apprendre grand chose. . . Mieux vaut vous concentrer sur la documentation ofcielle et les galeries dexemples que lon peut trouver sur internet (voir le paragraphe suivant). Certaines gures 3D et les animations peuvent tre manipules ou visualises condition de visionner ce document avec Acrobat Reader.
I O trouver de laide
Dans la documentation et le forum ofciels (en anglais) : asymptote.sourceforge.net Dans la galerie dexemples de Philippe Ivalvi : www.piprime.fr/asymptote Dans la galerie dexemples de Gatan Marris : www.marris.org/asymptote Ces deux galeries seront un trs bon complment ce dmarrage rapide, notamment pour comprendre quelques subtilits et pour aller (beaucoup) plus loin. Sur le forum et le wiki de MathemaTex : mathematex.net Vous trouverez de laide sur ce forum frquent par des utilisateurs dAsymptote. Pour la 3D, il y a lexcellente documentation de Bruno Colombel : www.mathbko.marot.org/index.php Et enn, en lisant directement les chiers .asy dans le rpertoire dinstallation dAsymptote. Quelques connaissances en programmation et en anglais seront ncessaires.
II Installation
A Tout dabord, une distribution LTEX minimale doit tre installe. Ensuite, je ne traiterai pas linstallation sur Microsoft Windows ou MacOS X, ne connaissant pas (ou plus) ces systmes. Vous trouverez tous les renseignements dans la documentation ofcielle, ou sur asymptote.sourceforge.net.
Sur Unix, il existe un paquet Asymptote sur la plupart des distributions, installer par votre gestionnaire de paquet. Cependant, Asymptote tant un logiciel jeune, les mises jour sont frquentes. Pour avoir une version rcente du logiciel, une compilation des sources pour installer la version svn est ncessaire. Voici comment faire sur Ubuntu. Attention, il faut dsinstaller toute version pralablement installe. 1. Les paquets ncessaires
sudo apt-get install build-essential subversion flex texinfo autoconf zlib1g-dev sudo apt-get install bison libglut3 libglut3-dev cdbs debhelper libfftw3-dev sudo apt-get install libreadline6-dev libncurses5-dev libgsl0-dev libsigsegv-dev
2. Rcuprer les sources
cd asymptote ./autogen.sh wget http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.1.tar.gz ./configure make all sudo make install
Asymptote
Dmarrage rapide
L, Asymptote est install. Taper asy dans le terminal, vous verrez apparaitre le numro de version si tout cest bien pass. Taper quit pour sortir du mode interactif. 4. Pour les mises jour, cest
1 ) Options de compilation
Les options de compilation sont trs nombreuses (voir la documentation ofcielle). Nous ne nous intresserons ici qu quelques-unes. Crez un chier texte, nommez le exemple.asy et collez-y un des codes dexemple ci-aprs (pas le premier !). Enregistrez le document. La compilation de ce code se fait en ligne de commande, avec les options par dfaut, par
asy exemple.asy
-V : utile notamment pour les gures 3D, la gure souvre dans une fentre de rendu OpenGL. La gure est alors manipulable, et un double clique-droit permet daccder diffrents paramtres.
-noV : pour que le pdf (ou eps, ou autre) soit cr directement. -f : pour prciser le format de sortie (pdf, . . .). quivalent settings.outformat="pdf"; (ou autre) dans le code de la gure. -prc : pour les gures 3D : format prc dadobe dans le pdf. Le pdf ne sera visualisable quavec une version sufsamment rcente dAcrobat Reader. La gure sera manipulable et on aura accs un menu 3D. -noprc : pas de format prc. La gure peut tre visualise dans nimporte quel lecteur pdf. quivalent settings.prc=false; dans le code de la gure. -render n : rendu des gures 3D (n pixels/bp). quivalent settings.render=n; dans le code de la gure.
Exemple de compilation
La gure produite peut tre incluse dans un document .tex par un \includegraphics.
Asymptote
Dmarrage rapide
\usepackage{asymptote}
Le code de la gure doit tre compris entre les balises \begin{asy} et \end{asy}.
La compilation se fait en trois temps : 1. Une compilation latex (ou pdflatex). Un chier .asy par gure est cr. 2. Une compilation asy. Pour compiler toutes les gures, si le chier tex sappelle exemple.tex :
asy exemple-*.asy
Les gures sont cres au format eps pour une compilation latex, ou au format pdf pour une compilation pdflatex. 3. Une nouvelle compilation latex (ou pdflatex). latexmk Toutefois, il est dornavant possible de tout compiler en une fois grce une version sufsamment rcente du script latexmk. Ce script est peut-tre dj install sur votre distribution ou alors il est tlchargeable sur le CTAN : www.ctan.org/tex-archive/support/latexmk/. Une fois install, il faut crer un chier nomm latexmkrc contenant :
\def\asydir{figures}
et remplacer la premire ligne du chier latexmkrc par :
IV QUELQUES GNRALITS
Asymptote
Dmarrage rapide
IV Quelques gnralits
Une bonne partie de la documentation ofcielle sera reprise ici. Les exemples de cette partie pourront tre compils simplement par : asy mafigure.asy (pour de leps) ou asy -f pdf mafigure.asy (pour du pdf).
CODE 2
pair A=(0,0), B=(2cm,2cm); draw(A--B); unitsize(1cm); pair A=(0,0), B=(2,2); draw(A--B);
Remarques : L unit peut tre diffrente pour les abscisses et les ordonnes : unitsize(1cm,1.5cm); On peut aussi spcier la taille nale de la gure produite : Pour une gure de 3cm de largeur, on prcisera : size(3cm,0); (0 pour ne pas avoir spcier la hauteur, la mise lchelle tant automatique.) La taille peut tre spcie en bp, pt, cm, mm ou inches. -- est un connecteur qui joint les points par un segment. Les autres connecteurs sont .. , :: et --- (voir la documentation ofcielle).
CODE 4
size(0,1cm); draw((0,0)--(1,.5)--(2,0)--(3,.5),blue);
CODE 5
size(0,1cm); draw((0,0)..(1,.5)..(2,0)..(3,.5),blue);
void draw(picture pic=currentpicture, Label L="", path g, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend="", marker marker=nomarker)
Voyons en dtail quelques options (pour les autres, voir la documentation ofcielle) :
picture pic=currentpicture : dessine dans limage pic, par dfaut currentpicture. Label L="" : permet de placer un texte. path g : le chemin dessiner. pen p=currentpen : le stylo utiliser.
IV QUELQUES GNRALITS
Asymptote
Dmarrage rapide
arrowbar arrow=None : Les ches. Les valeurs possibles sont : None, Blank, BeginArrow, MidArrow, Arrow, et Arrows (ches aux deux extrmits). On peut de plus prciser le type de tte (DefaultHead, SimpleHead, HookHead, TeXHead), la taille, langle de la tte, le type de remplissage (FillDraw, Fill, NoFill, UnFill, Draw) et la position relative. Il y a aussi certaines versions modies (taille et angle) : BeginArcArrow, MidArcArrow, ArcArrow, et ArcArrows. arrowbar bar=None : Les barres aux extrmits. Les valeurs possibles sont : None, BeginBar, Bar et Bars. On peut prciser la taille.
Chemin
CODE 6
size(5cm,0); path chemin=(0,0)..(1,.5)..(2,0)..(3,.5); draw("Chemin",chemin,blue,Arrow); draw(shift(0,-.6)*chemin,green,BeginArrow(5mm,Draw),Bar); draw(shift(0,-1.2)*chemin,.8*red,Arrows(TeXHead)); draw(shift(0,-1.8)*chemin,bp+magenta,MidArrow(HookHead,Fill(blue)),Bars(2mm));
b ) ll
void fill(picture pic=currentpicture, path g, pen p=currentpen) void filldraw(picture pic=currentpicture, path g, pen fillpen=currentpen,pen drawpen=currentpen)
Ces deux fonctions servent remplir les chemins cycliques :
CODE 8 CODE 7
size(5cm,0); size(5cm,0); path r=(0,0)--(1,0)--(1,.5)--(0,.5)--cycle; path r=(0,0)--(1,0)--(1,.5)--(0,.5)--cycle; fill(rectangle,lightyellow); filldraw(r,fillpen=lightyellow, drawpen=2bp+.8green);
c ) label
void label(picture pic=currentpicture, Label L, pair position, align align=NoAlign, pen p=nullpen, filltype filltype=NoFill)
7
IV QUELQUES GNRALITS
Asymptote
Dmarrage rapide
Cette fonction permet de placer un texte au point de coordonnes position. Le texte peut tre une simple chane de A caractres (respectant la syntaxe LTEX) ou une structure plus complexe obtenue par une fonction du type (il y en a dautres, voir la documentation ofcielle) :
Label Label(string s="", pair position, align align=NoAlign, pen p=nullpen, embed embed=Rotate, filltype filltype=NoFill) align peut prendre nimporte quel pair comme valeurs. Certaines sont prdnies : N, S, E, W, NE, NW, SE, SW, LeftSide, RightSide, Center.
Voir les exemples qui suivent pour les diffrents paramtres.
B B N W S
CODE 9
size(5cm,0); pair A=(0,0); dot(A); label("$N$",A,5*N); label("$S$",A,5*S); label("$E$",A,5*E); label("$W$",A,5*W);
E A
CODE 10
A
CODE 11
size(5cm); pair A=(0,0), B=(2,1); path seg=A--B; label("$A$",A,dir(A-B)); label("$B$",B,dir(B-A)); draw(Label("$\sqrt{5}$", align=LeftSide), seg,bp+deepgreen+dashed);
size(5cm); pair A=(0,0), B=(2,1); path seg=A--B; label("$A$",A,W); label("$B$",B,E); draw("$\sqrt{5}$",seg, linewidth(bp));
5
A
CODE 12
size(5cm); pair A=(0,0), B=(2,1); path seg=A--B; label("$A$",A,dir(A-B)); label("$B$",B,dir(B-A)); draw(Label("$\sqrt{5}$", Rotate(dir(seg)), align=LeftSide), seg,blue);
5
A
CODE 13
A
CODE 14
size(5cm);
size(5cm); pair A=(0,0), B=(2,1); path seg=A--B; label("$A$",A,dir(A-B)); label("$B$",B,dir(B-A)); draw(Label("$\sqrt{5}$", Rotate(dir(seg)), align=S), seg,longdashdotted); pair A=(0,0), B=(2,1); path seg=A--B; label("$A$",A,dir(A-B)); label("$B$",B,dir(B-A)); draw(Label("$\sqrt{5}$", Rotate(dir(seg)), align=LeftSide, position=Relative(.75)), seg,bp+brown+dotted);
V TRANSFORMATIONS
Asymptote
Dmarrage rapide
x abscisses
CODE 15
size(5cm); pair A=(0,0), B=(1,0); path seg=A--B; label("$x$",A,N); label("$x$",B,N);
A
CODE 16
4 cm
B
A
unitsize(1cm); pair A=(0,0), B=(4,0); path seg=A--B; label("$A$",A,W); label("$B$",B,E); draw(Label("$4$~cm", align=Center, filltype=UnFill), seg,bp+fuchsia, Arrows(SimpleHead),Bars);
CODE 17
size(5cm,0); import fontsize; defaultpen(fontsize(10pt)); pair A=(0,0), B=(1,0); draw(A--B,linewidth(bp)); label("$A$",A,W,.8blue); pen f20=fontsize(20pt); label("$B$",B,E,f20+brown);
Remarque : # Dans les exemples, B-A peut tre interprt comme le vecteur AB. On peut raliser diffrentes oprations sur les pairs. Par exemple pair I=(A+B)/2; donnera le milieu I de [AB] (quivalent pair I=midpoint(A--B);).
V Transformations
Prsentation rapide des transformations dAsymptote. Pour la premire, pas besoin de gure. . . : transform identity(); Ensuite :
C C AB A
B C C C A
CODE 18
size(7cm); pair A=(0,0), B=(3,1); path c=unitcircle; path c1=shift(3,1)*c; draw("$\mathcal{C}$",c); draw("$\mathcal{C}$",c1,bp+purple); draw("$\overrightarrow{AB}$", A--B,blue,Arrow); dot("$A$",A,SW); dot("$B$",B,SE);
CODE 19
size(4cm); pair A=(0,0); path c=unitcircle; path c1=xscale(.5)*c; path c2=yscale(.5)*c; draw("$\mathcal{C}$",c); draw("$\mathcal{C}$",c1,E,bp+purple); draw("$\mathcal{C}$",c2,E,bp+royalblue); dot("$A$",A,SW);
V TRANSFORMATIONS
Asymptote
Dmarrage rapide
C
CODE 20
size(4cm); pair A=(0,0);
CODE 21
size(7cm); pair A=(0,0); path c=unitcircle; path c1=scale(2,.5)*c; draw("$\mathcal{C}$",c); draw("$\mathcal{C}$",c1,bp+purple); dot("$A$",A,SW);
A C
3 5
CODE 23
import markers; // pour utiliser markangle size(7cm); pair A=(0,0), B=(-1.5,-1); transform rot=rotate(108,B); path c=unitcircle; pair A1=rot*A; path c1=rot*c; draw("$\mathcal{C}$",c,NW); draw("$\mathcal{C}$",c1,S,bp+purple); draw(A--B--A1,dashed); markangle("$\frac{3\pi}{5}$",A,B,A1, radius=6mm,Arrow); dot("$A$",A,SE);dot("$A$",A1,SW); dot("$B$",B,SE);
CODE 22
size(7cm); pair A=(0,0); path c=unitcircle; path c1=slant(1.5)*c; draw("$\mathcal{C}$",c,NW); draw("$\mathcal{C}$",c1,SE,bp+purple); dot("$A$",A,SW);
10
Asymptote
Dmarrage rapide
D C C
CODE 24
size(6cm); pair A=(0,0), B=(.7,-1.3), C=(.7,1.3); path c=unitcircle; path c1=reflect(B,C)*c; pair A1=reflect(B,C)*A; draw("$\mathcal{C}$",c,NW); draw("$\mathcal{C}$",c1,NE,bp+purple); draw(Label("$\mathcal{D}$",EndPoint),B--C,SW,.8red); dot("$A$",A,SW);dot("$A$",A1,SE,purple);
11
Asymptote
Dmarrage rapide
C C B intersectionpoint A A B
CODE 26
size(7cm,0);
extension D E
D
CODE 25
size(5cm,0); pair A=(0,0); path c=circle(A,1.5); pair B=relpoint(c,0), C=relpoint(c,.15), D=relpoint(c,.65); path a=subpath(c,reltime(c,.15),reltime(c,.65)); path b=subpath(c,3,4); draw(c); draw(a,bp+red); draw(b,bp+green); dot(c,linewidth(bp),UnFill); dot("$A$",A,SW);dot("$B$",B,E,blue); dot("$C$",C,NE,blue);dot("$D$",D,SW,blue);
pair A=(0,0), B=(-1.5,1), C=(1.5,1.5), D=(2.5,.5), pE=(2.5,-.5); path seg1=A--C, seg2=B--D; pair inter=intersectionpoint(seg1,seg2); pair ext=extension(B,C,D,pE); dot("intersectionpoint",inter,1.5*S,5bp+red); dot("extension",ext,SE,5bp+blue); draw(seg1,linewidth(bp)); draw(seg2,linewidth(bp)); draw(B--interp(B,C,2),dashed); draw(pE--interp(pE,D,2.5),dashed); dot("$A$",A,SW);dot("$B$",B,NW); dot("$C$",C,N);dot("$D$",D,NE); dot("$E$",pE,E);
C A B
CODE 27
size(7cm,0); pair A=(0,0), B=(-2.5,-1), C=(3,.5); path c=circle(A,1.5); path d=interp(B,C,-.2)--interp(B,C,1.2); draw(c,bp+heavyred);draw(d,bp+heavymagenta); // tableau de pairs pair[] inter=intersectionpoints(c,d); for(int i=0; i<inter.length; ++i) { dot("inter"+string(i),inter[i],S,5bp+blue); } dot("$A$",A,NW);dot("$B$",B,NW);dot("$C$",C,N);
inter0
inter1
12
Asymptote
Dmarrage rapide
C P [1]
P [0]
CODE 28
import patterns; // hachures size(6cm,0); pair A=(0,0), B=(3,0), C=(1,2); path tri=A--B--C--cycle; path c=circle(B,1.5); pair[] P=intersectionpoints(tri,c); path intersec=B--P[0]--arc(B,P[0],P[1],CW)--cycle; // CW : ClockWise, CCW : Counter-ClockWise (dfaut) draw(tri); draw(c); // Dfinition des hachures : add("hachure",hatch(3mm,NE,1.5mm+royalblue)); filldraw(intersec,pattern("hachure")); dot("$P[0]$",P[0],SW);dot("$P[1]$",P[1],N); dot("$A$",A,dir(C--A,B--A)); //direction de la bissectrice dot("$B$",B,dir(C--B,A--B));dot("$C$",C,N);
R1 R2
CODE 29
size(6cm); pair A=(0,0), B=(1,0), C=(1,.5), D=(1,-.5), pE=(3,.5), F=(3,-.5), G=(3,0), H=(4,0); draw(A--B--C--pE--G--H); draw(A--B--D--F--G--H); draw("$R_1$",box,(2,.5),xmargin=3mm,ymargin=0,UnFill); draw("$R_1$",box,(2,.5),xmargin=3mm,ymargin=0); draw("$R_2$",box,(2,-.5),xmargin=3mm,ymargin=0,UnFill); draw("$R_2$",box,(2,-.5),xmargin=3mm,ymargin=0);
13
Asymptote
Dmarrage rapide
x (2)
3 (2) ...
CODE 30
unitsize(1cm); defaultpen(fontsize(10pt)); usepackage("amsmath"); usepackage("amsfonts"); usepackage("amssymb"); pair z0=(-1.75,0), z1=(1.75,0), z2=(0,1), z3=(0,-1); object object object object boite1=draw("$x \geqslant -3$",box,z2,invisible); boite2=draw("$\times (-2)$",ellipse,z0); boite3=draw("$\times (-2)$",ellipse,z1); boite4=draw("$\quad\dots\quad$",box,z3,invisible);
3 1
CODE 31
1 5 4
size(4cm); transform r=reflect((0,0),(0,1)); // Fonction pour tracer les boules void boule(Label L="", pair a, pen p=currentpen, pen fillpen=nullpen) { filldraw(shift(a)*unitcircle,fillpen,p); label(scale(1.5)*L,a); } // Urne pair A=(3.1,0), B=(3.1,4), C=(2.1,5), D=(1.1,6), pE=(1.1,7), F=(2.1,8), G=(3.1,8); pair H=r*A; path demi=G--F{dir(180)}..{dir(270)}pE--D{dir(270)}..{dir(0)}C{dir(0)}..{dir(-90)}B--A; path demi2=r*demi; draw(demi^^demi2,linewidth(3bp));draw(A--H,linewidth(3bp)); // Boules boule("$5$",(0,1.1),linewidth(bp),gray+opacity(.7)); boule("$1$",(-2,1.1),linewidth(bp)); boule("$4$",(2,1.1),linewidth(bp)); boule("$3$",(-1,2.85),linewidth(bp),gray+opacity(.7)); boule("$1$",(1,2.85),linewidth(bp));
14
Asymptote
Dmarrage rapide
50 A
CODE 32
import markers; size(4cm); real ang=50; pair A=(0,0), B=(3,0); transform r=rotate(ang,A); pair C=r*B; path seg1=A--B; path seg2=r*seg1; draw(seg1^^seg2,linewidth(bp)); // fonction format, voir ci-contre markangle(format("$%f^\circ$",ang), B,A,C,radius=6mm); label("$A$",A,SW); label("$B$",B,SE); label("$C$",C,NE);
format($x=%07.3f$, 6.6666)
format($x=%7.3f$, 6.6666) format($x=%g$, 66.66666) format($x=%g$, 666666.666) format($x=%g$, 666666666.666) format($x=%e$, 666666.666) format($x=%.2e$, 666666.666) format($x=%i$, 6) format($x=%f$, 6.0) format($x=%+.2f$, 6.66666) format($x=%+.2f$, -6.66666) format($x=% .2f$, 6.666666)
x = 66,666 x = 666667 x = 6,66667108 x = 6,666667105 x = 6,67105 x=6 x=6 x = +6,67 x = 6,67 x= 6,67
pr se e nt
o des ation
CODE 33
import labelpath; size(0,3.5cm); path p=(0,0)..(2,-1)..(2.5,-.5)..(3,-.75); labelpath("\Large Fin de la pr\esentation des outils de base",p,purple); draw(p,heavygreen);
15
ut il
Fin de
la
sd
e base
Asymptote
Dmarrage rapide
1 ) markers
Le module markers fournit tout ce quil faut pour marquer segments et angles. Les marqueurs pour les segments sont :
marker StickIntervalMarker(int i=2, int n=1, real size=0, real space=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, frame uniform=newframe, bool above=true)
A
CODE 34
import markers; size(7cm,0); pair A=(0,0), B=(3,0); draw(A--B,StickIntervalMarker(3,2, angle=25,dotframe(purple))); label("$A$",A,W);label("$B$",B,E);
A
CODE 35
marker CrossIntervalMarker(int i=2, int n=3, real size=0, real space=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, frame uniform=newframe, bool above=true)
A
CODE 36
A
CODE 37
marker CircleBarIntervalMarker(int i=2, int n=1, real barsize=0, real radius=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, filltype filltype=NoFill, bool circleabove=false, frame uniform=newframe, bool above=true)
16
Asymptote
Dmarrage rapide
A A
CODE 38
import markers; size(7cm,0); pair A=(0,0), B=(3,0); draw(A--B,CircleBarIntervalMarker(3,2, barsize=5mm,radius=1.5mm, angle=-45,darkgreen, filltype=NoFill,dotframe(purple))); label("$A$",A,W);label("$B$",B,E);
CODE 39
import markers; size(7cm,0); pair A=(0,0), B=(3,0); draw(A--B,CircleBarIntervalMarker(4,1, barsize=5mm,radius=1.5mm,bp+blue, filltype=Fill(brown), circleabove=true, dotframe(purple),above=false)); label("$A$",A,W);label("$B$",B,E);
A
CODE 40
import markers; size(7cm,0); pair A=(0,0), B=(3,0); draw(A--B,CircleBarIntervalMarker(4,1, barsize=5mm,radius=1.5mm, bp+blue,filltype=Fill(brown), dotframe(purple))); label("$A$",A,W);label("$B$",B,E);
B A
CODE 41
import markers; size(7cm,0); pair A=(0,0), B=(3,0); draw(A--B,CircleBarIntervalMarker(3,0, radius=1.2mm,bp+fuchsia, filltype=NoFill,dotframe(purple))); label("$A$",A,W);label("$B$",B,E);
marker TildeIntervalMarker(int i=2, int n=1, real size=0, real space=0, real angle=0, pair offset=0, bool rotated=true, pen p=currentpen, frame uniform=newframe, bool above=true)
A
CODE 42
A
CODE 43
import markers; size(7cm,0); pair A=(0,0), B=(3,0); draw(A--B,TildeIntervalMarker(3,2,size=1mm, space=4mm,bp+orange, dotframe(purple),above=false)); label("$A$",A,W);label("$B$",B,E);
import markers; size(7cm,0); pair A=(0,0), B=(3,0); draw(A--B,TildeIntervalMarker(4,1,size=1mm, angle=-40,offset=(0,2),bp+darkcyan, dotframe(purple),above=true)); label("$A$",A,W);label("$B$",B,E);
A
CODE 44
import markers; size(7cm,0); pair A=(0,0), B=(3,0); frame cg; filldraw(cg,scale(5)*polygon(7),Yellow,bp+Magenta); marker markcg = marker(crossframe(n=4,size=1.5mm,bp+purple), markinterval(2,cg,true)); draw(A--B,markcg); label("$A$",A,W);label("$B$",B,E);
17
Asymptote
Dmarrage rapide
frame stickframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen) frame circlebarframe(int n=1, real barsize=0, real radius=0,real angle=0, pair offset=0, pen p=currentpen, filltype filltype=NoFill, bool above=false) frame crossframe(int n=3, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen) frame tildeframe(int n=1, real size=0, pair space=0, real angle=0, pair offset=0, pen p=currentpen)
Pour marquer langle AOB (dans le sens direct), on dispose de :
void markangle(picture pic=currentpicture, Label L="", int n=1, real radius=0, real space=0, pair A, pair O, pair B, arrowbar arrow=None, pen p=currentpen, filltype filltype=NoFill, margin margin=NoMargin, marker marker=nomarker)
B
CODE 46
O
import markers; size(5cm,0); pair O=(0,0), A=(2,0), B=(1,1.5), C=A+dir(A--O,A--B);
CODE 45
import markers; size(5cm,0); pair O=(0,0), A=(2,0), B=(1,1.5); draw(A--O--B); markangle(scale(1.5)*"$\alpha$",radius=40, A,O,B,ArcArrow,bp+red); markangle(scale(1.5)*"$\beta$",radius=30, B,O,A,BeginArcArrow(HookHead,2mm), bp+deepgreen); label("$O$",O,SW); label("$A$",A,SE);label("$B$",B,N);
markangle(n=2,radius=20, A,O,B,p=2bp+deepcyan, filltype=Fill(magenta)); markangle(n=1,radius=20, O,B,A,p=2bp+deepcyan, marker(markinterval(stickframe(n=2, 4mm,bp+red),true))); markangle(n=2,radius=20, B,A,O,p=bp+heavyblue, marker(markinterval(2,stickframe(n=1, 2mm,bp+purple),true))); draw(A--interp(A,C,2),bp+dashed); draw(A--O--B--cycle,linewidth(bp)); label("$O$",O,SW); label("$A$",A,SE);label("$B$",B,N);
18
Asymptote
Dmarrage rapide
2 ) geometry
Ce module apporte un grand nombre doutils permettant de faciliter la construction de gures gomtriques dans le plan. Une fois nest pas coutume, il y a une vraie documentation en franais, faite par lauteur du module : Philippe Ivaldi. On la trouve ici : svnweb.tuxfamily.org/listing.php ?repname=piprim/geometrydoc&path=/branches/fr/&#path_branches_fr_ Elle est extrmement complte. Il existe de plus un index cette adresse : http ://www.piprime.fr/les/asymptote/geometry/modules/geometry.asy.index.type.html Ce qui suit nest ni plus ni moins quun copi-coll dune toute petite partie de cette documentation dont la lecture est essentielle. 1. De nouveaux types dobjets sont dnis : coordsys : permet dutliser nimporte quel repre cartsien. point : quivalent au type pair dans le repre par dfaut. vector : aussi quivalent au type pair dans le repre par dfaut. mass : pour les barycentres. line : quelques objets de type line :
line line(point A, bool extendA=true, point B, bool extendB=true) Pour les droites, demi-droites (extendA=false ou extendB=false) et segments de droites (extendA=false et extendB=false). line line(coordsys R=currentcoordsys, real a, real b, real c) Renvoie la droite dquation ax + b y + c = 0 dans le repre R. line line(coordsys R=currentcoordsys, real slope, real origin) Renvoie la droite de pente slope et dordonne lorigine origin donns relativement au repre R. line parallel(point M, line l) Renvoie la droite parallle l passant par M. line parallel(point M, explicit vector dir) Renvoie la droite de vecteur directeur dir et passant par M. line parallel(point M, explicit pair dir) Renvoie la droite de vecteur directeur dir donn dans le repre courant currentcoordsys et passant par M. line line(real a, point A=point(currentcoordsys,(0,0)))
Renvoie la droite passant par A et faisant un angle de a degrs avec laxe des abscisses du repre dans lequel est dni A.
line bisector(line l1, line l2, real angle=0, bool sharp=true) Renvoie limage de la bissectrice de langle form par les droites orientes l1 et l2 par la rotation de centre lintersection de l1 et l2 et dangle angle. Si le paramtre sharp vaut true, renvoie la bissectrice de langle aigu. line sector(int n=2, int p=1, line l1, line l2, real angle=0, bool sharp=true) Renvoie limage de la p-ime droite qui partage langle form par les droites orientes l1 et l2 en n parties gales par la rotation de centre lintersection de l1 et l2 et dangle angle. Si le paramtre sharp vaut true, considre langle aigu. line perpendicular(point M, line l) Renvoie la droite perpendiculaire l passant par M. line perpendicular(point M, explicit vector normal) Renvoie la droite passant par M et de vecteur normal normal. line perpendicular(point M, explicit pair normal) Renvoie la droite passant par M et de vecteur normal normal donn dans le repre courant currentcoordsys. line reverse(line l)
19
Asymptote
Dmarrage rapide
line extend(line l)
Renvoie la droite porte par l qui peut tre une demi-droite ou un segment de droite.
line complementary(explicit line l) Renvoie la demi-droite complmentaire de l. Ne fonctionne que si l reprsente effectivement une demi-droite.
segment :
line bisector(segment s, real angle=0) qui renvoie limage de la mdiatrice de s par la rotation de centre le milieu de s et dangle angle.
Ainsi que :
qui renvoie sous forme de tableau les deux demi-droites de support s et dextrmits respectives s.A et s.B. conic : pour une conique quelconque non dgnre. Les types drivs sont : circle, ellipse, parabola et hyperbola. De nombreuses routines permettent de dnir un cercle. Entre autres :
circle circle(explicit point C, real r) Renvoie le cercle de centre C et de rayon r. circle circle(point A, point B) Renvoie le cercle de diamtre AB. circle circle(point A, point B, point C) Renvoie le cercle passant par les points distincts A, B et C.
Etc. (Voir la documentation) arc : pour les arcs orients dellipses.
arc arc(ellipse el, real angle1, real angle2, polarconicroutine polarconicroutine=polarconicroutine(el), bool direction=CCW) abscissa : pour instancier une abscisse sur un objet de type line, segment, conic et arc.
triangle : structure assez complexe bnciant de nombreuses routines. Encore une fois, le minimum sera vu ici, la lecture de la documentation est essentielle.
struct triangle { restricted point A, B, C; struct vertex { int n; triangle t; } restricted vertex VA, VB, VC; struct side { int n; triangle t; }
side AB, BC, CA, BA, AC, CB; } // les cts du triangle void label(picture pic=currentpicture, Label LA="$A$", Label LB="$B$", Label LC="$C$", triangle t, real alignAngle=0, real alignFactor=1, pen p=nullpen, filltype filltype=NoFill)
20
Asymptote
Dmarrage rapide
Place les labels LA, LB et LC aux sommets du triangle t, aligns suivant la premire bissectrice du sommet correspondant. Les paramtres alignAngle et alignFactor permettent de modier la direction et la longueur de lalignement.
void show(picture pic=currentpicture, Label LA="$A$", Label LB="$B$", Label LC="$C$", Label La="$a$", Label Lb="$b$", Label Lc="$c$", triangle t, pen p=currentpen, filltype filltype=NoFill) Trace le triangle t et afche les labels aux sommets du triangle ainsi que les longueurs de ses cts. Cette routine est surtout utile pour localiser les sommets t.A, t.B et t.C en cours de codage. void draw(picture pic=currentpicture, triangle t, pen p=currentpen, marker marker=nomarker) Trace le triangle t ; les cts sont tracs comme des segments. void drawline(picture pic=currentpicture, triangle t, pen p=currentpen) Trace le triangle t ; les cts sont tracs comme des droites. triangle triangle(point A, point B, point C) Renvoie le triangle dont les sommets sont A, B et C. triangle triangleabc(real a, real b, real c, real angle=0, point A=(0,0)) # Retourne le triangle ABC tel que BC=a, AC=b, AB=c et # ; AB =angle. triangle triangleAbc(real alpha, real b, real c, real angle=0, point A=(0,0)) # # # Retourne le triangle ABC tel que AB ; AC =alpha, AC=b, AB=c et # ; AB =angle. triangle triangle(line l1, line l2, line l3) Renvoie le triangle dont les cts sont l1, l2 et l3.
Et de nombreuses autres routines permettant de tracer lorthocentre, les hauteurs, le centre de gravit, les mdianes, etc. trilinear : instancie des coordonnes trilinaires relatives un triangle (sic). inversion : permet dinstancier linversion de ple C et de puissance k.
transform scale(real k, point M) Homothtie de centre M et de rapport k. transform scale(real k, line l1, line l2, bool safe=false) Renvoie lafnit de rapport k, daxe l1 et de direction l2. Si safe vaut true et l1 parallle l2, la routine renvoie lidentit. transform projection(point A, point B)
Projection orthogonale sur la droite (AB).
transform projection(line l)
Renvoie la projection orthogonale sur l.
Asymptote
Dmarrage rapide
transform scaleO(real x)
Homothtie de rapport x et de centre lorigine du repre courant . Cette transformation est identique
transform yscaleO(real x)
Identique yscale(x, origin()).
transform reflect(line l)
Renvoie la rexion par rapport l. 3. geometry introduit aussi des fonctions de marquage :
void distance(picture pic=currentpicture, Label L="", point A, point B, bool rotated=true, real offset=3mm, pen p=currentpen, pen joinpen=invisible, arrowbar arrow=Arrows(NoFill)) void markrightangle(picture pic=currentpicture, point A, point O, point B, real size=0, pen p=currentpen, margin margin=NoMargin, filltype filltype=NoFill) void perpendicularmark(picture pic=currentpicture, point z, explicit pair align, explicit pair dir=E, real size=0,
22
Asymptote
Dmarrage rapide
pen p=currentpen, margin margin=NoMargin, filltype filltype=NoFill) void perpendicularmark(picture pic=currentpicture, point z, vector align, vector dir=E, real size=0, pen p=currentpen, margin margin=NoMargin, filltype filltype=NoFill) void perpendicularmark(picture pic=currentpicture, point z, explicit pair align, path g, real size=0, pen p=currentpen, margin margin=NoMargin, filltype filltype=NoFill) void perpendicularmark(picture pic=currentpicture, point z, vector align, path g, real size=0, pen p=currentpen, margin margin=NoMargin, filltype filltype=NoFill) path compassmark(pair O, pair A, real position, real angle=10)
Pour compassmark, voir aussi page 53.
void addMargins(picture pic=currentpicture, real lmargin=0, real bmargin=0, real rmargin=lmargin, real tmargin=bmargin, bool rigid=true, bool allObject=true)
Pour le trac des droites, ajoute des marges limage (remplace avantageusement interp, voir page 12). Si rigid vaut false, les marges sont ajoutes si et seulement si une courbe innie se prolonge jusqu la marge. Si allObject vaut false, les objets de taille xe (comme les labels et pointes de ches) seront ignors.
Quelques exemples :
23
Asymptote
Dmarrage rapide
C A A B
CODE 48
F E
G B
M
CODE 47
import geometry; size(7cm); real ac=3, am=2, coef=am/ac; triangle t=triangleAbc(40,ac,4); drawline(t); label("$A$",t.A,NW); label("$B$",t.B,NE); label("$C$",t.C,2N); point M=relpoint(line(t.AC),-coef); line par=parallel(M,t.BC); draw(par); point pN=intersectionpoint(par,t.AB); label("$M$",M,2*S); label("$N$",pN,N+.5*E); addMargins(1cm,.5cm);
import geometry; size(6cm); triangle t=triangleabc(4,5,6); label(t); draw(t,linewidth(bp)); point pE=midpoint(t.AB), pF=t.A+(1/3)*(t.C-t.A), pG=t.B+(1/3)*(t.C-t.B); dot("$E$",pE,-dir(t.VC)); dot("$F$",pF,-dir(t.VB)); dot("$G$",pG,-dir(t.VA)); draw(segment(t.AB), StickIntervalMarker(2,2,angle=-35)); draw(t.C--pE^^t.B--pF^^t.A--pG); line CE=line(t.C,pE); line AG=line(t.A,pG); dot(intersectionpoint(CE,AG));
24
Asymptote
Dmarrage rapide
A A B B
CODE 49
import geometry; unitsize(.5cm); add(shift(-6,-6)*grid(15,15,linetype("4 4"))); point A=(1,-1), B=(-2,-5), C=(8,-2); line axe=line(origin(),45); triangle t=triangle(A,B,C); triangle t2=reflect(axe)*t; draw(axe,bp+.8*red); draw(t,linewidth(bp)); draw(t2,bp+purple); label(t,alignAngle=-30); label(LA="$A$",LB="$B$",LC="$C$", t2,alignAngle=30); pen db=dashed+blue; draw(t.A--t2.A,db, StickIntervalMarker(2,1,angle=35,blue)); draw(t.B--t2.B,db, StickIntervalMarker(2,2,angle=35,blue)); draw(t.C--t2.C,db, StickIntervalMarker(2,3,angle=35,blue)); transform paxe=projection(axe); point v=relpoint(axe,-1); markrightangle(t2.C,paxe*t2.C,v,2mm,darkgreen); markrightangle(t2.A,paxe*t2.A,v,2mm,darkgreen); markrightangle(t2.B,paxe*t2.B,v,2mm,darkgreen); shipout(bbox(1mm,invisible));
C 4 cm
6
E D
6 6 cm
C
CODE 50
import geometry; unitsize(1cm); point point point point A=(0,0); B=relpoint(line(30,A),4); C=relpoint(line(-30,A),6); D=(B.x,0), pE=(C.x,0);
draw(A--B^^A--C,linewidth(bp)); draw(B--D^^pE--C); draw(Ox,linewidth(bp)); markrightangle(B,D,A); markrightangle(A,pE,C); markangle("$\frac\pi6$",D,A,B,ArcArrow); markangle("$-\frac\pi6$",C,A,D,BeginArcArrow); distance("$4$~cm",A,B,rotated=false,-4mm); distance("$6$~cm",A,C,rotated=false,4mm); dot("$A$",A,S+2W); dot("$B$",B); dot("$C$",C); dot("$D$",D,S); dot("$E$",pE,N);
25
Asymptote
Dmarrage rapide
3 5
2 3
C
45
30
1 3
1 2
3 4
O E H
CODE 51
size(8cm); import geometry; usepackage("fourier"); void filldrawtri(triangle t, pen fpen=currentpen, pen dpen=currentpen) { filldraw(t.A--t.B--t.C--cycle,fpen,dpen); } point A=(0,0),B=(3,0),C=(1,2.5),pI=(A.x,C.y); point D=(4,0),pE=(7,0),G=(8.5,2.5),F=(G.x,0); point H=projection(A,B)*C; triangle t1=triangle(A,B,C); triangle t2=triangle(D,pE,G); filldrawtri(t1,lightgreen,linewidth(bp)); filldrawtri(t2,lightred,linewidth(bp)); draw(C--H^^pE--F^^G--F,dashed); markrightangle(C,H,A,3mm); markrightangle(G,F,D,3mm); distance("$\frac{1}{3}$",A,H,4mm, Arrows(1mm,NoFill)); distance("$\frac{1}{2}$",H,B,4mm); distance("$\frac{3}{5}$",A,pI, rotated=false,-2mm); distance("$\frac{3}{4}$",D,pE,4mm); distance("$\frac{2}{3}$",F,G,rotated=false);
B
CODE 52
import geometry; usepackage("fourier","upright"); usepackage("mathrsfs"); size(6cm); triangle t=triangleAbc(75,7,8.5,225); point H=foot(t.VA); circle c=circle(t.A,H); point[] ct=intersectionpoints(t,c); draw(t,heavyblue); draw(t.A--H); draw(c,red); draw(ct[0]--ct[3],deepgreen); label(t,heavyblue);dot("$O$",c.C,W); label("$\mathscr{C}$",angpoint(c,50),NE,red); label("$H$",H,NW); label("$D$",ct[0],NW,deepgreen); label("$E$",ct[3],E,deepgreen); markrightangle(t.A,H,t.C); markangle(scale(.8)*"$45^\circ$",5mm, t.B,t.A,H); markangle(scale(.8)*"$30^\circ$",n=2,6mm, H,t.A,t.C);
26
Asymptote
Dmarrage rapide
H B I G O A C2 C1
dro er Eul it e d
CODE 53
import geometry; usepackage("fourier","upright"); usepackage("mathrsfs"); size(10cm); pen mediane=brown, bissec=heavymagenta, mediat=deepcyan, ortho=deepgreen; // ---------------------------------------------------------------------triangle t=triangleabc(5,4,6); drawline(t); label(t); // ---------------------------------------------------------------------line med=median(t.VA); point A1=midpoint(t.BC); point G=centroid(t); draw(med,mediane); dot("$A$",A1,N+.5*E,mediane); dot("$G$",G,S,mediane); // ---------------------------------------------------------------------line biss=bisector(t.VC); point Bi=bisectorpoint(t.AB); point Ci=incenter(t); circle ci=incircle(t); draw(biss,bissec); draw(ci,bissec); dot("$C_1$",Bi,SE,bissec); dot("$I$",Ci,N+.5*E,bissec); // ---------------------------------------------------------------------line mediatrice=bisector(t.AC); point B1=midpoint(t.AC); point Cc=circumcenter(t); circle cc=circle(t); draw(mediatrice,mediat); draw(cc,mediat); dot("$B$",B1,N,mediat); dot("$O$",Cc,E+.5*N,mediat); // ---------------------------------------------------------------------line haut=altitude(t.VC); point C2=foot(t.VC); point orth=orthocentercenter(t); draw(haut,ortho); dot("$C_2$",C2,SW,ortho); dot("$H$",orth,SW,ortho); // ---------------------------------------------------------------------draw(line(orth,Cc),dashdotted); label(Label("droite dEuler",Rotate(dir(orth--Cc)),align=RightSide), relpoint(line(orth,Cc),1.7)); // ---------------------------------------------------------------------addMargins(.5cm,.5cm);
27
Asymptote
Dmarrage rapide
3 ) trembling
Ce module permet de faire des gures main leve . Plusieurs paramtres permettent de modier leffet :
magnetizePoints=false
magnetizePoints=true
CODE 54
import trembling; startTrembling(angle=6,frequency=1, random=5,magnetizePoints=false); size(5cm,0); pair A=(0,0), B=(3,0), C=(0,2), O=midpoint(B--C); path t=B--A--C--cycle; path c=circle(O,sqrt(13)/2); draw(t,blue); dot(A^^B^^C); draw(c); markrightangle(B,A,C,bp+darkmagenta, filltype=Fill(Yellow)); label(scale(.7)*"magnetizePoints=false", C,5E,.8red);
CODE 55
import trembling; startTrembling(angle=6,frequency=1, random=5,magnetizePoints=true); size(5cm,0); pair A=(0,0), B=(3,0), C=(0,2), O=midpoint(B--C); path t=B--A--C--cycle; path c=circle(O,sqrt(13)/2); draw(t,blue); dot(A^^B^^C); draw(c); markrightangle(B,A,C,bp+darkmagenta, filltype=Fill(Yellow)); label(scale(.7)*"magnetizePoints=true", C,5E,.8red);
Asymptote
Dmarrage rapide
2. Versions dasymptote partir de la 2.10 : Tout dabord, geometry nest plus import par trembling. Ensuite, une nouvelle structure fait son apparition :
CODE 56
import trembling; import geometry; size(5cm,0); pair A=(0,0), B=(3,0), C=(0,2), O=midpoint(B--C); path t=B--A--C--cycle; // paramtres par dfaut tremble tr=tremble(angle=4, frequency=.5, random=2); draw(tr.deform(t),blue); path c=circle(O,sqrt(13)/2); draw(c); markrightangle(B,A,C,bp+darkmagenta, filltype=Fill(Yellow));
CODE 57
import trembling; import geometry; size(5cm,0); pair A=(0,0), B=(3,0), C=(0,2), O=midpoint(B--C); path t=B--A--C--cycle; tremble tr=tremble(angle=10, frequency=.5, random=2); draw(tr.deform(t),blue); path c=circle(O,sqrt(13)/2); draw(c); markrightangle(B,A,C,bp+darkmagenta, filltype=Fill(Yellow));
Les points qui doivent tre magntiss sont donner en paramtre deform :
29
Asymptote
Dmarrage rapide
magneticPoints
CODE 59
import trembling; import geometry; tremble tr=tremble(angle=6, frequency=1, random=5); size(5cm,0); pair A=(0,0), B=(3,0), C=(0,2), O=midpoint(B--C); path t=B--A--C--cycle; path c=circle(O,sqrt(13)/2); draw(tr.deform(t),blue); dot(A^^B^^C); // A, B et C "magntiss" : draw(tr.deform(c,A,B,C)); markrightangle(B,A,C,bp+darkmagenta, filltype=Fill(Yellow)); label(scale(.7)*"magneticPoints", C,9E,.8red);
CODE 58
import trembling; import geometry; tremble tr=tremble(angle=6, frequency=1, random=5); size(5cm,0); pair A=(0,0), B=(3,0), C=(0,2), O=midpoint(B--C); path t=B--A--C--cycle; path c=circle(O,sqrt(13)/2); draw(tr.deform(t),blue); dot(A^^B^^C); draw(tr.deform(c)); markrightangle(B,A,C,bp+darkmagenta, filltype=Fill(Yellow));
30
Asymptote
Dmarrage rapide
4 ) graph
La documentation ofcielle est trs complte sur ce module. Ce qui suit est un rsum de ce qui sera le plus utile dans un premier temps. a ) Axes et repres
graph fournit les routines suivantes : void xaxis(picture pic=currentpicture, Label L="", axis axis=YZero, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, bool above=false);
Dessine laxe des abscisses. Certains paramtres mritent de sy attarder : axis : dtermine la position de laxe. Les diffrents types sont : YZero(bool extend=true) : laxe a pour quation y = 0 (ou y = 1 pour une chelle logarithmique). extend=true (valeur par dfaut) pour que laxe soit aux dimensions compltes de la gure. YEquals(real Y, bool extend=true) : laxe a pour quation y = Y. (Voir plutt yequals.) Bottom(bool extend=false) : laxe est au bas de la gure. Top(bool extend=false) : laxe est en haut. BottomTop(bool extend=false) : axes en bas et en haut. xmin et xmax : automatiquement dtermins par les dimensions de la gure si non spcis. ticks : les traits de graduation. Les valeurs sont NoTicks (par dfaut, aucune graduation), LeftTicks (graduations uniquement gauche de laxe), RightTicks (graduations uniquement droite de laxe) et Ticks (graduations des deux cots de laxe). Ces trois dernires routines prennent elles-mmes de nombreux arguments en option :
ticks Ticks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, int N=0, int n=0, real Step=0, real step=0, bool begin=true, bool end=true, tickmodifier modify=None, real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen);
format : format des nombres sur les axes (par dfaut "$%.4g$", voir page 15). Pour navoir que les traits, sans les labels, la valeur est "%". ticklabel : fonction string(real x) qui retourne le label (par dfaut format(format.s,x)) de chaque graduation principale dabscisse x. Voir par exemple labelfrac page 42 et le code 75. le ticklabel OmitFormat(string s=defaultformat ... real[] x) permet denlever certains labels, mais pas la graduation correspondante. NoZeroFormat est une abrviation pour OmitFormat(0). beginlabel et endlabel : inclut le premier et le dernier label. N : Quand la mise lchelle est active (par dfaut), laxe est divis en N intervalles spars par les graduations principales. n : Chaque intervalle principal est divis en n intervalles secondaires spars par les graduations secondaires. Step : la valeur entre chaque trait de graduation principale (si N=0). step : la valeur entre chaque trait de graduation secondaire (si n=0). begin et end : inclut le premier et le dernier trait de graduation principale. tickmodifier modify : fonction permettant de modier des graduations manuellement . Certains tickmodifier sont prdnis : OmitTick(... real[] x), OmitTickInterval(real a, real b) et OmitTickIntervals(real[] a, real[] b) peuvent servir enlever des graduations, ainsi que leurs labels. NoZero est une abrviation pour OmitTick(0). Size et size : taille des graduations principales et secondaires.
31
Asymptote
Dmarrage rapide
extend : tend les graduations. Permet de tracer des grilles. pen pTick et ptick : stylos pour le trac des traits de graduation.
3
CODE 60
x
CODE 61
import graph; unitsize(1cm); xaxis(L="$x$", axis=YZero, xmin=-3, xmax=3, p=bp+blue, ticks=LeftTicks(ticklabel=OmitFormat(1), endlabel=false,Step=1,step=.5, end=false,modify=OmitTick(-2), pTick=bp+red,ptick=bp+.8green), arrow=Arrow);
import graph; unitsize(1cm); real[] tabT={-2,0,1}, tabt={-1.5,-.5,.5}; xaxis(L="$x$", axis=YZero(extend=true), xmin=-3, xmax=3, p=bp+blue, ticks=Ticks(Ticks=tabT, ticks=tabt, pTick=bp+red,ptick=bp+.8green), arrow=Arrow, above=false);
Il est aussi possible de spcier lemplacement des graduations laide dun tableau de rels laide de la routine (voir le code 61, valable aussi pour LeftTicks et RightTicks) :
ticks Ticks(Label format="", ticklabel ticklabel=null, bool beginlabel=true, bool endlabel=true, real[] Ticks, real[] ticks=new real[], real Size=0, real size=0, bool extend=false, pen pTick=nullpen, pen ptick=nullpen)
De la mme faon quxaxis est dni :
void yaxis(picture pic=currentpicture, Label L="", axis axis=XZero, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, arrowbar arrow=None, bool above=false, bool autorotate=true);
Les paramtres sont similaires ceux dxaxis. On notera pour le type axis les valeurs Left, Right et LeftRight. Il est possible de xer les valeurs xmin, xmax, ymin et ymax par la routine :
32
Asymptote
Dmarrage rapide
3 2 y 1 0 2
CODE 62
import graph; unitsize(1cm); xaxis(L="$x$", axis=YZero, xmin=-3, xmax=3, p=bp+blue, ticks=Ticks(endlabel=false, beginlabel=false, Step=1,step=.5, end=false,pTick=bp+red, ptick=bp+.8green), arrow=Arrow); yaxis(L="$y$", axis=LeftRight, ymin=-1, ymax=3, p=bp+purple, ticks=Ticks(beginlabel=false, Step=1,step=.25, pTick=bp+red, ptick=bp+.8green), arrow=Arrow);
3 2 y 1 0 1 0 1 2 x 1
CODE 63
import graph; unitsize(1cm); xlimits(-3, 3); ylimits(-1, 3); xaxis(L="$x$", axis=BottomTop,p=bp+blue, ticks=Ticks(Step=1,step=.5,extend=true, pTick=bp+red, ptick=bp+dotted+.8green), arrow=Arrow); yaxis(L="$y$", axis=LeftRight,p=bp+purple, ticks=Ticks(Step=1,step=.5,extend=true, pTick=bp+red, ptick=bp+dotted+.8green), arrow=Arrow);
0 x
void xequals(picture pic=currentpicture, Label L="", real x, bool extend=false, real ymin=-infinity, real ymax=infinity, pen p=currentpen, ticks ticks=NoTicks, bool above=true, arrowbar arrow=None);
void yequals(picture pic=currentpicture, Label L="", real y, bool extend=false, real xmin=-infinity, real xmax=infinity, pen p=currentpen, ticks ticks=NoTicks, bool above=true, arrowbar arrow=None);
et
void axes(picture pic=currentpicture, Label xlabel="", Label ylabel="", pair min=(-infinity,-infinity), pair max=(infinity,infinity), pen p=currentpen, arrowbar arrow=None, bool above=false);
Voir le code 67. Dans cet exemple, les axes sont tracs dans une image spare, qui est ajoute currentpicture la n.
33
Asymptote
Dmarrage rapide
y 55 54 53
CODE 65
y 1 O 1 x
52 17
CODE 64
import graph; unitsize(1cm); xlimits(17,23); ylimits(52,55); xequals(pic=currentpicture,L="$y$",x=17, ticks=Ticks(Step=1,step=.5,end=false), arrow=Arrow(HookHead)); yequals(pic=currentpicture,L="$x$",y=52, ticks=Ticks(Step=1,step=.5,end=false), arrow=Arrow(HookHead));
18
19
20
21
22
23 x
import graph; unitsize(x=1cm, y=.5cm); xlimits(-1, 5); ylimits(-2, 2); xaxis(BottomTop, Ticks("%",extend=true, pTick=linewidth(.5pt), ptick=dotted)); yaxis(LeftRight, Ticks("%",extend=true, pTick=linewidth(.5pt), ptick=dotted)); xequals(Label("$y$",align=2NW), 0, p=linewidth(bp), Arrow(2mm)); yequals(Label("$x$",align=2SE), 0, p=linewidth(bp), Arrow(2mm)); labelx(Label("$1$",UnFill), 1); labely(Label("$1$",UnFill), 1); dot("$O$",(0,0),2SW);
y 3 2 1 O
CODE 66
Y 1 A 1 2 3 1 4 5 X
y 3 2 1 O x
CODE 67
Y 1 A 1 2 3 1 4 5 X
import graph; unitsize(1cm); xlimits(-1,6); ylimits(-1,3); xaxis(L="$x$", p=bp+blue, ticks=Ticks(NoZero,endlabel=false, beginlabel=false,Step=1,step=.5, begin=false,end=false), arrow=Arrow(TeXHead)); yaxis(L="$y$", p=bp+blue, ticks=Ticks(NoZero,beginlabel=false, Step=1,step=.5, begin=false,end=false), arrow=Arrow(TeXHead)); labelx("$O$",0,2*SW,blue); xequals(pic=currentpicture,L="$Y$",x=3, p=brown+dashed,ticks=NoTicks, arrow=Arrow(HookHead)); yequals(pic=currentpicture,L="$X$",y=1, p=brown+dashed,ticks=NoTicks, arrow=Arrow(HookHead)); labelx("$A$",(3,1),2*SW,brown); xtick("$1$",(4,1),size=1mm,brown); xtick(dir=S,(4,1),size=1mm,brown); ytick("$1$",(3,2),size=1mm,brown); ytick(dir=W,(3,2),size=1mm,brown);
import graph; unitsize(1cm); xlimits(-1,6); ylimits(-1,3); xaxis(L="$x$", p=bp+purple, ticks=Ticks(NoZero,endlabel=false, beginlabel=false,Step=1,step=.5, begin=false,end=false), arrow=Arrow(TeXHead)); yaxis(L="$y$", p=bp+purple, ticks=Ticks(NoZero,beginlabel=false, Step=1,step=.5, begin=false,end=false), arrow=Arrow(TeXHead)); labelx("$O$",0,2*SW,purple); picture pic; unitsize(pic,1cm); axes(pic, xlabel="$X$", ylabel="$Y$", min=(-4,-2), max=(3,2),p=dashed+red, arrow=Arrow(HookHead)); labelx(pic,"$A$",(0,0),2*SW,red); xtick(pic,"$1$",1,size=1mm,red); xtick(pic,dir=S,1,size=1mm,red); ytick(pic,"$1$",1,size=1mm,red); ytick(pic,dir=W,1,size=1mm,red); add(pic.fit(),(3,1));
34
Asymptote
Dmarrage rapide
Les routines suivantes permettent de placer manuellement des graduations (voir les exemples page prcdente) :
void xtick(picture pic=currentpicture, Label L="", explicit pair z, pair dir=N, string format="", real size=Ticksize, pen p=currentpen); void xtick(picture pic=currentpicture, Label L="", real x, pair dir=N, string format="", real size=Ticksize, pen p=currentpen);
De la mme faon que xtick est dni ytick.
void tick(picture pic=currentpicture, pair z, pair dir, real size=Ticksize, pen p=currentpen); void labelx(picture pic=currentpicture, Label L="", explicit pair z, align align=S, string format="", pen p=nullpen); void labelx(picture pic=currentpicture, Label L="", real x, align align=S, string format="", pen p=nullpen); void labelx(picture pic=currentpicture, Label L, string format="", explicit pen p=currentpen);
De la mme faon que labelx est dni labely. b ) Reprsentations de fonctions Plusieurs routines permettent de dnir un graphe. Seules les plus utiles pour dbuter seront vues (voir la documentation ofcielle pour les autres).
guide graph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --); Retourne le graphe de la fonction f sur lintervalle [T(a) ; T(b)], bas sur n points (100 par dfaut) rgulirement espacs
dans [a ; b].
anguina e
(ou cubique serpentine)
y y=
1
4x x2 +1
O 1
CODE 68
import graph; unitsize(1cm); xaxis("$x$", Ticks(scale(.7)*Label(), NoZero),Arrow(2mm)); yaxis("$y$", Ticks(scale(.7)*Label(), NoZero, beginlabel=false, endlabel=false, begin=false, end=false), Arrow(2mm)); labelx(scale(.7)*"$O$",0,SW); real f(real x) {return 4*x/(x^2+1);} draw(graph(f,-5.5,5.5),bp+purple); label("$y=\frac{4x}{x^2+1}$",(4,f(4)),1.5N,purple); label("anguin\ea",(-3.5,1.5),purple); label(scale(.8)*"(ou cubique serpentine)",(-3.5,1),purple);
35
Asymptote
Dmarrage rapide
guide graph(picture pic=currentpicture, real x(real), real y(real), real a, real b, int n=ngraph, real T(real)=identity, interpolate join=operator --);
Retourne la courbe paramtre x(t ) ; y(t ) pour t dans lintervalle [T(a) ; T(b)].
y
2 1
O 1 2
CODE 69
import graph; unitsize(1cm); usepackage("inputenc","utf8"); usepackage("icomma"); xaxis("$x$", Ticks(scale(.7)*Label(), NoZero),Arrow(2mm)); yaxis("$y$", Ticks(scale(.7)*Label(), NoZero, beginlabel=false, endlabel=false, begin=false, end=false), Arrow(2mm)); labelx(scale(.7)*"$O$",0,SW); real x(real t) {return 2*cos(t)+1.5*cos(2*t);} real y(real t) {return 2*sin(t)-1.5*sin(2*t);} pen pg=royalblue; draw(graph(x,y,0,2*pi),bp+pg); label(scale(.6)*"$x(t)=2\cos(t)+1,5\cos(2t)$",(1.8,-2),1.5N,pg); label(scale(.6)*"$y(t)=2\sin(t)-1,5\sin(2t)$",(1.8,-2),pg);
guide polargraph(picture pic=currentpicture, real f(real), real a, real b, int n=ngraph, interpolate join=operator --); Retourne le graphe de la fonction f en coordonnes polaires sur lintervalle [a ; b].
36
Asymptote
Dmarrage rapide
nphro de Freeth e de
r = 1 + 2 sin (/2)
CODE 70
import graph; size(6cm); usepackage("inputenc","utf8"); xaxis(Ticks("%", NoZero, Step=1, step=.5), Arrow(2mm)); yaxis(Ticks("%", NoZero, Step=1, step=.5), Arrow(2mm)); labelx(scale(.7)*"$O$",0,SW); real r(real t) {return 1+2*sin(t/2);} pen pg=deepmagenta; draw(polargraph(r,0,4*pi,n=400),bp+pg); label(scale(.8)*"$r=1+2\sin\left(\theta/2\right)$",(-1.5,-1),pg); label("nphrode de Freeth",(-.5,1.3),pg);
Remarque : Fonctions non dnies en certaines valeurs Deux possibilits ici : 1. enlever les valeurs interdites : pour lexemple, considrons la fonction f : x 1 . x 2 4x + 3 Cette fonction est dnie sur R \ {1 ; 3}. La courbe sera dcoupe en trois graphes, c1, c2 et c3 qui viteront soigneusement les valeurs 1 et 3.
37
Asymptote
y 2
Dmarrage rapide
Cf
1
O 1 2
6 x
CODE 71
import graph; import contour; usepackage("mathrsfs"); unitsize(x=1cm,y=1cm); transform ec=scale(.8); xaxis(ec*"$x$", Ticks(ec*Label(), NoZero), Arrow(2mm)); yaxis(ec*"$y$", Ticks(ec*Label(), NoZero), Arrow(2mm)); labelx(ec*"$O$",0,SW); real f(real x) {return -1/(x^2-4*x+3);} path c1=graph(f,-2.8,.9); // on vite les valeurs path c2=graph(f,1.1,2.9); // interdites path c3=graph(f,3.1,6.8); // draw(c1^^c2^^c3,bp+heavyred); ylimits(-2.9,2.9,Crop); // on coupe ce qui dpasse label("$\mathscr{C}_f$",(3,1.5),heavyred);
2. utiliser le module contour et tracer la courbe comme une ligne de niveau. On utilise la routine suivante :
guide[][] contour(real f(real, real), pair a, pair b, real[] c, int nx=ngraph, int ny=nx, interpolate join=operator--, int subsample=1)
f : fonction de deux variables relles. a et b : les sommets de la diagonale du domaine rectangulaire. c : tableau contenant les valeurs des lignes de niveau. nx et ny : nombre de subdivisions dans les directions x et y (dtermine la prcision). join : loprateur dinterpolation (-- ou ..). subsample : nombre de points intrieurs inclure dans chaque carr de la grille (en plus des points sur le bord).
38
Asymptote
y 2
Dmarrage rapide
Cf
1
O 1 2
6 x
CODE 72
import graph; import contour; usepackage("mathrsfs"); unitsize(x=1cm,y=1cm); transform ec=scale(.8); xaxis(ec*"$x$", Ticks(ec*Label(), NoZero), Arrow(2mm)); yaxis(ec*"$y$", Ticks(ec*Label(), NoZero), Arrow(2mm)); labelx(ec*"$O$",0,SW); real F(real x, real y) {return y*(x^2-4*x+3);} draw(contour(F,(-2.8,-2.9),(6.8,2.9),new real[] {-1}),bp+deepcyan); label("$\mathscr{C}_f$",(3,1.5),deepcyan);
Voir aussi le code 73 c ) Extension graph_pi Cette extension de Philippe Ivaldi apporte bon nombre doutils intressants. Elle peut tre tlcharge cette adresse : git.piprime.fr/ ?p=asymptote/pi-packages.git ;a=summary, lien snapshot, et place dans le dossier $HOME/.asy. Pour une utilisation avec git, voir : forum.mathematex.net/asymptote-f34/version-2-10-et-graph-pi-t13226.html#p127606. Les modules graph, markers et base_pi (voir ladresse ci-dessus) sont chargs par graph_pi, ainsi que le package A LTEX mathrsfs. Axes et repres :
void graphicrules(picture pic=currentpicture, real unit=1cm, real xunit=unit != 0 ? unit : 0, real yunit=unit != 0 ? unit : 0, real xmin=-infinity, real xmax=infinity, real ymin=-infinity, real ymax=infinity, bool crop=NoCrop, bool xcrop=crop, bool ycrop=crop) Passe les dimensions du graphique cartesianaxis, grid, et millimeterpaper (voir ci-aprs).
void cartesianaxis(picture pic=currentpicture, Label Lx=Label("$x$",align=2S), Label Ly=Label("$y$",align=2W), real xmin=-infinity, real xmax=infinity,
39
Asymptote
Dmarrage rapide
real ymin=-infinity, real ymax=infinity, real extrawidth=1, real extraheight=extrawidth, pen p=currentpen, ticks xticks=Ticks("%",pTick=nullpen, ptick=grey), ticks yticks=Ticks("%",pTick=nullpen, ptick=grey), bool viewxaxis=true, bool viewyaxis=true, bool above=true, arrowbar arrow=Arrow) Trace laxe des abscisses, des ordonnes ou les deux (viewxaxis et viewyaxis qui prennent les valeurs true ou false). extrawidth est la longueur rajoute laxe des abscisses par rapport xmin et xmax. On a la mme chose avec extraheight pour laxe des ordonnes.
y cos x x
y=
12
12
CODE 73
import graph_pi; import contour; graphicrules(xunit=.5cm, yunit=2cm, xmin=-14.8, xmax=14.8, ymin=-1.9, ymax=1.9); cartesianaxis(extrawidth=0,xticks=Ticks(NoZero), yticks=Ticks(NoZero), Arrow(2mm)); labelx("$O$",0,SW); real F(real x, real y) {return x*y-cos(x);} draw(contour(F,(-14.8,-1.9),(14.8,1.9),new real[] {0}),bp+darkgreen); label("$y=\displaystyle\frac{\cos x}{x}$",(3,1),darkgreen);
void labeloij(picture pic=currentpicture, Label Lo=Label("$O$",NoFill), Label Li=Label("$\overrightarrow{\imath}$",NoFill), Label Lj=Label("$\overrightarrow{\jmath}$",NoFill), pen p=scale(2)*currentpen, pair diro=SW, pair diri=labelijmargin*S, pair dirj=labelijmargin*1.5*W, filltype filltype=NoFill, arrowbar arrow=Arrow(2mm), marker marker=dot) Trace le repre O ; # , # .
40
Asymptote
Dmarrage rapide
void labeloIJ(picture pic=currentpicture, Label Lo=Label("$O$",NoFill), Label LI=Label("$I$",NoFill), Label LJ=Label("$J$",NoFill), pair diro=SW, pair dirI=labelIJmargin*S, pair dirJ=labelIJmargin*W, pen p=currentpen, filltype filltype=NoFill, marker marker=dot)
Trace le repre O ; I , J .
void grid(picture pic=currentpicture, real xmin=pic.userMin.x, real xmax=pic.userMax.x, real ymin=pic.userMin.y, real ymax=pic.userMax.y, real xStep=1, real xstep=.5, real yStep=1, real ystep=.5, pen pTick=currentpen, pen ptick=grey, bool above=false)
Trace une grille.
y Cubique dAgnesi 1 O
CODE 74
import graph_pi; graphicrules(xunit=1cm, yunit=2cm, xmin=-5, xmax=5, ymin=0, ymax=1.5); grid(ptick=dotted); cartesianaxis(xticks=Ticks("%"), yticks=Ticks(NoZero,Step=1,step=.5), Arrow(2mm)); labeloij(); real f(real x) {return 1/(1+x^2);} draw(graph(f), bp+fuchsia); label("$y=\displaystyle\frac{1}{1+x^2}$",(1,f(1)),NE,fuchsia); label("Cubique dAgnesi",(-3,1.2),fuchsia);
y=
1 1 + x2
picture millimeterpaper(picture pic=currentpicture, pair O=(0,0), real xmin=infinity, real xmax=infinity, real ymin=infinity, real ymax=infinity, pen p=.5bp+orange)
Grille sous forme de papier millimtr.
ticklabel labelfrac(real ep=1/10^5, real factor=1, string symbol="", bool signin=false, bool symbolin=true, bool displaystyle=false, bool zero=true)
41
Asymptote
Dmarrage rapide
Ce ticklabel permet dcrire les graduations sous forme de fractions. Attention, base_pi doit tre dans le dossier $HOME/.asy.
y 1 Cg : y = sin(x)
1 2
x 2 3 2 2 O 1 2 Cf : y = cos(x) 1
CODE 75
import graph_pi; marker croix=marker(scale(4)*rotate(45)*cross(4),linewidth(bp)); pen bpd=bp+brown+linetype("4 4"); graphicrules(xunit=1cm, yunit=3cm, xmin=-6.5, xmax=6.5, ymin=-1.17, ymax=1.17); add(millimeterpaper(p=1bp+orange),(0,0)); labeloij(Lj=Label("")); cartesianaxis(Lx=Label("$x$",align=2N),extrawidth=0, xticks=Ticks(Label(Fill(white)), labelfrac(factor=pi,symbol="\pi",symbolin=true, zero=false),Step=pi/2, step=pi/4), yticks=Ticks(Label(Fill(white)), labelfrac(zero=false),Step=.5)); // Dfinition des fonctions real f(real x) {return cos(x);} real g(real x) {return sin(x);} // Trac de courbe draw(graph(f),bp+blue); draw(graph(g),bpd); // Points sur les courbes real l=-2pi; for(int i=0; i<17; ++i) { draw((l,f(l)),croix); draw((l,g(l)),croix); l=l+pi/4; } label("$\mathscr{C}_f : y=\cos(x)$",(2.5,f(2.5)),W,blue); label("$\mathscr{C}_g : y=\sin(x)$",(2.5,g(2.5)),NE,brown);
2
3 2
Asymptote
Dmarrage rapide
bool labelalternate=false, string format="", int labelplace=onX, pen px=nullpen, pen py=nullpen, bool startonyaxis=false, arrowbar circuitarrow=None, marker automarker=marker(cross(4)), marker xaxismarker=nomarker, marker yaxismarker=nomarker, marker xmarker=nomarker, marker fmarker=nomarker)
Les options du graphique : L : le nom de la suite ( taper sans $). labelbegin : si la valeur est true, le premier terme est plac. labelend : mme chose pour le dernier terme. labelinner : si la valeur est true, les termes compris entre le premier et le dernier sont placs. labelalternate : si la valeur est true, les termes sont alterns par rapport laxe. format : le format dafchage de la valeur. Par exemple "%.2f" (2 chiffres aprs la virgule). labelplace : emplacement des termes : onX, onY, ou onXY. px et py : stylos pour les tracs des traits de lecture. startonyaxis : comme son nom lindique... circuitarrow : ches sur le circuit . Pour tous les marker, voir le code 77.
recursivegraph recursivegraph(real F(real), real u0, int n0=0, int n) Graphe de la suite : u0 est le premier terme, n0 est lindice du premier terme et n pour spcier le nombre de termes
placs sur le graphique (le dernier terme plac est celui dindice n 1).
void draw(picture pic=currentpicture, Label L="", recursivegraph g, recursiveroutime lr=DefaultRecursiveOption, align align=NoAlign, pen p=currentpen, arrowbar arrow=None, arrowbar bar=None, margin margin=NoMargin, Label legend="", marker marker=nomarker)
43
Asymptote
Dmarrage rapide
1 v1 0
CODE 76
import graph_pi; usepackage("amsmath"); graphicrules(xunit=1cm, yunit=1cm, xmin=-.4, xmax=8.9, ymin=-.4, ymax=7.9); cartesianaxis(extrawidth=0,xticks=Ticks("%"),yticks=Ticks("%")); label("$0$",(0,0),2*SW);labely("$1$",1,1.5W); real f(real x){return 2*sqrt(x)+1;} draw(graph(f,0,8.9,n=400),bp+purple); draw(graph(new real(real x){return x;},0,7.9),bp+red); draw(recursivegraph(f,u0=1,n0=1,n=6), recursiveoption(L="v", labelplace=onXY), bp+heavymagenta); label("$y=2\sqrt{x}+1$",(7.5,f(7.5)),3S,purple); label("$y=x$",(7,7),2W,red); label("$\left\{\begin{aligned}&v_1=1\\&v_{n+1}=2\sqrt{v_n}+1 \end{aligned}\right.$",(2.5,7));
v1
v2
v3 v4v5
44
Asymptote
Dmarrage rapide
y 3
y= 2
u0 = 3,5 1 u un+1 = n + 2 un
x 2
y=x
1 x
u3 1,4
0
CODE 77
u2 1,5
u1 2
u0 3,5
import graph_pi; usepackage("amsmath");usepackage("icomma"); graphicrules(xunit=2cm, yunit=2cm, xmin=-.4, xmax=4.4, ymin=-.4, ymax=3.4); cartesianaxis(extrawidth=0,xticks=Ticks(NoZero),yticks=Ticks(NoZero)); label("$0$",(0,0),2*SW); real f(real x){return x/2+1/x;} draw(graph(f,.1,4.4),bp+deepblue); draw(graph(new real(real x){return x;}),bp+red); ylimits(-.4,3.4,Crop); draw(recursivegraph(f,3.5,n=4), recursiveoption(L=scale(.7)*"u", labelbegin=true, labelend=true, labelinner=true, labelalternate=true, format="\approx %.1f", labelplace=onX, px=dashed, py=nullpen, startonyaxis=false, circuitarrow=MidArrow(3mm), automarker=marker(scale(5)*cross(4),blue), xaxismarker=dot(orange), yaxismarker=nomarker, xmarker=dot(green), fmarker=dot(magenta)), bp+heavycyan); label("$y=\frac{x}{2}+\frac{1}{x}$",(.5,f(.5)),E,deepblue); label("$y=x$",(3,3),SE,red); label(scale(.9)*"$\left\{\begin{aligned}&u_0=3,5\\ &u_{n+1}=\frac{u_n}{2}+\frac{1}{u_n} \end{aligned}\right.$",(.75,3),E);
void graphpoint(picture pic=currentpicture, Label L="", real f(real), real xCoordinate, real xmin=0, real ymin=0, int draw=onXY, pen px=nullpen, pen py=px, arrowbar arrow=None, arrowbar bar=None, margin marginy=NoMargin, margin marginx=NoMargin, bool extend=false, bool extendx=extend, bool extendy=extend, Label legendx="", Label legendy="", marker markerx=nomarker, marker markery=nomarker)
45
Asymptote
Dmarrage rapide
void addtangent(picture pic=currentpicture, path g, pair pt,//Point on the path g // real x (x-Coordinate) est aussi dfini real size=infinity,//ABSOLUTE size of the tangent line bool drawright=true,//Draw the tangent at the right bool drawleft=true,//... left pair v=(infinity,infinity),//A finite value forces the value of the derivative pair vr=v,//A finite value forces the value of the derivative at right pair vl=v,//A finite value forces the value of the derivative at left arrowbar arrow=null,//null=automatic determination margin margin=NoMargin,//Useful with size=infinity Label legend="", pen p=currentpen, real dt=2, bool differentiable=true)
y 5 Cexp 4 3 e 2 1 4
CODE 78
import graph_pi; graphicrules(xunit=1cm, yunit=1cm, xmin=-4, xmax=3, ymin=-.5, ymax=5); cartesianaxis(xticks=RightTicks(NoZero), yticks=LeftTicks(NoZero,Step=1)); grid(pTick=paleblue,ptick=paleblue); labeloij(); real f(real x){return exp(x);} path Cf=graph(f,n=200); draw(Cf, bp+darkbrown); addtangent(Cf,x=0,size=1cm,heavymagenta); addtangent(Cf,x=1,size=1cm,heavymagenta); graphpoint(f,1,px=dashed+blue); dot((1,f(1))); dot((0,f(0))); labely("e",f(1),blue); ylimits(-1,5.5,Crop); label("$\mathscr{C}_\mathrm{exp}$",(1.5,f(1.5)),E,darkbrown);
46
Asymptote
Dmarrage rapide
5 ) animation
Ce module permet de faire des animations aux formats gif et mpeg en utilisant convert dImageMagick (qui doit donc tre install sur lordinateur), ainsi quau format pdf (animations visibles avec Acrobat Reader). Pour obtenir un gif par exemple, il suft de compiler avec loption -f gif :
asy -f gif
ou de rajouter dans le chier asy
settings.outformat="gif";
En pratique, le module animate.asy importe le module animation.asy et le package animate.sty. Pour plus dclairA cissements il faudra donc se rfrer au chier animation.asy, ainsi qu la documentation du package LTEX animate.sty (qui est donc requis). a ) Cration danimations autonomes Les principales routines utilises ici sont :
void save()
qui sauvegarde limage lendroit o elle est utilise,
void restore()
qui restaure (cest facile langlais !) limage au point o elle a t sauvegarde par save(), et enn
47
Asymptote
Dmarrage rapide
CODE 79
import geometry; import animate; settings.tex="pdflatex"; settings.outformat="pdf"; size(15cm,0); point A=(0,0), B=(3,-2), lab=(6,1); circle cA=circle(A,2.5), cB=circle(B,2.5); point[] int=intersectionpoints(cA,cB); segment seg=segment(A,B); line med=line(int[0],int[1]); animation Anim; // -------------------------------------------// Etape 0 draw(seg,bp+heavygreen); dot("$A$",A,unit(A-B)); dot("$B$",B,unit(B-A)); Anim.add(); // Etape 1 draw(cA,bp+blue); draw(cB,bp+blue); Anim.add(); // Etape 2 save(); // tout ce quil y a avant sera conserv dans la suite label("\begin{minipage}{4cm} On trace deux cercles\\ de m\^eme rayon.\end{minipage}",lab,E); draw(lab..controls (4,2) and (3,2)..angpoint(cA,45),Arrow()); draw(lab..controls (5.5,1) and (4.5,1)..angpoint(cB,60),Arrow()); Anim.add(); restore(); // Etape 3 save(); label("\begin{minipage}{4cm} Deux points\\ \equidistants\\ de $A$ et $B$.\end{minipage}",lab,E); draw(lab..controls (3,.5) and (2,-.5)..int[0],Arrow()); draw(lab..controls (5,1) and (4.5,1)..int[1],Arrow()); dot(int[0],heavyred); dot(int[1],heavyred); Anim.add(); restore(); // Etape 4 save(); draw(med,bp+heavyred); label("\begin{minipage}{4cm} M\ediatrice de $\left[AB\right]$\end{minipage}",lab,E,heavyred); draw(lab..controls (5,1.5) and (4,1.6)..relpoint(med,1.4),Arrow()); dot(int[0],heavyred); dot(int[1],heavyred); Anim.add(); restore(); // -------------------------------------------erase(); // permet dviter les effets de "dcalage" label(Anim.pdf("controls,step"));
Quelques sorties :
label(Anim.pdf("<options>",keep=true,multipage=false));
pour obtenir un pdf par image.
label(Anim.pdf("<options>",keep=true,multipage=true));
48
Asymptote
Dmarrage rapide
pour obtenir lanimation et le pdf multipage (pdf contenant une page par image).
label(Anim.pdf("<options>"));
pour lanimation uniquement.
Anim.movie();
pour obtenir un pdf multipage.
Anim.glmovie();
pour une sortie dans la fentre OpenGL, compiler avec asy -V Pour les options entre guillemets, ce sont les options du package animate.sty (il faut consulter sa documentation pour davantage de prcisions). On trouve entre autres : autoplay : dmarre lanimation automatiquement. loop : lanimation recommence en boucle. controls : pour les boutons de contrle (sinon, il faut cliquer sur lanimation pour la lancer). buttonsize=<size>, buttonbg=<colour>, buttonfg=<colour> : mise en forme des boutons. palindrome : lanimation sexcute davant en arrire. step : pas pas. width=..., height=..., depth=... : redimensionne lanimation. scale=... : mise lchelle de lanimation. Il est aussi possible de prciser le temps (en millisecondes) entre chaque image, par exemple :
label(Anim.pdf("controls",delay=50));
pour une image toutes les 50 millisecondes. CODE 80
import animation; settings.outformat="gif"; size(100,100); path c1=circle((0,0),1); path c2=circle((0,.6),.4); draw(c1,bp+purple); animation Anim; // ------------------------------for(int i=0; i < 360; i+=10) { save(); draw(rotate(i)*c2,bp+heavymagenta); Anim.add(); restore();} // ------------------------------Anim.movie(loops=3,delay=50);
movie() peut aussi prendre des arguments, utile par exemple pour la cration dun gif (puisquil ny aura pas de
boutons de contrle. . .). Lexemple ci-contre peut tre compil directement par : asy mongif.asy.
b ) Inclure une animation externe dans un chier .tex Lanimation doit tre cre avec la sortie Anim.movie() (pdf multipage). Le package animate.sty va se charger de reconstituer lanimation laide de la commande :
\animategraphics[<options>]{<frame rate>}{<file basename>}{<first>}{<last>} <file basename> est le nom de lanimation sans extension et <frame rate> est le nombre dimages par seconde. <first> et <last>, la premire et dernire image.
Exemple :
49
Asymptote
Dmarrage rapide
CODE 81
// Animation ralise avec laide de Gatan Marris et Olivier Guib import graph_pi; import animate; settings.tex="pdflatex"; settings.outformat="pdf"; usepackage("fourier","upright"); real f(real x) {return cos(x);} path Cf1=graph(f,0,pi,n=20,Hermite); path Cf2=graph(f,-pi,pi,n=20,Hermite); path Cf3=graph(f,pi,3pi,n=20,Hermite); transform sc=scale(.8); pen pinit=1.2bp+magenta, pf=1.2bp+.8blue, pvec=bp+deepgreen; animation A; // -----------------------------------------------------------------------------void trace(path f, pen p, Label L="", real r=0, real per=2pi, pair NS=(0,0), pen pv=nullpen, arrowbar arrow=Arrow(HookHead,2mm)){ draw(f,p); if (NS!=(0,0)) draw(Label(sc*L,Fill(white),align=NS),(r,f(r))--(r+per,f(r+per)),pv,arrow); } graphicrules(xunit=1cm, yunit=1cm, xmin=-3pi, xmax=3pi, ymin=-1.5, ymax=1.5); add(millimeterpaper(p=1bp+orange),(0,0)); labeloij(Lo=sc*"$O$",Li=sc*"$\overrightarrow{\imath}$",Lj=sc*"$\overrightarrow{\jmath}$"); cartesianaxis(xticks=Ticks(sc*Label(Fill(white)), labelfrac(factor=pi,symbol="\pi",symbolin=true, zero=false),Step=pi/2, ptick=black), yticks=Ticks(sc*Label(Fill(white)), labelfrac(zero=false),Step=1,step=.5)); A.add(); // -----------------------------------------------------------------------------for (real p=-1; p<=1; p+=.1) { save(); trace(Cf1,pinit); draw(xscale(-p)*Cf1,pinit); A.add(); restore(); } for (real t=0; t<=2pi; t+=pi/25) { save(); trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec); draw(shift(t,0)*Cf2,pf); A.add(); restore(); } for (real t=0; t<=2pi+pi/25; t+=pi/25) { save(); trace(Cf2,pinit,"$2\pi \vec{\imath}$",.75,N,pvec); trace(Cf3,pf,"$-2\pi \vec{\imath}$",-pi,-2pi,S,pvec); draw(shift(-t,0)*Cf2,pf); A.add(); restore(); } erase(); A.movie();
50
Asymptote
Dmarrage rapide
y
1 3 5 2 2 3 2 2 O 1
2
3 2
5 2
Pour voir lanimation, il faut utiliser Acrobat Reader. c ) Inclure le code dans un chier .tex On se contentera ici de copier le code du chier inlinemovie.tex de la galerie dexemples du site ofciel : asymptote.sourceforge.net/gallery/animations
\documentclass{article} \usepackage[inline]{asymptote} %\usepackage{asymptote} \usepackage{animate} \begin{document} Here is an inline PDF movie, generated with the commands \begin{verbatim} pdflatex inlinemovie asy inlinemovie-*.asy pdflatex inlinemovie \end{verbatim} or equivalently, \begin{verbatim} latexmk -pdf inlinemovie \end{verbatim} \begin{center} \begin{asy} import animate; animation A=animation("movie1"); real h=2pi/10; picture pic; unitsize(pic,2cm); for(int i=0; i < 10; ++i) { draw(pic,expi(i*h)--expi((i+1)*h)); A.add(pic); } label(A.pdf("controls",delay=50,keep=!settings.inlinetex)); \end{asy} %Uncomment the following line when not using the [inline] package option: %\ASYanimategraphics[controls]{50}{movie1}{}{} \end{center}
51
Asymptote
Dmarrage rapide
And here is another one, clickable but without the control panel: \begin{center} \begin{asy} import animate; animation A=animation("movie2"); real h=2pi/10; picture pic; unitsize(pic,2cm); for(int i=0; i < 10; ++i) { draw(pic,expi(-i*h)--expi(-(i+1)*h),red); A.add(pic); } label(A.pdf(keep=!settings.inlinetex)); \end{asy} %Uncomment the following line when not using the [inline] package option: %\ASYanimategraphics[controls]{10}{movie2}{}{} \end{center} \end{document}
52
Asymptote
Dmarrage rapide
Ce code peut tre sauvegard dans un chier compass.asy, mettre dans le rpertoire des codes de gures, ou bien dans le dossier .asy du rpertoire personnel. Il sufra ensuite de limporter par un import compass;.
53
Asymptote
Dmarrage rapide
C
cm
4 ,5
cm
A B B
A
CODE 82
6 cm
import compass; usepackage("icomma"); unitsize(1cm); point A=(0,0), B=(6,0); draw("$6$~cm",A--B); compass comp=compass(A,radiusA=3, B,radiusB=4.5); draw(comp.markAL,blue); draw(comp.markBL,red); draw(Label("$3$~cm",Rotate(-dir(comp.L--A))), comp.L--A,dashed); draw(Label("$4,5$~cm",Rotate(-dir(B--comp.L))), B--comp.L,dashed); label("$C$",comp.L,1.5N); label("$A$",A,W); label("$B$",B,E);
R
CODE 83
import compass; size(6cm,0); point A=(0,0), B=(3,0); draw(A--B); compass comp=compass(A,radiusA=2, positionA=.85,angleA=130,B); draw(comp.markAL^^comp.markBL,blue); dot("$L$",comp.L); dot("$R$",comp.R); drawline(comp.L,comp.R); label("$A$",A,W); label("$B$",B,E);
CODE 84
import compass; size(6cm,0); point A=(0,0), B=(3,0); draw(A--B); compass comp=compass(A,radiusA=2.5, positionA=.35,angleA=25, B,radiusB=1.5, positionB=.5,angleB=30); markcompass(comp,dashed); label("$A$",A,W); label("$B$",B,E);
CODE 85
import compass; size(8cm,0); point A=(0,0), B=(3,0); draw(A--B); compass comp=compass(A,radiusA=2.5,angleA=25, B,radiusB=1.5,angleB=30); draw(comp.circleA^^comp.circleB,dotted); markcompass(comp,penAL=blue,penAR=green, penBL=red,penBR=purple); label("$A$",A,W); label("$B$",B,E);
Remarque : Pour comprendre davantage encore les structures, voir cet exemple trs bien document de Philippe Ivaldi : www.piprime.fr/1274/various_asymptote-g0300/ 54
Asymptote
Dmarrage rapide
CODE
void cote3D(picture pic=currentpicture, Label L="", triple A, triple B, real d=5mm, triple v, bool cc=true, pen p=currentpen, pen joinpen=dotted, arrowbar3 arrow=Arrows3) { transform3 T=shift(d*unit(v)); triple A=A, B=B; pic.add(new void(picture f, transform3 t) { picture opic; path3 dist; triple Ap=t*A, Bp=t*B; triple a=T*Ap, b=T*Bp; if (cc) {dist=a--b;} else {dist=b--a;} draw(opic,L,dist,p,arrow); draw(opic,a--Ap^^b--Bp,joinpen); add(f,opic); }, true); }
55
Asymptote
Dmarrage rapide
CODE 86
import three; import macros3D; defaultrender.merge=true; settings.render=4; size(12cm); real a=6, b=4, c=2, d=1; currentprojection=orthographic(120*a/3,-120*b,120*2c/3); // facteur de 120 pour que le prc soit la "bonne" taille // cause dun bogue dAcrobat Reader sous linux, // inutile sous Windows, une fois nest pas coutume... transform3 T=shift(0,0,c); triple A=(0,0,0), B=(a,0,0), C=(a,b,0), D=(0,b,0), pE=T*A, F=T*B, G=T*C, H=T*D, P=(a-d,0,0); pen ps=lightmagenta+opacity(.5), pT=bp+linetype("4 4"); draw(A--B--C--G--H--pE--F--G^^pE--A^^F--B,linewidth(bp)); draw(A--D--C^^H--D,pT); draw(surface(H--D--P--cycle),ps,pT); draw(surface(H--P--C--cycle),ps,pT); draw(surface(H--D--C--cycle),ps,pT); draw(surface(D--P--C--cycle),ps,pT); label("$A$",A,S); label("$B$",B,SE); label("$C$",C,E); label("$D$",D,NW); label("$E$",pE,NW+2W); label("$F$",F,SE); label("$G$",G,E); label("$H$",H,N); label("$P$",P,SW); cote3D(format("$%f$~cm",a),G,H,unit(H-pE)); cote3D(format("$%f$~cm",b),H,pE,3mm,unit(pE-F)); cote3D(format("$%f$~cm",c),pE,A,3mm,unit(pE-F)); cote3D(format("$%f$~cm",d),P,B,unit(B-F),red);
Cette routine due Philippe Ivaldi permet de marquer les angle droits. # # Elle marque langle droit MA ; MB . CODE
void drawrightangle(picture pic=currentpicture, triple M, triple A, triple B, real radius=0, pen p=currentpen, pen fillpen=nullpen, projection P=currentprojection) { p=linejoin(0)+linecap(0)+p; if (radius==0) radius=arrowfactor*sqrt(2); transform3 T=shift(-M); triple OA=radius/sqrt(2)*unit(T*A), OB=radius/sqrt(2)*unit(T*B), OC=OA+OB; path3 _p=OA--OC--OB; picture pic_; draw(pic_, _p, p=p); if (fillpen!=nullpen) draw(pic_, surface(O--_p--cycle), fillpen); add(pic,pic_,M); }
56
Asymptote
Dmarrage rapide
Une adaptation de la routine prcdente, pour marquer un angle quelconque. Si cc=false, elle trace lautre arc. Si vous visualisez ce document laide dAcrobat Reader, vous pouvez activer la gure et la bouger avec la souris. CODE
void markangle3D(picture pic=currentpicture, Label L="", triple M, triple A, triple B, bool cc=true, real radius=0, pen p=currentpen, pen fillpen=nullpen, arrowbar3 arrow=None, projection P=currentprojection) { p=linejoin(0)+linecap(0)+p; if (radius==0) radius=arrowfactor*sqrt(2); transform3 T=shift(-M); triple OA=radius/sqrt(2)*unit(T*A), OB=radius/sqrt(2)*unit(T*B); path3 pl=O--OA--OB; triple V=normal(pl); path3 _p; real k; if (cc) k=1; else k=-1; picture pic_; _p=arc(O,OA,OB,k*V); if (fillpen!=nullpen) draw(pic_, surface(O--_p--cycle), fillpen); draw(pic_, L, _p, p=p, arrow); add(pic,pic_,M); }
57
Asymptote
Dmarrage rapide
CODE 87
size(10cm,0); import three; import macros3D; // voir ANNEXE E usepackage("icomma"); usepackage("mathrsfs"); settings.outformat="pdf"; settings.render=0; real coef=25; // pour un bogue dAcrobat sous linux, inutile sous Windows currentprojection = currentprojection=orthographic( camera=(coef*20,coef*6,coef*6), up=(-0.004142,0.000122,0.021101), target=(-1.71e-15,-4.28e-16,-4.28e-16), zoom=0.7); currentlight=nolight; triple p1=(5,0,0), p2=(5,5,0), p3=(0,5,0); path3 pl=plane(p1,p3); path3 c3=circle(p2/2,2,Z); triple A=relpoint(c3,.35), B=relpoint(c3,.85), M=relpoint(c3,.12); triple pO=(A.x,A.y,3), H1=rotate(180,pO,B)*A, N1=rotate(180,pO,M)*A; triple H=intersectionpoint(pO--B,A--H1), pN=intersectionpoint(pO--M,A--N1); draw(surface(pl),paleblue+opacity(.5),black); draw(c3^^A--B,red); draw(pO--A);draw(pO--B,blue);draw(pO--M,heavygreen); draw(A--H,blue);draw(A--pN,heavygreen); dot("$A$",A,2*unit(A-B));dot("$B$",B,2*unit(B-A));dot(p2/2); dot("$O$",pO,N);dot("$M$",M,SE);dot("$H$",H,2*unit(H-A)); dot("$N$",pN,2*unit(pN-A)); label("$\mathscr{C}$",relpoint(c3,.7),NW,red); label("$\mathscr{P}$",p1,6*unit(p3-p1)); drawrightangle(H,A,pO,5mm,fillpen=lightblue+opacity(.5)); drawrightangle(pN,M,A,5mm,fillpen=heavygreen+opacity(.5)); markangle3D(pO,H,A,10mm,fillpen=lightblue+opacity(.5)); markangle3D(pO,pN,A,10mm,fillpen=heavygreen+opacity(.5)); markangle3D(p1,p2,O,22mm);
58
Asymptote
Dmarrage rapide
CODE 88
import graph3; size(10cm,0); settings.render=4; currentprojection=perspective( camera=(-0.508471034714439,-0.453210476508603,5.8054086347958), up=(-4.06484402934237e-05,0.0135768552457447,0.000957626274221287), target=(0.0977992777408489,0.0442771771973709,-1.22203503249791), zoom=1, angle=23.1851359726969, autoadjust=false); real f(pair z) {return -(2z.x^2+z.y^2);} surface surf=surface(f,(-1,-1),(1,1),nx=6,ny=3); draw(surf,lightblue+opacity(0.5),blue); draw(surface(xscale(4)*scale(.1)*"Mon texte sur une surface", surf,uoffset=1,voffset=2,height=0.02),red);
59
Asymptote
Dmarrage rapide
Exemple 2 : Sur un solide de rvolution, les valeurs de uoffset et voffset sont chercher plus ou moins par ttonnement. Si vous visualisez ce document laide dacrobat reader, vous pouvez activer la gure et la bouger avec la souris.
CODE 89
size(9cm,0); import solids; settings.render=4; currentlight=nolight; revolution Cone=cone(O,3,6,axis=Z,n=1); surface ConeSurf=surface(Cone); draw(ConeSurf,mediumred+opacity(0.5)); draw(surface(xscale(1.5)*scale(.2)*"Un joli c\^one",ConeSurf, uoffset=6,voffset=.3,height=0.02),blue);
60
Asymptote
Dmarrage rapide
CODE 90
size(10cm,0); import solids; import macros3D; // voir ANNEXE E usepackage("icomma"); settings.outformat="pdf"; settings.render=4; settings.prc=false; // ------------------ modifier ------------------currentprojection = orthographic(-20,70,15); currentlight=nolight; real lat=23.44; // latitude : + --> N, - --> S real long=-50; // longitude : + --> W, - --> E pen pSphere=paleblue+opacity(.2); //-------------------------------------------------triple pO=(0,0,0), pN=(0,0,1), pS=(0,0,-1), pX=(1,0,0), pY=(0,1,0); revolution Terre=sphere(O,1,n=4*nslice); draw(surface(Terre), pSphere); // Mridien de Greenwich draw(arc(pO,pN,pS,-X),.7bp+red); // quateur skeleton e; Terre.transverse(e,reltime(Terre.g,.5)); draw(e.transverse.front,.7*linewidth(bp)); draw(e.transverse.back,.7*bp+dashed); // parallle skeleton s; Terre.transverse(s,reltime(Terre.g,(90+lat)/180)); draw(s.transverse.front,blue); draw(s.transverse.back,blue+dashed);
61
Asymptote
Dmarrage rapide
// mridien transform3 R=rotate(90-long,Z), r=rotate(-lat,Y); triple pA=r*pX, pM=R*pX, pL=R*pA, pH=(0,0,Sin(lat)*length(pO--pL)); // demi-mridien draw(arc(pO,pN,pM)); // ------------- Tracs en pointills ---------------draw(pO--pY,linetype("4 4")); draw(pN--pS,dashed); draw(pO--pM^^pO--pL,linetype("4 4")); draw(pH--pL,linetype("4 4")); // ------------- Labels ------------dot("$O$",pO,NW); dot("$N$",pN,N); dot("$S$",pS,S); dot("$G$",pY,SW); dot("$M$",pM,SE); dot("$L$",pL,NE); dot("$H$",pH,W); // Labels sur la surface draw(surface(scale(.07)*"\Equateur",surface(Terre),uoffset=1.8,voffset=21)); draw(surface(xscale(2)*scale(.04)*"Tropique du Cancer",surface(Terre), uoffset=1.9,voffset=30),blue); draw(surface(xscale(2)*scale(.05)*"M\eridien de Greenwich",surface(Terre), uoffset=3.1,voffset=17),red); // ------------- Marques des angles -------------markangle3D(scale(.7)*Label(format("$%f^\circ$",abs(lat)),align=E), pO,pM,pL,radius=25mm,fillpen=magenta,Arrow3); markangle3D(scale(.7)*Label(format("$%f^\circ$",abs(long)),align=.25S), pO,pY,pM,radius=25mm,fillpen=.5*green,Arrow3); drawrightangle(pH,pL,pO,radius=5mm);
62
Asymptote
Dmarrage rapide
Asymptote ne prvoit pas (pour linstant) ce type de projection. Celles sen rapprochant le plus sont obliqueX et obliqueY,
mais, si langle de fuite est rglable, le coefcient de rduction ne lest pas. Il est cependant possible de modier les dnitions dobliqueX et obliqueY pour obtenir deux perspectives cavalires : pcX(real k, real angle) et pcY(real k, real angle). Pour les gures suivantes, le code des deux projections sera mis dans le chier macros3D.asy (voir lAnnexe E) : CODE
projection pcX(real k=.5, real angle=45) { transform3 t=identity(4); real c2=Cos(angle)^2; real s2=1-c2; t[0][0]=-k*Cos(angle); t[1][0]=-k*Sin(angle); t[1][1]=0; t[0][1]=1; t[1][2]=1; t[2][2]=0; t[2][0]=1; t[2][3]=-1; return projection((1,c2,s2),normal=(1,0,0), new transformation(triple,triple,triple) { return transformation(t);}); } projection pcX=pcX();
CODE
projection pcY(real k=.5, real angle=45) { transform3 t=identity(4); real c2=Cos(angle)^2; real s2=1-c2; t[0][1]=k*Cos(angle); t[1][1]=k*Sin(angle); t[1][2]=1; t[2][1]=-1; t[2][2]=0; t[2][3]=-1; return projection((c2,-1,s2),normal=(0,-1,0), new transformation(triple,triple,triple) { return transformation(t);}); } projection pcY=pcY();
CODE 92 CODE 91
import three; import macros3D; size(5cm); settings.render=0; settings.prc=false; currentprojection=pcX; draw(Label("$X$",EndPoint,NW), O--2*X,blue,Arrow3); draw(Label("$Y$",EndPoint,N), O--2*Y,blue,Arrow3); draw(Label("$Z$",EndPoint,W), O--2*Z,blue,Arrow3); draw(unitbox); draw(arc(X,(1,.5,0),(1,0,.5)),red); dot("$O$",O,NE); dot("$1$",(1,0,0),S); label("pcX$\left(\frac12,45\right)$", (0,1,1.7)); import three; import macros3D; size(4cm); settings.render=0; settings.prc=false; currentprojection=pcY(.5,30); draw(Label("$X$",EndPoint,N), O--2*X,blue,Arrow3); draw(Label("$Y$",EndPoint,N), O--2*Y,blue,Arrow3); draw(Label("$Z$",EndPoint,W), O--2*Z,blue,Arrow3); draw(unitbox); draw(arc(X,(1.5,0,0),(1,0,.5)),red); dot("$O$",O,S); dot("$1$",(1,0,0),S); dot("$1,5$",(1.5,0,0),S); label("pcY$\left(\frac12,30\right)$", (1,0,1.7));
63
Asymptote
Dmarrage rapide
CODE 93
import three; import macros3D; size(10cm); settings.render=0; settings.prc=false; currentlight=nolight; currentprojection=pcY(.5,30); transform3 T=shift(-2*Z); triple A=O, B=(4,0,0), C=(4,4,0), D=(0,4,0), pS=(2,2,3), pO=(2,2,0), pE=T*A, F=T*B, G=T*C, H=T*D; draw(A--C^^B--D,dashed); draw(A--B--C--pS--A^^pS--B); draw(pS--D^^A--D--C,dashed); draw(scale(.75)*"$3$~cm",pS--pO,dashed+red); draw(A--pE--F--G--C^^B--F); draw(pE--H--G^^H--D,dashed); drawrightangle(pO,pS,B,5mm,fillpen=red); cote3D(scale(.75)*"$2$~cm",A,pE,A-B); cote3D(scale(.75)*"$4$~cm",pE,F,pE-A); cote3D(scale(.75)*"$4$~cm",F,G,F-pE); label("$A$",A,NW); label("$B$",B,SE); label("$C$",C,E); label("$D$",D,W+.5N); label("$S$",pS,N); label("$O$",pO,S); label("$E$",pE,SW); label("$F$",F,SE); label("$G$",G,NE); label("$H$",H,W+.5N);
64
Asymptote
Dmarrage rapide
CODE
/* Fichier de macros pour les figures3D placer dans le rpertoire $HOME/.asy Christophe Grospellier */ import three; // --------- Dfinition de la perspective cavalire pcX ------projection pcX(real k=.5, real angle=45) { transform3 t=identity(4); real c2=Cos(angle)^2; real s2=1-c2; t[0][0]=-k*Cos(angle); t[1][0]=-k*Sin(angle); t[1][1]=0; t[0][1]=1; t[1][2]=1; t[2][2]=0; t[2][0]=1; t[2][3]=-1; return projection((1,c2,s2),normal=(1,0,0), new transformation(triple,triple,triple) { return transformation(t);}); } projection pcX=pcX(); // --------- Dfinition de la perspective cavalire pcY ------projection pcY(real k=.5, real angle=45) { transform3 t=identity(4); real c2=Cos(angle)^2; real s2=1-c2; t[0][1]=k*Cos(angle); t[1][1]=k*Sin(angle); t[1][2]=1; t[2][1]=-1; t[2][2]=0; t[2][3]=-1; return projection((c2,-1,s2),normal=(0,-1,0), new transformation(triple,triple,triple) { return transformation(t);}); } projection pcY=pcY(); // ------------------Suite page suivante------------------------
65
Asymptote
Dmarrage rapide
void cote3D(picture pic=currentpicture, Label L="", triple A, triple B, real d=5mm, triple v, bool cc=true, pen p=currentpen, pen joinpen=dotted, arrowbar3 arrow=Arrows3) { transform3 T=shift(d*unit(v)); triple A=A, B=B; pic.add(new void(picture f, transform3 t) { picture opic; path3 dist; triple Ap=t*A, Bp=t*B; triple a=T*Ap, b=T*Bp; if (cc) {dist=a--b;} else {dist=b--a;} draw(opic,L,dist,p,arrow); draw(opic,a--Ap^^b--Bp,joinpen); add(f,opic); }, true); } // -------------drawrightangle de P. Ivaldi--------------------void drawrightangle(picture pic=currentpicture, triple M, triple A, triple B, real radius=0, pen p=currentpen, pen fillpen=nullpen, projection P=currentprojection) { p=linejoin(0)+linecap(0)+p; if (radius==0) radius=arrowfactor*sqrt(2); transform3 T=shift(-M); triple OA=radius/sqrt(2)*unit(T*A), OB=radius/sqrt(2)*unit(T*B), OC=OA+OB; path3 _p=OA--OC--OB; picture pic_; draw(pic_, _p, p=p); if (fillpen!=nullpen) draw(pic_, surface(O--_p--cycle), fillpen); add(pic,pic_,M); } // ------------------Suite page suivante------------------------
66
Asymptote
Dmarrage rapide
void markangle3D(picture pic=currentpicture, Label L="", triple M, triple A, triple B, bool cc=true, real radius=0, pen p=currentpen, pen fillpen=nullpen, arrowbar3 arrow=None, projection P=currentprojection) { p=linejoin(0)+linecap(0)+p; if (radius==0) radius=arrowfactor*sqrt(2); transform3 T=shift(-M); triple OA=radius/sqrt(2)*unit(T*A), OB=radius/sqrt(2)*unit(T*B); path3 pl=O--OA--OB; triple V=normal(pl); path3 _p; real k; if (cc) k=1; else k=-1; picture pic_; _p=arc(O,OA,OB,k*V); if (fillpen!=nullpen) draw(pic_, surface(O--_p--cycle), fillpen); draw(pic_, L, _p, p=p, arrow); add(pic,pic_,M); }
Fin
67
Index
abscissa, 20 add, 47 addMargins, 23 addtangent, 46 align, 8 altitude, 27 animate, 47, 49 animategraphics, 49 animation, 47 arc, 13, 20 ArcArrow, 7 Arrow, 7 arrow, 7 autoplay, 49 axes, 31, 33 axis, 31 Bar, 7 bar, 7 begin, 31 beginlabel, 31 bisector, 19, 20, 27 bisectorpoint, 27 Bottom, 31 BottomTop, 31 box, 13 bp, 6 cartesianaxis, 40 Center, 8 centroid, 27 circle, 20 circle(t), 27 circlebarframe, 18 CircleBarIntervalMarker, 16 circumcenter, 27 compass, 53 compassmark, 23 compilations, 4 complementary, 20 conic, 20 connecteur, 6 contour, 38 controls, 49 coordsys, 19 cote3D, 55 Crop, 32 crossframe, 18 CrossIntervalMarker, 16 defaultpen, 14 delay, 49 distance, 22, 25 draw, 6 drawline, 21 drawrightangle, 56 ellipse, 14 end, 31 endlabel, 31 EndPoint, 11 erase, 47 extend, 20 extension, 12 extraheight, 40 extrawidth, 40 ll, 7 lldraw, 7 foot, 26, 27 format, 15 geometry, 19 graph, 31, 35 graph_pi, 39 graphicrules, 39 graphpoint, 45 grid, 25, 41 hatch, 13 identity, 9 incenter, 27 incircle, 27 installation, 3 interp, 12 intersectionpoint, 12 intersectionpoints, 12 inversion, 21 Label, 6, 8 label, 7 labelfrac, 42 labeloIJ, 41 labeloij, 40 labelx, 35 labely, 35 latexmk, 5 latexmkrc, 5 Left, 32 LeftRight, 32 LeftSide, 8 LeftTicks, 31 line, 19 linetype, 25 68
INDEX
Asymptote
Dmarrage rapide
loop, 49 macros3D, 55, 65 magnetizePoints, 28 markangle, 10, 18 markangle3D, 57 markers, 10, 16 markrightangle, 22 mass, 19 median, 27 midpoint, 27 millimeterpaper, 41 multipage, 49 NoTicks, 31 NoZero, 31 NoZeroFormat, 31 obliqueX, 63 obliqueY, 63 OmitFormat, 31 OmitTick, 31 opacity, 14 orthocentercenter, 27 parallel, 19, 24 path, 6 pattern, 13 patterns, 13 pcX, 63 pcY, 63 pen, 6 perpendicular, 19 perpendicularmark, 23 perspective cavalire, 63 point, 19 polargraph, 36 polygon, 17 projection, 25 pTick, 32 ptick, 32 recursivegraph, 43 recursiveoption, 43 reect, 11, 25 relpoint, 12, 25 reltime, 12 repres, 31 restore, 47 reverse, 20 Right, 32 RightSide, 8 RightTicks, 31 Rotate, 8 rotate, 10 save, 47
scale, 10 sector, 19 segment, 20 shift, 9 show, 21 Size, 31 size, 6, 31 slant, 10 startTrembling, 28 Step, 31 step, 31 stickframe, 18 StickIntervalMarker, 16 struct, 53 structure, 53 subpath, 12 svn, 3 tangent, 45 ticklabel, 42 tickmodier, 31 Ticks, 31 ticks, 31 tildeframe, 18 TildeIntervalMarker, 17 Top, 31 transformations, 9 tremble, 28 trembleAngle, 28 trembleFrequency, 28 trembleRandom, 28 trembling, 28 triangle, 20 triangleAbc, 24 triangleabc, 24 trilinear, 21 unitcircle, 9 unitsize, 6 uoffset, 59 vector, 19 voffset, 59 void, 14 xaxis, 31 xequals, 33 xlimits, 32 xscale, 9 xtick, 35 yaxis, 32 YEquals, 31 yequals, 33 ylimits, 32 yscale, 9 69
INDEX
Asymptote
Dmarrage rapide
ytick, 35 YZero, 31
70