6eme 5eme 4eme 3eme
Sommaire Liens Atelier Maths Forum

Sommaire des ressources Asymptote


Asymptote :
Cônes et cylindres


Cônes
Cylindres
Figures moins classiques

Pour des figures classiques n'utilisant qu'un cône ou un cylindre, on peut utiliser un code de base assez complet qu'il suffit de modifier pour obtenir ce que l'on veut.


Cône


base
Code de base :
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));


cone1
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));



cone2 
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));


cone3 
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));


cone4 
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));


Cylindre


base
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));


cylindre1
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));


cylindre2
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));


Figures moins classiques

Pour certaines figures, il vaut mieux utiliser une génératrice et définir le solide comme un solide de révolution.


pondichery2010
Figure du brevet de Pondichéry 2010
size(7cm,0);
import solids;
usepackage("fourier","upright");
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin
//------------------------------------------------------------------------------------------
// 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 -----------------------
pen pTour=bp+black; // couleur et épaisseur du tracé du cylindre
pen pSurf=lightblue; // couleur de la surface
real H=12, h=3, r1=4, r2=h/H*r1; // dimensions du cylindre et du cône
currentprojection = orthographic(10,0,6);
//-------------------------------------------------------------
transform3 R=rotate(180,Z);
triple pO=(0,0,0), pB=(0,r1,0), pS=(0,0,H),
pO2=pO+(H-h)*Z, pB2=(0,r2,H-h), pB3=(0,r2,H), pB4=R*pB2;
path3 gene=pB--pB2--pB3; // génératrice
revolution recip=revolution(pO,gene,axis=Z,0,360);
//------------------ Tracés (commenter ce qui n'est pas voulu) --------------------

//-------- Cône et cylindre----------
draw(recip,pTour);
//draw(surface(recip),pSurf);
draw(pB2--pS--pB4,pTour+linetype("3 5"));
draw(pB--pO--pS^^pB2--pB4,pTour+linetype("3 5"));
drawrightangle(pO,pB,pS,radius=6mm); drawrightangle(pO2,pB2,pS,radius=4mm);

label("$O$",pO,SW); label("$B$",pB,E); label("$B'$",pB2,E);
label("$S$",pS,NW); label("$O'$",pO2,SW);


erlenmeyers
size(7cm,0);
import solids;
usepackage("fourier","upright");
settings.render=0; // à commenter si besoin
settings.prc=false; // à commenter si besoin

//////////////////// Définition des objets ////////////////////

//------------------ VALEURS À MODIFIER -----------------------
pen pTour=bp+black; // couleur et épaisseur du tracé du cylindre
pen pSurf=lightblue; // couleur de la surface
real H=12, h=3, r1=4, r2=h/H*r1; // dimensions du cylindre et du cône
currentprojection = orthographic(10,0,6);
//-------------------------------------------------------------
transform3 R=rotate(180,Z);
triple pO=(0,0,0), pB=(0,r1,0), pS=(0,0,H),
pO2=pO+(H-h)*Z, pB2=(0,r2,H-h), pB3=(0,r2,H), pB4=R*pB2;
triple pC=relpoint(pB--pB2,.75); // "hauteur du liquide"
path3 gene=pB--pB2--pB3; // génératrice erlenmeyers
path3 gene2=pB--pC; //génératrice "liquide"
revolution recip=revolution(pO,gene,axis=Z,0,360);
revolution eau=revolution(pO,gene2,axis=Z,0,360);
//------------------ Tracés --------------------

//-------- Cône et cylindre----------
draw(recip,pTour);
draw(surface(eau),pSurf);


Pour toute(s) question(s) :




C. Grospellier