%##################################################################################### %######################## MACROS : SOLIDES À SURFACES COURBES ######################## %######################## v 0.5 du 05/03/2008 ######################## %##################################################################################### % % Auteur : Christian TELLECHEA % Site : www.bricamath.net \makeatletter \edef\dashDefaut{3pt 3pt}% pointillés par défaut \edef\widthDefaut{0.7pt}% épaisseur par défaut % _________________________________________________ %| | %| Cotation et noms des points | %|_________________________________________________| \define@key{TraitRappel}{styleTraitRappel}{\edef\@styleTraitRappel{#1}} \define@key{TraitRappel}{widthTraitRappel}{\edef\@widthTraitRappel{#1}} \define@key{TraitRappel}{dashTraitRappel}{\edef\@dashTraitRappel{#1}} \newcommand*{\@TraitRappel}[7][]{% % #1 style des Traits de Rappel % #2 abscisse début % #3 ordonnée début % #4 abscisse fin % #5 ordonnée fin % #6 dépassement trait % #7 décalage flèche \presetkeys{TraitRappel}{styleTraitRappel=none,widthTraitRappel=0.4pt,dashTraitRappel=1.5pt 1.5pt}{}% \setkeys{TraitRappel}{#1}% \@@TraitRappel{#2}{#3}{#4}{#5}{#6}{#7}% } \newcommand{\@@TraitRappel}[6]{% \pstVerb{% /signe {dup 0 eq {pop 0}{dup 0 lt {pop 1 neg}{pop 1} ifelse} ifelse} def% /depass #5 #6 abs add #6 signe mul #3 #1 sub dup mul #4 #2 sub dup mul add sqrt div def% /decalx #2 #4 sub depass mul def% /decaly #3 #1 sub depass mul def}% \begingroup% \psset{linestyle=\@styleTraitRappel,dash=\@dashTraitRappel,linewidth=\@widthTraitRappel}% \psline(! #1 #2)(! #1 decalx add #2 decaly add)% \psline(! #3 #4)(! #3 decalx add #4 decaly add)% \endgroup% } \define@key{Cotation}{styleTraitRappel}{\edef\@styleTraitRappel{#1}} \define@key{Cotation}{widthTraitRappel}{\edef\@widthTraitRappel{#1}} \define@key{Cotation}{dashTraitRappel}{\edef\@dashTraitRappel{#1}} \define@key{Cotation}{styleFleche}{\edef\@styleFleche{#1}} \define@key{Cotation}{dashFleche}{\edef\@dashFleche{#1}} \define@key{Cotation}{widthFleche}{\edef\@widthFleche{#1}} \define@key{Cotation}{decalFleche}{\edef\@decalFleche{#1}} \define@key{Cotation}{decalTexte}{\edef\@decalTexte{#1}} \define@key{Cotation}{depassTrait}{\edef\@depassTrait{#1}} \define@key{Cotation}{rotationTexte}{\edef\@rotationTexte{#1}} \newcommand*{\Cotation}{\@ifstar{\def\@@put{\lput*}\@cotation@}{\def\@@put{\aput}\@cotation@}}% \newcommand*{\@cotation@}[1][]{\@cotation@i[#1]}% \def\@cotation@i[#1](#2,#3)(#4,#5)#6{% % [styles](coordonnées début)(coordonnées fin){Texte} \presetkeys{Cotation}{% styleTraitRappel=dashed,dashTraitRappel=1.5pt 1.5pt,widthTraitRappel=0.4pt,% styleFleche=solid,dashFleche=\dashDefaut,widthFleche=0.7pt,% decalFleche=0.5,% decalTexte=0.5ex,% depassTrait=0.15,% rotationTexte=:U}{}% \setkeys{Cotation}{#1}% \@@TraitRappel{#2}{#3}{#4}{#5}{\@depassTrait}{\@decalFleche}% \pcline[offset=\@decalFleche,linestyle=\@styleFleche,dash=\@dashFleche,linewidth=\@widthFleche]{<->}(! #2 #3)(! #4 #5)% tracé de la flèche \setlength{\pslabelsep}{\@decalTexte}% définit la osition du texte avec le décalage \@@put{\@rotationTexte}{#6}% affichage du texte } \newcommand*{\@SiMoins}[1]{% est ce que #1 commence par un - ? \def\@TesteAvantMoins##1-##2\@nil{% \ifx\@empty##1\@empty \expandafter\@firstoftwo% \else% \expandafter\@secondoftwo% \fi% }% \@TesteAvantMoins#1-\@nil% } \newcommand*{\@MoinsEnNeg}[1]{% % si #1 est de la forme "-4" renvoie "4 neg" \@SiMoins{#1}% {\def\@@MoinsEnNeg-##1\@nil{##1 neg}}% si négatif -> conversion {\def\@@MoinsEnNeg##1\@nil{##1}}% sinon -> ne rien faire \edef\@Resultat@MoinsEnNeg{\@@MoinsEnNeg#1\@nil}% on transmet le résultat dans \@Resultat@MoinsEnNeg } \newcommand*{\@PlaceNom}[6]{% % #1 : nom du point % #2 : point de référence % #3 et #4 : abscisse et ordonnée % #5 et #6 : décalages horizontal et vertical \@MoinsEnNeg{#5}% \edef\@DecalH{\@Resultat@MoinsEnNeg}% \@MoinsEnNeg{#6}% \edef\@DecalV{\@Resultat@MoinsEnNeg}% #5 et #6 sont convertis en postscript et donc, \@@PlaceNom{#1}{#2}{#3}{#4}{\@DecalH}{\@DecalV}% on appelle la macro } \newcommand{\@@PlaceNom}[6]{% \rput[#2](! #3 #5 add #4 #6 add){#1}% } \define@key{NomPoints}{sizePointCentre}{\edef\@sizePointCentre{#1}} \define@key{NomPoints}{HdecalNomCentre}{\edef\@HdecalNomCentre{#1}} \define@key{NomPoints}{VdecalNomCentre}{\edef\@VdecalNomCentre{#1}} \define@key{NomPoints}{HdecalNomSommet}{\edef\@HdecalNomSommet{#1}} \define@key{NomPoints}{VdecalNomSommet}{\edef\@VdecalNomSommet{#1}} \define@key{NomPoints}{HdecalNomGauche}{\edef\@HdecalNomGauche{#1}} \define@key{NomPoints}{VdecalNomGauche}{\edef\@VdecalNomGauche{#1}} \define@key{NomPoints}{HdecalNomDroite}{\edef\@HdecalNomDroite{#1}} \define@key{NomPoints}{VdecalNomDroite}{\edef\@VdecalNomDroite{#1}} \newcommand*{\NomPoints}[8][]{% % Affiche les noms des points remarquables du cône, du Cylindre ou de la sphère % #1 : options % #2 : rayon R % #3 : coeff d'applatissement k % #4 : Hauteur H % #5 : Nom de l'extrémité diamètre gauche % #6 : Nom du centre du cercle % #7 : Nom de l'extrémité diamètre droit % #8 : Nom du sommet \ifdim #4cm<0cm% \edef\@PC{b}% \edef\@PS{t}% \else% \edef\@PC{br}% \edef\@PS{b}% \fi% \presetkeys{NomPoints}{% sizePointCentre=3pt,% HdecalNomGauche=0,VdecalNomGauche=0,% HdecalNomCentre=0,VdecalNomCentre=0,% HdecalNomDroite=0,VdecalNomDroite=0,% HdecalNomSommet=0,VdecalNomSommet=0}{} \setkeys{NomPoints}{#1}% \@PlaceNom{#5}{r}{#2 abs 0.2 add neg}{0}{\@HdecalNomGauche}{\@VdecalNomGauche}% nom gauche \@PlaceNom{#6}{\@PC}{#4 0 lt{0}{0.1 neg} ifelse}{0.1}{\@HdecalNomCentre}{\@VdecalNomCentre}% nom centre \@PlaceNom{#7}{l}{#2 abs 0.2 add}{0}{\@HdecalNomDroite}{\@VdecalNomDroite}% nom droite \@PlaceNom{#8}{\@PS}{0}{#4 0 lt{#4 abs 0.2 add neg}{#4 0.2 add} ifelse}{\@HdecalNomSommet}{\@VdecalNomSommet}% nom sommet \psdots[dotsize=\@sizePointCentre](0,0)% le point représentant le centre } \newcommand*{\@AngleDroit}[5][1]{% % [signe]{style}{épaisseur}{taille} \pstVerb{/yy {#1 0 lt {#5 neg}{#5} ifelse} def} \psline[linestyle=#2,dash=#3,linewidth=#4](! #5 0)(! #5 yy)(! 0 yy) } % _________________________________________________ %| | %| Ellipse | %|_________________________________________________| \define@key{Ellipse}{styleHautEllipse}{\edef\@styleHautEllipse{#1}}% \define@key{Ellipse}{dashHautEllipse}{\edef\@dashHautEllipse{#1}}% \define@key{Ellipse}{widthHautEllipse}{\edef\@widthHautEllipse{#1}}% \define@key{Ellipse}{styleBasEllipse}{\edef\@styleBasEllipse{#1}}% \define@key{Ellipse}{dashBasEllipse}{\edef\@dashBasEllipse{#1}}% \define@key{Ellipse}{widthBasEllipse}{\edef\@widthBasEllipse{#1}}% \newcommand*{\Ellipse}[4][]{% % #1 styles % #2 ordonnée de coupure (délimite 2 parties de l'Ellipse en styles de Trait différents) % #3 demi Axe horizontal >0 % #4 demi Axe vertical >0 \presetkeys{Ellipse}{% styleHautEllipse=dashed,dashHautEllipse=\dashDefaut,widthHautEllipse=\widthDefaut,% styleBasEllipse=solid,dashBasEllipse=\dashDefaut,widthBasEllipse=\widthDefaut}{}% \setkeys{Ellipse}{#1}% \@Ellipse{#2}{#3}{#4}% } \newcommand{\@Ellipse}[3]{% \pstVerb{% /AAsin {dup 1 gt {pop 90}{dup 1 neg lt {pop 90 neg}{asin} ifelse} ifelse} def% /AAngl #1 #3 div AAsin def}% \psellipticarc[linestyle=\@styleHautEllipse,dash=\@dashHautEllipse,linewidth=\@widthHautEllipse](0,0)(! #2 #3){! AAngl}{! 180 AAngl sub}% partie Haute \psellipticarc[linestyle=\@styleBasEllipse,dash=\@dashBasEllipse,linewidth=\@widthBasEllipse](0,0)(! #2 #3){! AAngl 180 add neg}{! AAngl}% partie Basse } % _________________________________________________ %| | %| Cone | %|_________________________________________________| \define@key{Cone}{styleHautCone}{\edef\@styleHautEllipse{#1}}% \define@key{Cone}{dashHautCone}{\edef\@dashHautEllipse{#1}}% \define@key{Cone}{widthHautCone}{\edef\@widthHautEllipse{#1}}% \define@key{Cone}{styleBasCone}{\edef\@styleBasEllipse{#1}}% \define@key{Cone}{dashBasCone}{\edef\@dashBasEllipse{#1}}% \define@key{Cone}{widthBasCone}{\edef\@widthBasEllipse{#1}}% \define@key{Cone}{styleGeneratriceCone}{\edef\@styleGeneratriceCone{#1}}% \define@key{Cone}{dashGeneratriceCone}{\edef\@dashGeneratriceCone{#1}}% \define@key{Cone}{widthGeneratriceCone}{\edef\@widthGeneratriceCone{#1}}% \newcommand*{\Cone}[4][]{% % #1 styles % #2 rayon R % #3 coeff d'aplatissement k % #4 Hauteur du cône H \ifdim#4pt<0pt% \def\@@styleHautCone{solid}% si H<0, l'ellipse est en trait plein \else% \def\@@styleHautCone{dashed}% si H>0, partie haute en pointillés \fi% \presetkeys{Cone}{% styleHautCone=\@@styleHautCone,dashHautCone=\dashDefaut,widthHautCone=\widthDefaut,% styleBasCone=solid,dashBasCone=\dashDefaut,widthBasCone=\widthDefaut,% styleGeneratriceCone=solid,dashGeneratriceCone=\dashDefaut,widthGeneratriceCone=\widthDefaut}{}% \setkeys{Cone}{#1}% \pstVerb{% /bb #2 #3 mul def% bb:=kR : demi grand Axe vertical /yy bb dup mul #4 div def% yy:=R^2*k^2/H : ordonnée du point de tangence /xx 1 yy #4 div sub sqrt #2 mul def% xx:=R*sqrt(1-yy/H) : abscisse du point de tangence }% \@Ellipse{yy}{#2}{bb}% tracé de la Base \psline[linestyle=\@styleGeneratriceCone,dash=\@dashGeneratriceCone,linewidth=\@widthGeneratriceCone](! xx neg yy)(! 0 #4)(! xx yy)% les génératrices } \define@key{SectionCone}{styleHautSectionCone}{\edef\@styleHautEllipse{#1}}% \define@key{SectionCone}{dashHautSectionCone}{\edef\@dashHautEllipse{#1}}% \define@key{SectionCone}{widthHautSectionCone}{\edef\@widthHautEllipse{#1}}% \define@key{SectionCone}{styleBasSectionCone}{\edef\@styleBasEllipse{#1}}% \define@key{SectionCone}{dashBasSectionCone}{\edef\@dashBasEllipse{#1}}% \define@key{SectionCone}{widthBasSectionCone}{\edef\@widthBasEllipse{#1}}% \newcommand*{\SectionCone}[5][]{% % #1 : styles % #2 : rayon R % #3 : coeff d'applatissement k % #4 : Hauteur H % #5 : ordonnée de la section z (0<z<H) \presetkeys{SectionCone}{% styleHautSectionCone=dashed,dashHautSectionCone=\dashDefaut,widthHautSectionCone=\widthDefaut,% styleBasSectionCone=solid,dashBasSectionCone=\dashDefaut,widthBasSectionCone=\widthDefaut% }{}% \setkeys{SectionCone}{#1}% \pstVerb{% /rr #2 #4 #5 sub mul #4 div def% rr = R*(H-z)/H) : rayon de la section /bb #3 rr mul def% bb:=k*rr : demi grand Axe vertical /yy bb dup mul #4 div def% yy:=bb^2/H : ordonnée du point de tangence }% \rput(! 0 #5){\@Ellipse{yy}{rr}{bb}}% } \define@key{TroncCone}{styleTroncCone}{\edef\@styleTroncCone{#1}} \define@key{TroncCone}{dashTroncCone}{\edef\@dashTroncCone{#1}} \define@key{TroncCone}{widthTroncCone}{\edef\@widthTroncCone{#1}} \define@key{TroncCone}{styleTraitCacheTroncCone}{\edef\@styleTraitCacheTroncCone{#1}} \define@key{TroncCone}{dashTraitCacheTroncCone}{\edef\@dashTraitCacheTroncCone{#1}} \define@key{TroncCone}{widthTraitCacheTroncCone}{\edef\@widthTraitCacheTroncCone{#1}} \newcommand{\TroncCone}[5][]{\@ifnextchar[{\@TroncCone[#1]{#2}{#3}{#4}{#5}}{\@TroncCone[#1]{#2}{#3}{#4}{#5}[#3]}}% \def\@TroncCone[#1]#2#3#4#5[#6]{% % #1 styles % #2 rayon disque bas R1 % #3 coeff d'aplatissement disque bas k1 % #4 hauteur du cône virtuel total H % #5 hauteur du tronc de cone (|#3|<|#2|) h (du même signe que H) % #6 coeff d'aplatissement disque haut k2 \presetkeys{TroncCone}{% styleTroncCone=solid,dashTroncCone=\dashDefaut,widthTroncCone=\widthDefaut,% styleTraitCacheTroncCone=dashed,dashTraitCacheTroncCone=\dashDefaut,widthTraitCacheTroncCone=\widthDefaut}{}% \setkeys{TroncCone}{#1}% \ifdim#4pt<0pt% \def\@styleHautGrandeEllise{\@styleTroncCone}% \def\@dashHautGrandeEllise{\@dashTroncCone}% \def\@widthHautGrandeEllise{\@widthTroncCone}% \def\@styleHautPetiteEllipse{\@styleTraitCacheTroncCone}% \def\@dashHautPetiteEllipse{\@dashTraitCacheTroncCone}% \def\@widthHautPetiteEllipse{\@widthTraitCacheTroncCone}% \else% \def\@styleHautGrandeEllise{\@styleTraitCacheTroncCone}% \def\@dashHautGrandeEllise{\@dashTraitCacheTroncCone}% \def\@widthHautGrandeEllise{\@widthTraitCacheTroncCone}% \def\@styleHautPetiteEllipse{\@styleTroncCone}% \def\@dashHautPetiteEllipse{\@dashTroncCone}% \def\@widthHautPetiteEllipse{\@widthTroncCone}% \fi% \pstVerb{% /bb #2 #3 mul def% bb :=k1*R1 : demi grand Axe vertical bas /yb bb dup mul #4 div def% yb :=R1^2*k1^2/H : ordonnée du point de tangence bas /xb 1 yb #4 div sub sqrt #2 mul def% xb :=R1*sqrt(1-yb/H) : abscisse du point de tangence bas /rh #2 #4 #5 sub mul #4 div def% rh :=R1*(H-h)/H) : rayon de la section haut /bh #6 rh mul def% bh :=k2*rh : demi grand Axe vertical haut /yh bh dup mul #4 #5 sub div def% yh :=bh^2/(H-h) : ordonnée du point de tangence haut /xh 1 yh #4 #5 sub div sub sqrt rh mul def% xh:=rh*sqrt(1-yh/(H-h)) : abscisse du point de tangence haut }% \Ellipse[% grande ellipse styleHautEllipse=\@styleHautGrandeEllise,% dashHautEllipse=\@dashHautGrandeEllise,% widthHautEllipse=\@widthHautGrandeEllise, styleBasEllipse=\@styleTroncCone,% dashBasEllipse=\@dashTroncCone,% widthBasEllipse=\@widthTroncCone]{yb}{#2}{bb}% \rput(! 0 #5){% \Ellipse[% petite ellipse styleHautEllipse=\@styleHautPetiteEllipse,% dashHautEllipse=\@dashHautPetiteEllipse,% widthHautEllipse=\@widthHautPetiteEllipse,% styleBasEllipse=\@styleTroncCone,% dashBasEllipse=\@dashTroncCone,% widthBasEllipse=\@widthTroncCone]{yh}{rh}{bh}}% \begingroup% \psset{linestyle=\@styleTroncCone,dash=\@dashTroncCone,linewidth=\@widthTroncCone}% \psline(! xb yb)(! xh yh #5 add)% les génératrices \psline(! xb neg yb)(! xh neg yh #5 add)% \endgroup% } \define@key{AxesCone}{styleAxeCone}{\edef\@styleAxeCone{#1}} \define@key{AxesCone}{dashAxeCone}{\edef\@dashAxeCone{#1}} \define@key{AxesCone}{widthAxeCone}{\edef\@widthAxeCone{#1}} \define@key{AxesCone}{styleDiametreCone}{\edef\@styleDiametreCone{#1}} \define@key{AxesCone}{dashDiametreCone}{\edef\@dashDiametreCone{#1}} \define@key{AxesCone}{widthDiametreCone}{\edef\@widthDiametreCone{#1}} \define@key{AxesCone}{styleCodageCone}{\edef\@styleCodageCone{#1}} \define@key{AxesCone}{dashCodageCone}{\edef\@dashCodageCone{#1}} \define@key{AxesCone}{widthCodageCone}{\edef\@widthCodageCone{#1}} \define@key{AxesCone}{tailleCodageCone}{\edef\@tailleCodageCone{#1}} \newcommand*{\AxesCone}[4][]{% % #1 : styles % #2 : rayon R % #3 : coeff d'applatissement k % #4 : Hauteur H \presetkeys{AxesCone}{% styleAxeCone=dashed,dashAxeCone=\dashDefaut,widthAxeCone=\widthDefaut,% styleDiametreCone=dashed,dashDiametreCone=\dashDefaut,widthDiametreCone=0.5pt,% styleCodageCone=solid,dashCodageCone=1.5pt 1.5pt,widthCodageCone=0.5pt,tailleCodageCone=0.2% }{}% \setkeys{AxesCone}{#1}% \@AxesCone{#2}{#3}{#4}% } \newcommand{\@AxesCone}[3]{% \psline[linestyle=\@styleAxeCone,dash=\@dashAxeCone,linewidth=\@widthAxeCone](! 0 0)(! 0 #3)% Axe \psline[linestyle=\@styleDiametreCone,dash=\@dashDiametreCone,linewidth=\@widthDiametreCone](! #1 neg 0)(! #1 0)% diamètre \@AngleDroit[#3]{\@styleCodageCone}{\@dashCodageCone}{\@widthCodageCone}{\@tailleCodageCone}% } \define@key{AxesSectionCone}{styleDiametreSectionCone}{\edef\@styleDiametreCone{#1}} \define@key{AxesSectionCone}{dashDiametreSectionCone}{\edef\@dashDiametreCone{#1}} \define@key{AxesSectionCone}{widthDiametreSectionCone}{\edef\@widthDiametreCone{#1}} \define@key{AxesSectionCone}{styleCodageSectionCone}{\edef\@styleCodageCone{#1}} \define@key{AxesSectionCone}{dashCodageSectionCone}{\edef\@dashCodageCone{#1}} \define@key{AxesSectionCone}{widthCodageSectionCone}{\edef\@widthCodageCone{#1}} \define@key{AxesSectionCone}{tailleCodageSectionCone}{\edef\@tailleCodageCone{#1}} \newcommand*{\AxesSectionCone}[5][]{% % #1 : styles % #2 : rayon R % #3 : coeff d'applatissement k % #4 : Hauteur H % #5 : ordonnée de la section z \edef\@styleAxeCone{none}% pas d'axe \edef\@dashAxeCone{\dashDefaut}% inutile puisque non tracé \edef\@widthAxeCone{\widthDefaut}% inutile puisque non tracé \presetkeys{AxesSectionCone}{% styleDiametreSectionCone=dashed,dashDiametreSectionCone=\dashDefaut,widthDiametreSectionCone=0.5pt,% styleCodageSectionCone=solid,dashCodageSectionCone=1pt 1pt,widthCodageSectionCone=0.5pt,tailleCodageSectionCone=0.2% }{}% \setkeys{AxesSectionCone}{#1}% \rput(! 0 #5){\@AxesCone{#2 #4 abs #5 abs sub mul #4 abs div}{#3}{#4}}% } \newcommand*{\NomSectionCone}[8][]{% % #1 : options % #2 : rayon R % #3 : coeff d'applatissement k % #4 : Hauteur H % #5 : ordonnée de la section z % #6 : Nom de l'extrémité diamètre gauche % #7 : Nom du centre du cercle % #8 : Nom de l'extrémité diamètre droit \rput(! 0 #5){% \NomPoints[#1]{#2 #4 abs #5 abs sub mul #4 abs div}{#3}{#4}{#6}{}{#8}{}% tous sauf le centre \NomPoints[#1]{1}{1}{1}{}{#7}{}{}% le centre }% } % _________________________________________________ %| | %| Cylindre | %|_________________________________________________| \define@key{Cylindre}{styleCylindre}{\edef\@styleCylindre{#1}} \define@key{Cylindre}{dashCylindre}{\edef\@dashCylindre{#1}} \define@key{Cylindre}{widthCylindre}{\edef\@widthCylindre{#1}} \define@key{Cylindre}{styleTraitCacheCylindre}{\edef\@styleTraitCacheCylindre{#1}} \define@key{Cylindre}{dashTraitCacheCylindre}{\edef\@dashTraitCacheCylindre{#1}} \define@key{Cylindre}{widthTraitCacheCylindre}{\edef\@widthTraitCacheCylindre{#1}} \newcommand*{\Cylindre}[4][]{% % #1 styles % #2 rayon % #3 coeff d'aplatissement % #4 Hauteur \presetkeys{Cylindre}{% styleCylindre=solid,dashCylindre=\dashDefaut,widthCylindre=\widthDefaut,% styleTraitCacheCylindre=dashed,dashTraitCacheCylindre=\dashDefaut,widthTraitCacheCylindre=\widthDefaut}{}% \setkeys{Cylindre}{#1}% \pstVerb{/rr #2 abs def /hh #4 abs def /bb rr #3 mul def}% \Ellipse[% styleHautEllipse=\@styleTraitCacheCylindre,dashHautEllipse=\@dashTraitCacheCylindre,widthHautEllipse=\@widthCylindre,% styleBasEllipse=\@styleCylindre,dashBasEllipse=\@dashCylindre,widthBasEllipse=\@widthCylindre]{0}{rr}{bb}% la Base \rput(! 0 #4){% \Ellipse[% styleHautEllipse=\@styleCylindre,dashHautEllipse=\@dashCylindre,widthHautEllipse=\@widthCylindre,% styleBasEllipse=\@styleCylindre,dashHautEllipse=\@dashCylindre,widthBasEllipse=\@widthCylindre]{0}{rr}{bb}}% le Haut \begingroup% \psset{linestyle=\@styleCylindre,linewidth=\@widthCylindre} \psline(! rr neg 0)(! rr neg #4)% \psline(! rr 0)(! rr #4)% les génératrices \endgroup% } \define@key{AxeCylindre}{styleAxeCylindre}{\edef\@styleAxeCone{#1}} \define@key{AxeCylindre}{dashAxeCylindre}{\edef\@dashAxeCone{#1}} \define@key{AxeCylindre}{widthAxeCylindre}{\edef\@widthAxeCone{#1}} \define@key{AxeCylindre}{styleDiametreCylindre}{\edef\@styleDiametreCone{#1}} \define@key{AxeCylindre}{dashDiametreCylindre}{\edef\@dashDiametreCone{#1}} \define@key{AxeCylindre}{widthDiametreCylindre}{\edef\@widthDiametreCone{#1}} \define@key{AxeCylindre}{styleCodageCylindre}{\edef\@styleCodageCone{#1}} \define@key{AxeCylindre}{dashCodageCylindre}{\edef\@dashCodageCone{#1}} \define@key{AxeCylindre}{widthCodageCylindre}{\edef\@widthCodageCone{#1}} \define@key{AxeCylindre}{tailleCodageCylindre}{\edef\@tailleCodageCone{#1}} \newcommand{\AxesCylindre}[4][]{% \presetkeys{AxeCylindre}{% styleAxeCylindre=dashed,dashAxeCylindre=\dashDefaut,widthAxeCylindre=\widthDefaut,% styleDiametreCylindre=dashed,dashDiametreCylindre=\dashDefaut,widthDiametreCylindre=0.5pt,% styleCodageCylindre=solid,dashCodageCylindre=1.5pt 1.5pt,widthCodageCylindre=0.5pt,tailleCodageCylindre=0.2% }{}% \setkeys{AxeCylindre}{#1}% \@AxesCone{#2}{#3}{#4}% \rput(! 0 #4){% \@AngleDroit[-1]{\@styleCodageCone}{\@dashCodageCone}{\@widthCodageCone}{\@tailleCodageCone}% \psline[linestyle=\@styleDiametreCone,dash=\@dashDiametreCone,linewidth=\@widthDiametreCone](! #2 neg 0)(! #2 0)}% diamètre } % _________________________________________________ %| | %| Sphère | %|_________________________________________________| \define@key{Sphere}{styleSphere}{\edef\@styleSphere{#1}} \define@key{Sphere}{dashSphere}{\edef\@dashSphere{#1}} \define@key{Sphere}{widthSphere}{\edef\@widthSphere{#1}} \define@key{Sphere}{styleBasEquateur}{\edef\@styleBasEllipse{#1}} \define@key{Sphere}{dashBasEquateur}{\edef\@dashBasEllipse{#1}} \define@key{Sphere}{widthBasEquateur}{\edef\@widthBasEllipse{#1}} \define@key{Sphere}{styleHautEquateur}{\edef\@styleHautEllipse{#1}} \define@key{Sphere}{dashHautEquateur}{\edef\@dashHautEllipse{#1}} \define@key{Sphere}{widthHautEquateur}{\edef\@widthHautEllipse{#1}} \newcommand*{\Sphere}[3][]{% % #1 styles % #2 rayon % #3 aplatissement de l'équateur \presetkeys{Sphere}{% styleSphere=solid,dashSphere=\dashDefaut,widthSphere=\widthDefaut,% styleBasEquateur=solid,dashBasEquateur=\dashDefaut,widthBasEquateur=\widthDefaut,% styleHautEquateur=dashed,dashHautEquateur=\dashDefaut,widthHautEquateur=\widthDefaut}{}% \setkeys{Sphere}{#1}% \pscircle[linestyle=\@styleSphere,dash=\@dashSphere,linewidth=\@widthSphere](! 0 0){#2}% \@Ellipse{0}{#2}{#3 #2 mul}% } \define@key{SectionSphere}{styleBasSectionSphere}{\edef\@styleBasEllipse{#1}} \define@key{SectionSphere}{dashBasSectionSphere}{\edef\@dashBasEllipse{#1}} \define@key{SectionSphere}{widthBasSectionSphere}{\edef\@widthBasEllipse{#1}} \define@key{SectionSphere}{styleHautSectionSphere}{\edef\@styleHautEllipse{#1}} \define@key{SectionSphere}{dashHautSectionSphere}{\edef\@dashhatEllipse{#1}} \define@key{SectionSphere}{widthHautSectionSphere}{\edef\@widthHautEllipse{#1}} \newcommand*{\SectionSphere}[4][]{% % #1 styles % #2 rayon % #3 aplatissement de la section % #4 côte de la section \presetkeys{SectionSphere}{% styleBasSectionSphere=solid,dashBasSectionSphere=\dashDefaut,widthBasSectionSphere=\widthDefaut,% styleHautSectionSphere=dashed,dashHautSectionSphere=\dashDefaut,widthHautSectionSphere=\widthDefaut}{}% \setkeys{SectionSphere}{#1}% \pstVerb{/rr #4 dup mul #3 dup mul 1 sub div #2 dup mul add sqrt def}% rayon de l'ellipse représentant la section \rput(! 0 #4){\@Ellipse{#3 dup mul #4 mul 1 #3 dup mul sub div}{rr}{rr #3 mul}}% } \define@key{AxesSphere}{styleAxeSphere}{\edef\@styleAxeSphere{#1}} \define@key{AxesSphere}{dashAxeSphere}{\edef\@dashAxeSphere{#1}} \define@key{AxesSphere}{widthAxeSphere}{\edef\@widthAxeSphere{#1}} \define@key{AxesSphere}{styleDiametreSphere}{\edef\@styleDiametreSphere{#1}} \define@key{AxesSphere}{dashDiametreSphere}{\edef\@dashDiametreSphere{#1}} \define@key{AxesSphere}{widthDiametreSphere}{\edef\@widthDiametreSphere{#1}} \define@key{AxesSphere}{styleCodageSphere}{\edef\@styleCodageSphere{#1}} \define@key{AxesSphere}{dashCodageSphere}{\edef\@dashCodageSphere{#1}} \define@key{AxesSphere}{widthCodageSphere}{\edef\@widthCodageSphere{#1}} \define@key{AxesSphere}{tailleCodageSphere}{\edef\@tailleCodageSphere{#1}} \newcommand{\AxesSphere}[3][]{\@ifnextchar[{\@AxeSphere[#1]{#2}{#3}}{\@AxeSphere[#1]{#2}{#3}[0.5]}}% \def\@AxeSphere[#1]#2#3[#4]{ % #1 styles % #2 rayon % #3 aplatissement équateur % #4 dépassement au pôles, par défaut 0.5 \presetkeys{AxesSphere}{% styleAxeSphere=dashed,dashAxeSphere=5pt 2pt 2pt 2pt,widthAxeSphere=0.5pt,% styleDiametreSphere=dashed,dashDiametreSphere=\dashDefaut,widthDiametreSphere=0.5pt,% styleCodageSphere=solid,dashCodageSphere=1.5pt 1.5pt,widthCodageSphere=0.5pt,tailleCodageSphere=0.2}{} \setkeys{AxesSphere}{#1}% \psline[linestyle=\@styleAxeSphere,dash=\@dashAxeSphere,linewidth=\@widthAxeSphere](! 0 #2 #4 add neg)(! 0 #2 #4 add)% Axe \psline[linestyle=\@styleDiametreSphere,dash=\@dashDiametreSphere,linewidth=\@widthDiametreSphere](! #2 neg 0)(! #2 0)% diamètre \@AngleDroit[1]{\@styleCodageSphere}{\@dashCodageSphere}{\@widthCodageSphere}{\@tailleCodageSphere}% codage } \define@key{AxesSectionSphere}{styleDiametreSectionSphere}{\edef\@styleDiametreCone{#1}} \define@key{AxesSectionSphere}{dashDiametreSectionSphere}{\edef\@dashDiametreCone{#1}} \define@key{AxesSectionSphere}{widthDiametreSectionSphere}{\edef\@widthDiametreCone{#1}} \define@key{AxesSectionSphere}{styleCodageSectionSphere}{\edef\@styleCodageCone{#1}} \define@key{AxesSectionSphere}{dashCodageSectionSphere}{\edef\@dashCodageCone{#1}} \define@key{AxesSectionSphere}{widthCodageSectionSphere}{\edef\@widthCodageCone{#1}} \define@key{AxesSectionSphere}{tailleCodageSectionSphere}{\edef\@tailleCodageCone{#1}} \newcommand*{\AxesSectionSphere}[4][]{% % #1 styles % #2 rayon % #3 coeff d'aplatissement % #4 côte de la section \presetkeys{AxesSectionSphere}{% styleDiametreSectionSphere=dashed,dashDiametreSectionSphere=\dashDefaut,widthDiametreSectionSphere=0.5pt,% styleCodageSectionSphere=solid,dashCodageSectionSphere=\dashDefaut,widthCodageSectionSphere=0.5pt,tailleCodageSectionSphere=0.2}{}% \setkeys{AxesSectionSphere}{#1}% \edef\@styleAxeCone{none}% pas d'axe \edef\@dashAxeCone{\dashDefaut}% inutile puisque non tracé \edef\@widthAxeCone{\widthDefaut}% inutile puisque non tracé \rput(! 0 #4){\@AxesCone{#4 dup mul #3 dup mul 1 sub div #2 dup mul add sqrt}{#3}{#2}}% } \newcommand*{\NomSectionSphere}[7][]{% % #1 : options % #2 : rayon R % #3 : coeff d'applatissement k % #4 : ordonnée de la section z % #5 : Nom de l'extrémité diamètre gauche % #6 : Nom du centre du cercle % #7 : Nom de l'extrémité diamètre droit \rput(! 0 #4){\NomPoints[#1]{#4 dup mul #3 dup mul 1 sub div #2 dup mul add sqrt}{#3}{1}{#5}{#6}{#7}{}}% } % _________________________________________________ %| | %| Calotte sphérique | %|_________________________________________________| \define@key{Calotte}{styleCalotte}{\edef\@styleCalotte{#1}} \define@key{Calotte}{dashCalotte}{\edef\@dashCalotte{#1}} \define@key{Calotte}{widthCalotte}{\edef\@widthCalotte{#1}} \define@key{Calotte}{styleBasCalotte}{\edef\@styleBasEllipse{#1}} \define@key{Calotte}{dashBasCalotte}{\edef\@dashBasEllipse{#1}} \define@key{Calotte}{widthBasCalotte}{\edef\@widthBasEllipse{#1}} \define@key{Calotte}{styleHautCalotte}{\edef\@styleHautEllipse{#1}} \define@key{Calotte}{dashHautCalotte}{\edef\@dashHautEllipse{#1}} \define@key{Calotte}{widthHautCalotte}{\edef\@widthHautEllipse{#1}} \newcommand*{\Calotte}[4][]{\@ifnextchar[{\@Calotte[#1]{#2}{#3}{#4}}{\@Calotte[#1]{#2}{#3}{#4}[B]}}% \def\@Calotte[#1]#2#3#4[#5]{% % #1 styles % #2 rayon Sphere % #3 aplatissement de la section % #4 côte de la section % #5 optionnel [H] ou [B] selon que l'on veut la partie [H]aute ou [B]asse restante après coupe par un plan. Par défaut B \presetkeys{Calotte}{% dashHautCalotte=\dashDefaut,widthHautCalotte=\widthDefaut,% styleCalotte=solid,dashCalotte=\dashDefaut,widthCalotte=\widthDefaut,% styleBasCalotte=solid,dashBasCalotte=\dashDefaut,widthBasCalotte=\widthDefaut}{}% \pstVerb{% /RR #2 dup mul def /kk #3 dup mul def% /zz #4 dup mul def% /rr zz kk 1 sub div RR add sqrt def% rayon de l'Ellipse représentant la section /yy #4 1 kk sub div def% ordonnée du point de tangence entre Ellipse et cercle /AAangle yy #2 div asin def% }% \ifx B#5% \presetkeys{Calotte}{styleHautCalotte=solid}{}% \pstVerb{% /debut AAangle 180 add neg def% /fin AAangle def}% \fi% \ifx H#5% \presetkeys{Calotte}{styleHautCalotte=dashed}{}% \pstVerb{% /debut AAangle def% /fin 180 AAangle sub def}% \fi% \setkeys{Calotte}{#1}% \psellipticarc[linestyle=\@styleCalotte,dash=\@dashCalotte,linewidth=\@widthCalotte](! 0 0)(! #2 #2){! debut}{! fin}% \rput(! 0 #4){\@Ellipse{yy #4 sub}{rr}{rr #3 mul}}% } \makeatother