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 en langage Asymptote
  • 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 !
Avatar du membre
chellier
Messages : 104
Enregistré le : jeu. 18 mars 2010, 17:30

Cylindres et cônes de révolution

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

Francky
Messages : 40
Enregistré le : sam. 10 avr. 2010, 22:15
Localisation : Sud-Drôme

Re: Cylindres et cônes de révolution

Message non lu par 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 12231 fois


J'ai réutilisé le "cote3D" vu au message précédent.

Avatar du membre
chellier
Messages : 104
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Cylindres et cônes de révolution

Message non lu par 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 du membre
chellier
Messages : 104
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Cylindres et cônes de révolution

Message non lu par 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 du membre
chellier
Messages : 104
Enregistré le : jeu. 18 mars 2010, 17:30

Re: Cylindres et cônes de révolution

Message non lu par 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 12196 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 12196 fois


Christophe

Francky
Messages : 40
Enregistré le : sam. 10 avr. 2010, 22:15
Localisation : Sud-Drôme

Re: Cylindres et cônes de révolution

Message non lu par Francky » sam. 1 mai 2010, 23:37

C'est beau, on progresse. Merci.

Répondre