Page 1 sur 1

Cotes d'une figure 3D

MessagePosté: Vendredi 25 Février 2011, 18:15
par Fabrice Couvreur
Bonjour,
Dans le code ci-dessous :

Code: Tout sélectionner
import three;
import geometry;
usepackage("fourier");
settings.outformat="pdf";
settings.prc=false;
settings.render=4;
size(10cm);
currentprojection=obliqueX;
currentlight=nolight;
pen p=fontsize(6pt);
real a=12;
real b=9;
triple tA=(0,0,0),tB=(0,b,0),tC=(-b,b,0),tD=(-b,0,0),tS=(0,0,a),tE=(0,0,b);
triple tF=shift(0,b/4,0)*tE;
triple tG=shift((tC-tB)/4)*tF;
triple tH=shift((tD-tC)/4)*tG;
draw(surface(tA--tB--tS--cycle),lightred+opacity(0.5),black+0.5bp);
draw(surface(tB--tC--tS--cycle),lightred+opacity(0.5),black+0.5bp);
draw(surface(tD--tC--tS--cycle),lightred+opacity(0.5));
draw(surface(tD--tA--tS--cycle),lightred+opacity(0.5));
draw(tA--tD--tC^^tD--tS,dashed);
draw(tE--tF^^tF--tG,black+0.5bp);
draw(tG--tH--tE,dashed);
label("A",tA,S,p);
label("B",tB,S,p);
label("C",tC,S+E,p);
label("S",tS,N,p);
label("D",tD,S+E,p);
label("E",tE,S+W,p);
label("F",tF,S+3E,p);
label("G",tG,N+E,p);
label("H",tH,N+2W,p);
label("$9\,\textrm{cm}$",(tA+tB)/2,S,p);


je souhaiterais marquer la longueur AB avec un segment ayant une flèche à chaque extrémité et un label égal à "9 cm".
Peut-on utiliser la routine distance() du module geometry en considérant, par exemple, les projetés des points A et B sur le plan de la feuille ?
Merci.

Re: Cotes d'une figure 3D.

MessagePosté: Vendredi 25 Février 2011, 19:38
par chellier
Fabrice Couvreur a écrit:je souhaiterais marquer la longueur AB avec un segment ayant une flèche à chaque extrémité et un label égal à "12 cm".
Peut-on utiliser la routine distance() du module geometry en considérant, par exemple, les projetés des points A et B sur le plan de la feuille ?
Merci.

Bonjour,

Avec distance, je ne pense pas que ce soit faisable, mais je veux bien être contredit :D

Par contre, comme je le dis dans les annexes de ma doc (troisième lien de ma signature), on peut créer une fonction pour le faire. :
Code: Tout sélectionner
import three;
//import geometry;
usepackage("fourier");
settings.outformat="pdf";
settings.prc=false;
settings.render=4;
size(10cm,0);
currentprojection=obliqueX;
currentlight=nolight;
pen p=fontsize(6pt);
//==========================================
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);
}
//==========================================
real a=12;
real b=9;
triple tA=(0,0,0),tB=(0,b,0),tC=(-b,b,0),tD=(-b,0,0),tS=(0,0,a),tE=(0,0,b);
triple tF=shift(0,b/4,0)*tE;
triple tG=shift((tC-tB)/4)*tF;
triple tH=shift((tD-tC)/4)*tG;
draw(surface(tA--tB--tS--cycle),lightred+opacity(0.5),black+0.5bp);
draw(surface(tB--tC--tS--cycle),lightred+opacity(0.5),black+0.5bp);
draw(surface(tD--tC--tS--cycle),lightred+opacity(0.5));
draw(surface(tD--tA--tS--cycle),lightred+opacity(0.5));
draw(tA--tD--tC^^tD--tS,dashed);
draw(tE--tF^^tF--tG,black+0.5bp);
draw(tG--tH--tE,dashed);
label("A",tA,S,p);
label("B",tB,S,p);
label("C",tC,S+E,p);
label("S",tS,N,p);
label("D",tD,S+E,p);
label("E",tE,S+W,p);
label("F",tF,S+3E,p);
label("G",tG,N+E,p);
label("H",tH,N+2W,p);
//label("$9\,\textrm{cm}$",(tA+tB)/2,S,p);
//==========================================
cote3D(Label("$9\,\textrm{cm}$",p),tA,tB,-Z);

project_1.png
project_1.png (69.7 Kio) Vu 1600 fois

Dans les annexes de la doc, tu trouveras aussi (entre autres) comment définir une vraie perspective cavalière :
project.png
project.png (73.09 Kio) Vu 1600 fois

Christophe

PS : une dernière remarque : plutôt que de définir pen p=fontsize(6pt); et d'être obligé de spécifier "p" dans tous les labels, on peut aussi utiliser defaultpen(fontsize(6pt));

Re: Cotes d'une figure 3D.

MessagePosté: Samedi 26 Février 2011, 00:15
par Fabrice Couvreur
Bonsoir Christophe,
J'avais parcouru ta documentation (beau boulot !), mais j'aimais bien la forme des flèches de la structure distance().
Je vais donc utiliser tes routines.
Merci.

Re: Cotes d'une figure 3D.

MessagePosté: Samedi 26 Février 2011, 01:03
par GMaths
chellier a écrit:Avec distance, je ne pense pas que ce soit faisable, mais je veux bien être contredit :D


Bon, bein alors... je vais contredire.

Ceci fonctionne...

Code: Tout sélectionner
distance("$9\,\textrm{cm}$",project(tA),project(tB),rotated=false,8mm,joinpen=red+linetype("4 4"));

... mais, comme d'hab, quand on veut mettre des commandes 2D dans une scène 3D, sous réserve de mettre settings.render=0.

Re: Cotes d'une figure 3D.

MessagePosté: Samedi 26 Février 2011, 10:02
par chellier
GMaths a écrit:Bon, bein alors... je vais contredire.

Avec plaisir :wink:

GMaths a écrit:... mais, comme d'hab, quand on veut mettre des commandes 2D dans une scène 3D, sous réserve de mettre settings.render=0.

Ah... c'était ça ! Merci Gaétan.

@ Fabrice : dans cote3D, on peut choisir le style des flèches :
Code: Tout sélectionner
cote3D("$9\,\textrm{cm}$",tA,tB,-Z,Arrows3(HookHead3,1mm));

Mais ça restera des flèches "3D". La solution de Gaétan te conviendra peut-être mieux.

Christophe