PROGRAMMATION : FRAME, PICTURE (12)
Liste des figures
Figure fig_aa01_310109
figure 0001
Figure fig_fa01_090210_frame
figure 0002
Figure fig_fa02_090210_frame
figure 0003
Figure fig_fa03_090210_frame
figure 0004
Figure fig_fa04_090210_frame_add_prepend
figure 0005
Figure fig_fa05_090210_frame_align
figure 0006
Figure fig_fa06_090210_frame_align
figure 0007
Figure fig_fa07_090210_frame_erase_min_max
figure 0008
Figure fig_pf00_070112_picture_frame
figure 0009
Figure fig_pf01_090210_picture_frame
figure 0010
Figure fig_pf02_090210_picture_frame
figure 0011
Figure fig_pf03_160210_picture_frame_layer
figure 0012
Asymptote - Figure 0001: fig_aa01_310109.asy
(Code compilé avec Asymptote version 2.14svn)
largeur320 Figure fig_aa01_310109
/* Quelle est la différence entre frame et picture ?
   - frame : c'est une "toile" (canvas) sur laquelle
             on dessine en coordonnées Postscript.
   - picture : est une structure plus évoluée 
               qui fournie une "toile" (canvas) sur laquelle
               on peut dessiner avec une unité de longueur
               choisie par l'utilisateur.
*/
frame f;
label(f,"\textbf{frame - picture}",yellow,Fill(.5blue));
add(rotate(20)*scale(3)*f);
Asymptote - Figure 0002: fig_fa01_090210_frame.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa01_090210_frame
frame f;
// On dessine un trait dans la frame f :
draw(f,(0,0)--(200,200),red);  // En coordonnées postscript !!!
// L'unité postscript (big point) est égale à 1 bp = 1/72 pouce(inch) = 127/360 mm


// Pour ajouter une "frame" à une "picture", deux syntaxes possibles :
// 1. void add(picture dest=currentpicture, frame src, pair position=0,
//             bool group=true, filltype filltype=NoFill, bool above=true);
// 2. void add(picture dest=currentpicture, frame src, pair position, pair align,
//             bool group=true, filltype filltype=NoFill, bool above=true);

add(f); // On ajoute la frame f à la currentpicture pour obtenir la figure.

// Quelques explications sur la taille d'image :
// - en export eps et png, il faut constater que la taille est de 201x201 : normal !
// - pour l'image ci-contre, les dimensions sont 268x268 pixels, car la conversion
//   en png est assurée par un appel perso de "convert" avec l'option -resample 96
//   201 x (96/72) = 268.
Asymptote - Figure 0003: fig_fa02_090210_frame.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa02_090210_frame
frame f;
// On dessine un carré dans la frame f :
draw(f,(0,0)--(80,0)--(80,80)--(0,80)--cycle,red);

add(f,(0,0)); // On ajoute la frame f à la currentpicture au point (0,0)
add(f,(160,80)); // On ajoute la frame f à la currentpicture au point (160,80)
// rappel : pour l'image ci-contre, les dimensions sont multipliées par 96/72=4/3
// cf. explication de l'exemple précédent.
Asymptote - Figure 0004: fig_fa03_090210_frame.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa03_090210_frame
unitsize(10); // unité utilisateur de la currentpicture : 10bp
// On dessine un rectangle dans la currentpicture avec l'unité précédente.
draw((0,0)--(24,0)--(24,16)--(0,16)--cycle,blue);

frame f;
// On dessine un carré dans la frame f (unité : 1bp).
draw(f,(0,0)--(80,0)--(80,80)--(0,80)--cycle,red);
 // On ajoute la frame f à la currentpicture au point (12,8).
add(f,(12,8)); // unité utilisateur !
dot((12,8),green); // mise en évidence du point
Asymptote - Figure 0005: fig_fa04_090210_frame_add_prepend.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa04_090210_frame_add_prepend
// Trois formes colorées dans trois frames différentes
frame f1, f2, f3;
fill(f1,scale(120)*unitsquare,red); // carré rouge dans f1
fill(f2,scale(75)*unitsquare,palegreen); // carré vert dans f2
fill(f3,scale(80)*unitcircle,blue); // disque bleu dans f3

add(f1); // ajout de f1 à la currentpicture

prepend(f2,f3); // ajout de f3 à f2, en dessous de f2

add(f2); // ajout de f2 à la currentpicture au dessus

// On obtiendrait le même résultat en enchainant dans cet ordre :
// add(f1); add(f3); add(f2);
Asymptote - Figure 0006: fig_fa05_090210_frame_align.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa05_090210_frame_align
frame f,fN,fSE;

draw(f,scale(80)*unitsquare,red); // carré rouge dans f

fN=align(f,N); // fN : f dans la "direction" N (nord)
fSE=align(f,SE); // fSE : f dans la "direction" SE (sud-est)
f=align(f,(-3,-2)); // On rédéfinit f : f dans "direction" du vecteur (-3,-2)

dot((0,0)); // point (0,0) pour comprendre le positionnement des frames

add(fN); // ajout de fN à la currentpicture
add(fSE); // ajout de fSE à la currentpicture
add(f); // ajour du f redéfini à la currentpicture
Asymptote - Figure 0007: fig_fa06_090210_frame_align.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa06_090210_frame_align
unitsize(1cm);

frame f,fN,fSE;

draw(f,scale(80)*unitsquare,red); // carré rouge dans f

fN=align(f,N); // fN : f dans la "direction" N (nord)
fSE=align(f,SE); // fSE : f dans la "direction" SE (sud-est)
f=align(f,(-3,-2)); // On rédéfinit f : f dans "direction" du vecteur (-3,-2)

// 4 points définis puis placés sur la figure.
pair pO=(0,0), pA=(0,1), pB=(2,0), pC=(0,-2); 
// coordonnées dans le repère de la currentpicture avec l'unité définie par unitsize.
dot(pO); dot(pA^^pB^^pC,red);

add(fN,pA); // ajout de fN à la currentpicture au point pA
add(fSE,pB); // ajout de fSE à la currentpicture au point pB
add(f,pC); // ajout de f (redéfini) à la currentpicture au point pC
Asymptote - Figure 0008: fig_fa07_090210_frame_erase_min_max.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_fa07_090210_frame_erase_min_max
draw(scale(100)*unitsquare,1bp+green); // carré vert dans currentpicture

frame f1,f2;
fill(f1,scale(80)*unitsquare,red); // carré rouge dans f1
fill(f2,scale(75)*unitcircle,paleblue); // disque bleu dans f2

add(f1); // ajout de f1 à currentpicture
add(f2); // ajout de f2 à currentpicture
erase(f1); // effacement de la frame f1

// On peut essayer de ré-ajouter f1 mais en vain.
add(f1);
// Ses "dimensions" anciennes sont conservées.
dot("min(f1)",min(f1),SW);
dot("max(f1)",max(f1),SW);
Asymptote - Figure 0009: fig_pf00_070112_picture_frame.asy
(Code compilé avec Asymptote version 2.14svn)
largeur320 Figure fig_pf00_070112_picture_frame
import geometry;

unitsize(1cm);
show(currentcoordsys);

path p=scale(5)*unitsquare;
picture obj;

draw(obj,p,blue);
 
add(obj);       // Carré de côté 5 * 1cm = 5cm
// équivalent à : currentpicture.add(obj);

add(obj,(1,1)); // Carré de côté 5 (bp) 
                // soit 5 * (1/72) pouce
                // soit 5 * (127/3600) cm = 0,17638888... cm
// équivalent à : add(currentpicture,obj,(1,1));
//                add(currentpicture,obj.fit(identity()),(1,1));

/* Il peut sembler surprenant que les deux carrés tracés
   ne diffèrent pas uniquement que par leurs positions :
   la taille est différente aussi !
   Cf. définitions des multiples syntaxes add(...) 
   dans le fichier plain_picture.asy.
*/
Asymptote - Figure 0010: fig_pf01_090210_picture_frame.asy
(Code compilé avec Asymptote version 2.14svn)
largeur320 Figure fig_pf01_090210_picture_frame
import geometry;

unitsize(80);
show(currentcoordsys);

dot((1.5,-1)^^(1.5,-2),green);

picture pic1;
fill(pic1,unitsquare,orange+opacity(.6)); // carré orange dans pic1 
// write(min(pic1)); donne (0,0)
// write(max(pic1)); donne (1,1)

picture pic2;
unitsize(pic2,40);
draw(pic2,unitcircle,blue); // cercle bleu dans pic2
// write(min(pic2)); donne (-40.25,-40.25)
// write(max(pic2)); donne (40.25,40.25)

add(pic1,pic2); // ajoute pic2 à pic1 sans tenir compte de unitsize(pic2,50) !!
// write(min(pic1)); donne (-1.25,-1.25)
// write(max(pic1)); donne (1.25,1.25)

add(pic1); // ajoute pic1 (carré rouge + grand cercle bleu) à currentpicture

add(pic2,(1.5,-1)); // ajoute pic2 à currentpicture au point vert (1.5,-1)
// sans tenir compte de unitsize(pic2,50) !! Même si :
// write(min(currentpicture)); donne (-80.25,-161.5)
// write(max(currentpicture)); donne (121.5,81.5)
// C'est le tout petit cercle bleu de rayon 1bp qui recouvre presque le point vert.

frame f=pic2.fit(); // Mets pic2 dans une frame en tenant compte de unitsize(pic2,40) !!
// write(min(f)); donne (-40.25,-40.25)
// write(max(f)); donne (40.25,40.25)
 
add(f,(1.5,-2)); // ajoute f à currentpicture au point vert (1.5,-2)
// write(min(currentpicture)); donne (-80.25,-200.25)
// write(max(currentpicture)); donne (160.25,81.5)
Asymptote - Figure 0011: fig_pf02_090210_picture_frame.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pf02_090210_picture_frame
// Un nouvel exemple pour mieux comprendre les trois tailles 
// du cercle bleu de l'exemple précédent.

// 5 pictures (currentpicture, pic40, pic20, pic10, pic1) avec 5 unités différentes
unitsize(60); // unité de longueur de currentpicture : 60bp
picture pic40; unitsize(pic40,40); // unité de longueur de pic2 : 40bp
picture pic20; unitsize(pic20,20); // unité de longueur de pic2 : 20bp
picture pic10; unitsize(pic10,10); // unité de longueur de pic2 : 10bp
picture pic1; // unité de longueur de pic1 : celle par défaut de 1bp


draw(pic1,unitcircle,blue); // cercle bleu de rayon 1 unité (1 bp) dans pic1
add(pic1); // ajouté à currentpicture, on obtient un cercle bleu de rayon 1 unité (1x60 bp)
add(pic1.fit()); // pic1.fit() une frame qui tient compte du unitsize (implicite) de pic1
                 // ajoutée à currentpicture, on obtient un cercle bleu de rayon 1x1 = 1 bp
                                 
draw(pic10,scale(2)*unitcircle,red); // cercle rouge de rayon 2 unités (2x10 bp) dans pic10
add(pic20,pic10); // Même si on l'ajoute de picture en picture, quand on finit par l'ajouter 
add(pic40,pic20); // à currentpicture, on obtient :
add(pic40);       // un cercle rouge de rayon 2 unités (2x60 bp).
add(pic10.fit()); // pic10.fit() une frame qui tient compte du unitsize de pic10 :
                  // ajoutée à currentpicture, on obtient un cercle rouge de rayon 2x10 = 20 bp

// Il me semble avoir compris que :
// 1. lorsque l'on ajoute une picture à une autre, c'est le unitsize de la picture destinataire 
// qui est pris en compte : peu importe celui de l'image initiale.
// 2. pour ajouter une picture pic à une autre en tenant compte du unitsize de pic,
// on ajoutera en fait la frame pic.fit() à la picture destinataire.
Asymptote - Figure 0012: fig_pf03_160210_picture_frame_layer.asy
(Code compilé avec Asymptote version 1.95svn)
largeur320 Figure fig_pf03_160210_picture_frame_layer
picture pic1; unitsize(pic1,1cm);
draw(pic1,(0,0)--(5,2),red);
label(pic1,"un label quelconque",(5,1),W);
fill(pic1,box((2.5,0),(4.5,2)),green);

picture pic2; unitsize(pic2,1cm);
draw(pic2,(0,0)--(5,2),red);
label(pic2,"un label quelconque",(5,1),W);
layer(pic2); // Les constructions suivantes de pic2 : dans un nouveau calque, au dessus !
             // Cela va permettre de dessiner au dessus d'un label !
fill(pic2,box((2.5,0),(4.5,2)),green);

frame f1=pic1.fit(),
      f2=pic2.fit(),
      f3=bbox(pic1,paleblue,Fill);

// Ajout des trois frames à currentpicture
add(f1);
add(f2,truepoint(S),S);
add(f3,truepoint(S),S);

Dernière modification le Sat Jan 7 13:41:32 CET 2012 par G.Marris       Valide XHTML