![]() ![]() |
/* 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); |
![]() ![]() |
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. |
![]() ![]() |
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. |
![]() ![]() |
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 |
![]() ![]() |
// 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); |
![]() ![]() |
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 |
![]() ![]() |
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 |
![]() ![]() |
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); |
![]() ![]() |
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. */ |
![]() ![]() |
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) |
![]() ![]() |
// 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. |
![]() ![]() |
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