On modifie les valeurs dans la partie prévue, puis on commente ou décommente certaines parties.
Je ne suis pas un spécialiste de la 3D avec asymptote, alors bien sûr, si vous avez plus simple, ou des améliorations à apporter, ça m'intéresse !
A NOTER : il existe aussi une extension geoespace.asy qui doit pouvoir faire encore plus !
Tout d'abord le code de base pour le cône de révolution :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//-----------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------ VALEURS À MODIFIER -----------------------
real r=4, h=7, ang=0; // rayon, hauteur du cône, angle {iOA} du diamètre de base
pen pCone=bp+blue; // couleur et épaisseur du tracé cône
real coef=.5; // coefficient de réduction pour la section
pen pSec=pCone; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(0,70,20); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
bool sens=true;
if (h<0){sens=false;}
triple pO=(0,0,0), pS=(0,0,h); // pO : centre de la base, pS : sommet
triple xb=(r,0,0), xSec=relpoint(pS--xb,coef);
transform3 T=rotate(ang,Z), t=rotate(180,Z);
triple pA=T*xb, pB=t*pA; // diamètre de la base
revolution CoRev=cone(pO,r,h,axis=Z,n=1);
//-------- Section ----------
triple pO_1=pS*(1-coef), pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=shift(0,0,(1-coef)*h)*scale3(coef)*(pA--pB); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,coef*r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CoRev.transverse(s,reltime(CoRev.g,1-coef));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
draw(surface(section),paleblue+opacity(.2));
//
draw(seg,dashed); // diamètre
dot(Label("$O'$",align=SE),pO_1);
dot(Label("$A'$",align=unit(pA_1-pB_1)),pA_1);
dot(Label("$B'$",align=unit(pB_1-pA_1)),pB_1);
drawrightangle(pO_1,pS,pB_1,radius=5mm);
//-------- Cône ----------
draw(CoRev,pCone);
//draw(surface(CoRev),lightblue+opacity(.5));
draw(pS--pO^^pA--pB,dashed); // diamètre (changer pB en pO pour le rayon)
label("$S$",pS,N);
dot(Label("$O$",align=SE),pO);
dot(Label("$A$",align=unit(pA-pB)),pA);
dot(Label("$B$",align=unit(pB-pA)),pB);
drawrightangle(pO,pS,pB,radius=5mm);
//draw(pA--pS--pB); // à commenter ou décommenter
//------------------- Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,pS,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- génératrice ----------
//cote3D(Label(format("$%f$",length(pS-xb))),pS,xb,12mm,v,sens);
//-------- Réduction -- génératrice ----------
//cote3D(Label(format("$%f$",length(pS-xSec))),pS,xSec,5mm,v,sens);
//-------- Réduction -- hauteur ----------
//triple s3=pS-(coef*r)*X;
//cote3D(Label(format("$%f$",h*coef)),t*xSec,s3,7mm,-X,sens);
//-------- rayon ----------
//cote3D(Label(format("$%f$",r)),pA,pO,4mm,-Z,sens);
//-------- hauteur ----------
//triple s1=pS-r*X;
//cote3D(Label(format("$%f$",abs(h))),t*xb,s1,7mm,-X,sens);
//draw(pS--s1,dotted);
shipout(bbox(1mm,invisible));
1er exemple :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//------------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------ VALEURS À MODIFIER -----------------------
real r=3, h=6, ang=0; // rayon, hauteur du cône, angle {iOA} du diamètre de base
pen pCone=bp+darkgreen; // couleur et épaisseur du tracé cône
real coef=.6; // coefficient de réduction pour la section
pen pSec=pCone; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(0,70,20); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
bool sens=true;
if (h<0){sens=false;}
triple pO=(0,0,0), pS=(0,0,h); // pO : centre de la base, pS : sommet
triple xb=(r,0,0), xSec=relpoint(pS--xb,coef);
transform3 T=rotate(ang,Z), t=rotate(180,Z);
triple pA=T*xb, pB=t*pA; // diamètre de la base
revolution CoRev=cone(pO,r,h,axis=Z,n=1);
//-------- Section ----------
triple pO_1=pS*(1-coef), pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=shift(0,0,(1-coef)*h)*scale3(coef)*(pA--pB); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,coef*r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CoRev.transverse(s,reltime(CoRev.g,1-coef));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
draw(surface(section),green+opacity(.2));
//
draw(seg,dashed); // diamètre
dot(Label("$O'$",align=SE),pO_1);
dot(Label("$A'$",align=unit(pA_1-pB_1)),pA_1);
dot(Label("$B'$",align=unit(pB_1-pA_1)),pB_1);
drawrightangle(pO_1,pS,pB_1,radius=5mm);
//-------- Cône ----------
draw(CoRev,pCone);
//draw(surface(CoRev),lightblue+opacity(.5));
draw(pS--pO^^pA--pB,dashed); // diamètre (changer pB en pO pour le rayon)
label("$S$",pS,N);
dot(Label("$O$",align=SE),pO);
dot(Label("$A$",align=unit(pA-pB)),pA);
dot(Label("$B$",align=unit(pB-pA)),pB);
drawrightangle(pO,pS,pB,radius=5mm);
//draw(pA--pS--pB); // à commenter ou décommenter
//------------------ Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,pS,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- génératrice ----------
//cote3D(Label(format("$%f$",length(pS-xb))),pS,xb,12mm,v,sens);
//-------- Réduction -- génératrice ----------
//cote3D(Label(format("$%f$",length(pS-xSec))),pS,xSec,5mm,v,sens);
//-------- Réduction -- hauteur ----------
triple s3=pS-(coef*r)*X;
cote3D(Label(format("$%f$",h*coef)),t*xSec,s3,7mm,-X,sens);
//-------- rayon ----------
cote3D(Label(format("$%f$",r)),pA,pO,10mm,-Z,sens);
//-------- hauteur ----------
triple s1=pS-r*X;
cote3D(Label(format("$%f$",h)),t*xb,s1,7mm,-X,sens);
draw(pS--s1,dotted);
shipout(bbox(1mm,invisible));
2eme exemple :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//------------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------ VALEURS À MODIFIER -----------------------
real r=3, h=6, ang=45; // rayon, hauteur du cône, angle {iOA} du diamètre de base
pen pCone=bp+blue; // couleur et épaisseur du tracé cône
real coef=.6; // coefficient de réduction pour la section
pen pSec=bp+purple; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(0,70,20); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
bool sens=true;
if (h<0){sens=false;}
triple pO=(0,0,0), pS=(0,0,h); // pO : centre de la base, pS : sommet
triple xb=(r,0,0), xSec=relpoint(pS--xb,coef);
transform3 T=rotate(ang,Z), t=rotate(180,Z);
triple pA=T*xb, pB=t*pA; // diamètre de la base
revolution CoRev=cone(pO,r,h,axis=Z,n=1);
//-------- Section ----------
triple pO_1=pS*(1-coef), pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=shift(0,0,(1-coef)*h)*scale3(coef)*(pA--pB); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,coef*r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CoRev.transverse(s,reltime(CoRev.g,1-coef));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
draw(surface(section),purple+opacity(.2));
//
draw(seg,dashed); // diamètre
dot(Label("$O'$",align=SE),pO_1);
dot(Label("$A'$",align=SW),pA_1);
dot(Label("$B'$",align=NE),pB_1);
drawrightangle(pO_1,pS,pB_1,radius=5mm);
//-------- Cône ----------
draw(CoRev,pCone);
//draw(surface(CoRev),lightblue+opacity(.5));
draw(pS--pO^^pA--pB,dashed); // diamètre (changer pB en pO pour le rayon)
label("$S$",pS,N);
dot(Label("$O$",align=SE),pO);
dot(Label("$A$",align=SW),pA);
dot(Label("$B$",align=NE),pB);
drawrightangle(pO,pS,pB,radius=5mm);
draw(pA--pS--pB); // à commenter ou décommenter
//------------------ Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,pS,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- génératrice ----------
//cote3D(Label(format("$%f$",length(pS-xb))),pS,xb,7mm,v,sens);
//-------- Réduction -- génératrice ----------
//cote3D(Label(format("$%f$",length(pS-xSec))),pS,xSec,3mm,v,sens);
//-------- Réduction -- hauteur ----------
triple s3=pS-(coef*r)*X;
cote3D(Label(format("$%f$",h*coef)),t*xSec,s3,7mm,-X,sens);
//-------- rayon ----------
cote3D(Label(format("$%f$",r)),pA,pO,10mm,-Z,sens);
//-------- hauteur ----------
triple s1=pS-r*X;
cote3D(Label(format("$%f$",h)),t*xb,s1,7mm,-X,sens);
draw(pS--s1,dotted);
shipout(bbox(1mm,invisible));
3eme exemple :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//------------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------ VALEURS À MODIFIER -----------------------
real r=6, h=-8, ang=0; // rayon, hauteur du cône, angle {iOA} du diamètre de base
pen pCone=bp+blue; // couleur et épaisseur du tracé cône
real coef=.7; // coefficient de réduction pour la section
pen pSec=pCone; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(0,70,10); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
bool sens=true;
if (h<0){sens=false;}
triple pO=(0,0,0), pS=(0,0,h); // pO : centre de la base, pS : sommet
triple xb=(r,0,0), xSec=relpoint(pS--xb,coef);
transform3 T=rotate(ang,Z), t=rotate(180,Z);
triple pA=T*xb, pB=t*pA; // diamètre de la base
revolution CoRev=cone(pO,r,h,axis=Z,n=1);
//-------- Section ----------
triple pO_1=pS*(1-coef), pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=shift(0,0,(1-coef)*h)*scale3(coef)*(pA--pO); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,coef*r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CoRev.transverse(s,reltime(CoRev.g,1-coef));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
draw(surface(section),paleblue+opacity(.2));
//
draw(seg,dashed); // diamètre
dot(Label("$O'$",align=E),pO_1);
dot(Label("$A'$",align=unit(pA_1-pB_1)),pA_1);
//dot(Label("$B'$",align=unit(pB_1-pA_1)),pB_1);
drawrightangle(pO_1,pS,pA_1,radius=5mm);
//-------- Cône ----------
draw(CoRev,pCone);
//draw(surface(CoRev),lightblue+opacity(.5));
draw(pS--pO^^pA--pO,dashed); // diamètre (changer pB en pO pour le rayon)
label("$S$",pS,S);
dot(Label("$O$",align=E),pO);
dot(Label("$A$",align=unit(pA-pB)),pA);
//dot(Label("$B$",align=unit(pB-pA)),pB);
drawrightangle(pO,pS,pA,radius=5mm);
//draw(pA--pS--pB); // à commenter ou décommenter
//------------------ Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,pS,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- génératrice ----------
cote3D(Label(format("$%f$",length(pS-xb))),pS,xb,12mm,v,sens);
//-------- Réduction -- génératrice ----------
cote3D(Label(format("$%f$",length(pS-xSec))),pS,xSec,5mm,v,sens);
//-------- Réduction -- hauteur ----------
//triple s3=pS-(coef*r)*X;
//cote3D(Label(format("$%f$",h*coef)),t*xSec,s3,-X,sens);
//-------- rayon ----------
//cote3D(Label(format("$%f$",r)),pA,pO,10mm,-Z,sens);
//-------- hauteur ----------
triple s1=pS-r*X;
cote3D(Label(format("$%f$",abs(h))),t*xb,s1,7mm,-X,sens);
draw(pS--s1,dotted);
label("?",midpoint(pA_1--pO_1),N);
shipout(bbox(1mm,invisible));
4eme exemple :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//------------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------- VALEURS À MODIFIER ----------------------
real r=5, h=10, ang=60; // rayon, hauteur du cône, angle {iOA} du diamètre de base
pen pCone=bp+darkgreen; // couleur et épaisseur du tracé cône
real coef=.4; // coefficient de réduction pour la section
pen pSec=pCone; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(0,70,20); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
bool sens=true;
if (h<0){sens=false;}
triple pO=(0,0,0), pS=(0,0,h); // pO : centre de la base, pS : sommet
triple xb=(r,0,0), xSec=relpoint(pS--xb,coef);
transform3 T=rotate(ang,Z), t=rotate(180,Z);
triple pA=T*xb, pB=t*pA; // diamètre de la base
revolution CoRev=cone(pO,r,h,axis=Z,n=1);
//-------- Section ----------
triple pO_1=pS*(1-coef), pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=shift(0,0,(1-coef)*h)*scale3(coef)*(pA--pO); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,coef*r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CoRev.transverse(s,reltime(CoRev.g,1-coef));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
//draw(surface(section),paleblue+opacity(.2));
//
draw("$?$",seg,dashed); // diamètre
dot(Label("$O'$",align=E),pO_1);
dot(Label("$A'$",align=unit(pA_1-pB_1)),pA_1);
//dot(Label("$B'$",align=unit(pB_1-pA_1)),pB_1);
drawrightangle(pO_1,pS,pA_1,radius=5mm);
//-------- Cône ----------
draw(CoRev,pCone);
//draw(surface(CoRev),palegreen+opacity(.5));
draw(pS--pO^^pA--pO,dashed); // diamètre (changer pB en pO pour le rayon)
label("$S$",pS,N);
dot(Label("$O$",align=E),pO);
dot(Label("$A$",align=unit(pA-pB)),pA);
//dot(Label("$B$",align=unit(pB-pA)),pB);
drawrightangle(pO,pS,pA,radius=5mm);
draw(pA--pS); // à commenter ou décommenter
//------------------ Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,pS,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- génératrice ----------
cote3D("$5\sqrt{5}$",pS,xb,15mm,v,sens);
//-------- Réduction -- génératrice ----------
cote3D("$2\sqrt{5}$",pS,xSec,4mm,v,sens);
//-------- Réduction -- hauteur ----------
//triple s3=pS-(coef*r)*X;
//cote3D(Label(format("$%f$",h*coef)),t*xSec,s3,7mm,-X,sens);
//-------- rayon ----------
cote3D("$?$",pA,pO,10mm,-Z,sens);
//-------- hauteur ----------
triple s1=pS-r*X;
cote3D(Label(format("$%f$",h)),t*xb,s1,7mm,-X,sens);
draw(pS--s1,dotted);
shipout(bbox(1mm,invisible));
Maintenant, au tour du cylindre de révolution, code de base :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//------------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------ VALEURS À MODIFIER -----------------------
real r=3, h=6, ang=0; // rayon, hauteur du cylindre, angle {iOA} du diamètre de base
pen pCyl=bp+blue; // couleur et épaisseur du tracé du cylindre
real h1=.4*h; // coef*hauteur de la section
pen pSec=pCyl; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(0,70,20); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
triple pO=(0,0,0), pZ=(0,0,h); // pO : centre de la base, pS : sommet
transform3 T=rotate(ang,Z), t=rotate(180,Z), stn=shift(h1*Z), haut=shift(h*Z);
triple xb=(r,0,0), xSec=stn*xb, xb2=haut*xb;
triple pA=T*xb, pB=t*pA, pA_2=haut*pA, pB_2=haut*pB; // diamètre de la base
revolution CylRev=cylinder(pO,r,h,axis=Z);
//-------- Section ----------
triple pO_1=stn*pO, pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=stn*(pA--pB); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CylRev.transverse(s,reltime(CylRev.g,h1/h));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
draw(surface(section),lightblue+opacity(.2));
//
draw(seg,dashed); // diamètre
dot(Label("$O''$",align=SE),pO_1);
dot(Label("$A''$",align=unit(pA_1-pB_1)),pA_1);
dot(Label("$B''$",align=unit(pB_1-pA_1)),pB_1);
drawrightangle(pO_1,pZ,pA_1,radius=5mm);
//-------- Cône ----------
draw(CylRev,pCyl);
//draw(surface(CylRev),lightblue+opacity(.5));
draw(pZ--pO^^pA--pB^^pA_2--pB_2,dashed); // diamètre (changer pB en pO pour le rayon)
dot(Label("$O'$",align=NE),pZ);
dot(Label("$A'$",align=unit(pA-pB)),pA_2);
dot(Label("$B'$",align=unit(pB-pA)),pB_2);
dot(Label("$O$",align=SE),pO);
dot(Label("$A$",align=unit(pA-pB)),pA);
dot(Label("$B$",align=unit(pB-pA)),pB);
drawrightangle(pO,pZ,pA,radius=5mm);
//draw(pA--pA_2^^pB--pB_2); // à commenter ou décommenter
//------------------ Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,xb2,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- hauteur ----------
//cote3D(Label(format("$%f$",length(xb2-xb))),xb2,xb,15mm,v);
//-------- Hauteur haut section ----------
//cote3D(Label(format("$%f$",length(xb2-xSec))),xb2,xSec,6mm,v);
//-------- Hauteur bas section ----------
//cote3D(Label(format("$%f$",length(xSec-xb))),xSec,xb,6mm,v);
//-------- rayon ----------
//cote3D(Label(format("$%f$",r)),pA,pO,7mm,-Z);
shipout(bbox(1mm,invisible));
1er exemple :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//------------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------ VALEURS À MODIFIER -----------------------
real r=3, h=6, ang=40; // rayon, hauteur du cylindre, angle {iOA} du diamètre de base
pen pCyl=bp+purple; // couleur et épaisseur du tracé du cylindre
real h1=.4*h; // coef*hauteur de la section
pen pSec=bp+green; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(0,70,60); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
triple pO=(0,0,0), pZ=(0,0,h); // pO : centre de la base, pS : sommet
transform3 T=rotate(ang,Z), t=rotate(180,Z), stn=shift(h1*Z), haut=shift(h*Z);
triple xb=(r,0,0), xSec=stn*xb, xb2=haut*xb;
triple pA=T*xb, pB=t*pA, pA_2=haut*pA, pB_2=haut*pB; // diamètre de la base
revolution CylRev=cylinder(pO,r,h,axis=Z);
//-------- Section ----------
triple pO_1=stn*pO, pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=stn*(pA--pB); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CylRev.transverse(s,reltime(CylRev.g,h1/h));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
draw(surface(section),lightgreen+opacity(.2));
//
draw(seg,dashed); // diamètre
dot(Label("$O''$",align=SE),pO_1);
dot(Label("$A''$",align=unit(pA_1-pB_1)),pA_1);
dot(Label("$B''$",align=unit(pB_1-pA_1)),pB_1);
drawrightangle(pO_1,pZ,pA_1,radius=5mm);
//-------- Cône ----------
draw(CylRev,pCyl);
//draw(surface(CylRev),lightblue+opacity(.5));
draw(pZ--pO^^pA--pB^^pA_2--pB_2,dashed); // diamètre (changer pB en pO pour le rayon)
dot(Label("$O'$",align=NE),pZ);
dot(Label("$A'$",align=unit(pA-pB)),pA_2);
dot(Label("$B'$",align=unit(pB-pA)),pB_2);
dot(Label("$O$",align=SE),pO);
dot(Label("$A$",align=unit(pA-pB)),pA);
dot(Label("$B$",align=unit(pB-pA)),pB);
drawrightangle(pO,pZ,pA,radius=5mm);
draw(pA--pA_2^^pB--pB_2); // à commenter ou décommenter
//------------------ Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,xb2,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- hauteur ----------
cote3D(Label(format("$%f$",length(xb2-xb))),xb2,xb,15mm,v);
//-------- Hauteur haut section ----------
cote3D(Label(format("$%f$",length(xb2-xSec))),xb2,xSec,6mm,v);
//-------- Hauteur bas section ----------
cote3D(Label(format("$%f$",length(xSec-xb))),xSec,xb,6mm,v);
//-------- rayon ----------
cote3D(Label(format("$%f$",r)),pA,pO,7mm,-Z);
shipout(bbox(1mm,invisible));
2eme exemple :
Code : Tout sélectionner
size(7cm,0);
import solids;
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// v "direction" de la flèche de cotation, si cc=false le label change de côté
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){
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,Arrows3);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
// Draw right angle (MA,MB) in 3D -- Fonction de Philippe 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);
}
//------------------------------------------------------------------------------------------
//////////////////// Définition des objets ////////////////////
//------------------ VALEURS À MODIFIER -----------------------
real r=3, h=6, ang=0; // rayon, hauteur du cylindre, angle {iOA} du diamètre de base
pen pCyl=bp+purple; // couleur et épaisseur du tracé du cylindre
real h1=.4*h; // coef*hauteur de la section
pen pSec=bp+green; // couleur et épaisseur du tracé de la section
// camera : x à gauche, y devant, z en haut
currentprojection = orthographic(50,70,-20,X); // changer z pour l'aplatissement de l'ellipse
//-------------------------------------------------------------
triple pO=(0,0,0), pZ=(0,0,h); // pO : centre de la base, pS : sommet
transform3 T=rotate(ang,Z), t=rotate(180,Z), stn=shift(h1*Z), haut=shift(h*Z);
triple xb=(r,0,0), xSec=stn*xb, xb2=haut*xb;
triple pA=T*xb, pB=t*pA, pA_2=haut*pA, pB_2=haut*pB; // diamètre de la base
revolution CylRev=cylinder(pO,r,h,axis=Z);
//-------- Section ----------
triple pO_1=stn*pO, pA_1=T*xSec, pB_1=t*pA_1;
path3 seg=stn*(pA--pB); // (changer pB en pO pour le rayon)
path3 section=circle(pO_1,r,Z);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------
//-------- Section ----------
// Tour //
skeleton s;
CylRev.transverse(s,reltime(CylRev.g,h1/h));
draw(s.transverse.back,linetype("4 4")+pSec);
draw(s.transverse.front,pSec);
// Intérieur //
draw(surface(section),lightgreen+opacity(.2));
//
draw(seg,dashed); // diamètre
dot(Label("$O''$",align=SE),pO_1);
dot(Label("$A''$",align=unit(pA_1-pB_1)),pA_1);
dot(Label("$B''$",align=unit(pB_1-pA_1)),pB_1);
drawrightangle(pO_1,pZ,pA_1,radius=5mm);
//-------- Cône ----------
draw(CylRev,pCyl);
//draw(surface(CylRev),lightblue+opacity(.5));
draw(pZ--pO^^pA--pB^^pA_2--pB_2,dashed); // diamètre (changer pB en pO pour le rayon)
dot(Label("$O'$",align=NE),pZ);
dot(Label("$A'$",align=unit(pA-pB)),pA_2);
dot(Label("$B'$",align=unit(pB-pA)),pB_2);
dot(Label("$O$",align=SE),pO);
dot(Label("$A$",align=unit(pA-pB)),pA);
dot(Label("$B$",align=unit(pB-pA)),pB);
drawrightangle(pO,pZ,pA,radius=5mm);
draw(pA--pA_2);
draw(pB--pB_2,dashed); // à commenter ou décommenter
//------------------ Cotes (décommenter ce qui est voulu) --------------------
triple sympO=rotate(180,xb2,xb)*pO, v=sympO-pO; // direction perpendiculaire à la génératrice
//-------- hauteur ----------
cote3D(Label(format("$%f$",length(xb2-xb))),xb2,xb,20mm,v);
//-------- Hauteur haut section ----------
cote3D(Label(format("$%f$",length(xb2-xSec))),xb2,xSec,12mm,v);
//-------- Hauteur bas section ----------
cote3D(Label(format("$%f$",length(xSec-xb))),xSec,xb,12mm,v);
//-------- rayon ----------
cote3D(Label(format("$%f$",r)),pA,pO,12mm,-Z);
shipout(bbox(1mm,invisible));
Christophe