Cotes d'une figure 3D

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
Fabrice Couvreur
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 604
Inscription : samedi 18 août 2007, 01:55

Cotes d'une figure 3D

Message non lu 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.
Dernière modification par Fabrice Couvreur le vendredi 25 février 2011, 23:30, modifié 1 fois.
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot

Re: Cotes d'une figure 3D.

Message non lu 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) Consulté 3334 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) Consulté 3334 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));
Fabrice Couvreur
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 604
Inscription : samedi 18 août 2007, 01:55

Re: Cotes d'une figure 3D.

Message non lu 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.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Cotes d'une figure 3D.

Message non lu 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.
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot

Re: Cotes d'une figure 3D.

Message non lu 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