Cylindres et cônes de révolution

Règles du forum
ATTENTION ! Il est demandé de ne déposer dans ce forum que des exemples
  • finalisés
  • que l'on pense intéressants et optimisés
  • et qui se rapportent au thème du forum.
Si certains exemples déposés donnent lieu à de nombreuses modifications, ils seront déplacés et remplacés par un nouveau sujet dans ce forum avec la ou les meilleures propositions.
Pour les demandes d'aide ... il y a un forum spécifique !

Cylindres et cônes de révolution

Message non lupar chellier » Dim 11 Avr 2010, 10:14

Après les configurations de Thalès, je continue mon tour (tant qu'on m'arrête pas !) des figures classiques que l'on utilise (plus ou moins) souvent. Encore une fois, le code de base est fait pour qu'il y ait le moins de choses à changer possible et est commenté de manière à pouvoir le modifier facilement.

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

Image

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

Image

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

Image

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

Image


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

Image

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

Image


Christophe
Avatar de l’utilisateur
chellier
 
Messages: 86
Inscription: Jeu 18 Mar 2010, 17:30

Re: Cylindres et cônes de révolution

Message non lupar Francky » Ven 16 Avr 2010, 21:02

Une modeste première contribution, si vous voulez.

Un cône collé à un cylindre, la difficulté étant d'obtenir les pointillés pour la base du cône.
La solution que j'ai trouvée, n'est pas idéale à mon gout. Si vous avez mieux ...

Code: Tout sélectionner
settings.render=0;
settings.prc=false;


import solids;
size(20cm);
currentprojection=orthographic(0,3,1);
revolution CoRev=cone((0,0,0),4,-8,axis=Z,n=1);
draw(CoRev,0.75bp+black);
draw(cylinder(c=(0,0,0),r=4,h=0.001), 0.95bp+white);//astuce pour effacer le bord du cône.
draw(cylinder(c=(0,0,0),r=4,h=25), 0.75bp+black);
//fin de la figure.

//cotations, grace à cote3D...
// 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);
}
cote3D("6 m",(-4,0,25),(4,0,25), d=1cm, (0,0,1), joinpen=dashed);
cote3D("35 m",(-4,0,0),(-4,0,25), d=5mm, (-1,0,0), joinpen=dashed);
cote3D("4 m",(-4,0,-8),(-4,0,0), d=5mm, (-1,0,0), joinpen=invisible);
draw((0,0,-8)--(-4.85,0,-8), dashed);


qui donne
cone+cylindre.png
cone+cylindre.png (17.53 Kio) Vu 273 fois


J'ai réutilisé le "cote3D" vu au message précédent.
Francky
 
Messages: 40
Inscription: Sam 10 Avr 2010, 22:15
Localisation: Sud-Drôme

Re: Cylindres et cônes de révolution

Message non lupar chellier » Ven 16 Avr 2010, 21:23

Bonsoir,
Pas mal :)

Pour obtenir les pointillés pour la base du cône, on peut aussi tracer un cercle plutôt qu'un cylindre de hauteur quasi-nulle :

Code: Tout sélectionner
draw(circle((0,0,0),r=4,Z), 0.95bp+white);

à la place de
Code: Tout sélectionner
draw(cylinder(c=(0,0,0),r=4,h=0.001), 0.95bp+white);


Si quelqu'un à une solution plus propre, je suis preneur aussi ;)

Christophe
Avatar de l’utilisateur
chellier
 
Messages: 86
Inscription: Jeu 18 Mar 2010, 17:30

Re: Cylindres et cônes de révolution

Message non lupar chellier » Ven 16 Avr 2010, 21:57

Peut-être une solution plus propre : ne tracer que la partie visible du cône à l'aide de CoRev.g (la génératrice) :
Code: Tout sélectionner
revolution CoRev=cone((0,0,0),4,-8,axis=Z,n=1);
revolution demiCone=revolution(c=(0,0,0),CoRev.g, axis=Z, -180, 0);
draw(demiCone,bp+black);
//plus besoin d'astuce pour effacer le bord du cône !!
draw(cylinder(c=(0,0,0),r=4,h=25), bp+black);


Christophe
Avatar de l’utilisateur
chellier
 
Messages: 86
Inscription: Jeu 18 Mar 2010, 17:30

Re: Cylindres et cônes de révolution

Message non lupar chellier » Sam 1 Mai 2010, 14:00

Pour des figures un peu plus complexes et pour une bonne gestion des pointillés, il vaut mieux utiliser une génératrice et définir le solide comme un solide de révolution.

Par exemple, pour la figure du sujet du brevet de Pondichéry 2010 :
Code: Tout sélectionner
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);

pondichery.png
Brevet Pondichéry 2010
pondichery.png (62.11 Kio) Vu 238 fois


Il est ainsi possible de le "remplir" :
Code: Tout sélectionner
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);

erlenmeyers.png
erlenmeyers.png (206.01 Kio) Vu 238 fois


Christophe
Avatar de l’utilisateur
chellier
 
Messages: 86
Inscription: Jeu 18 Mar 2010, 17:30

Re: Cylindres et cônes de révolution

Message non lupar Francky » Sam 1 Mai 2010, 23:37

C'est beau, on progresse. Merci.
Francky
 
Messages: 40
Inscription: Sam 10 Avr 2010, 22:15
Localisation: Sud-Drôme


Retourner vers Géométrie de l'espace

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité