%##################################################################################### %######################## MACROS : SOLIDES À SURFACES COURBES ######################## %######################## v 0.2 du 8/1/2008 ######################## %##################################################################################### % % Auteur : Christian TELLECHEA % Site : www.bricamath.net % Trace une flèche de cotation parallèle à une ligne, et ajoute du texte et des traits de rappel \makeatletter \newcommand*{\Cotation}{\@ifstar{\def\MonOp{\lput*}\cotation@}{\def\MonOp{\aput}\cotation@}} \newcommand*{\cotation@}[1][linewidth=0.4pt,linestyle=dashed,dash=1pt 1pt]{\@ifnextchar[{\cotation@i[#1]}{\cotation@i[#1][linewidth=1pt]}} \def\cotation@i[#1][#2](#3,#4)(#5,#6)#7#8{\@ifnextchar[{\cotation@ii[#1][#2](#3,#4)(#5,#6){#7}{#8}}{\cotation@ii[#1][#2](#3,#4)(#5,#6){#7}{#8}[0.7ex]}} \def\cotation@ii[#1][#2](#3,#4)(#5,#6)#7#8[#9]{% % #1 : optionnel = style des traits de rappel de cotation % #2 : optionnel = style des traits de la flèche % (#3,#4) : coordonnées du départ de la ligne à côter % (#5,#6) : coordonnées de fin de la ligne à côter % #7 : décalage de la flèche par rapport à la ligne à côter (positif, négatif ou nul) % #8 : texte % #9 : optionnel = décalage texte. Par défaut 0.7ex \pstVerb{% /signe {dup 0 eq {pop 0}{dup 0 lt {pop 1 neg}{pop 1} ifelse} ifelse} def% renvoie -1 0 ou 1 /depass 0.15 #7 abs add #7 signe mul #5 #3 sub dup mul #6 #4 sub dup mul add sqrt div def% /decalx #4 #6 sub depass mul def% /decaly #5 #3 sub depass mul def}% \psline[#1](! #3 #4)(! #3 decalx add #4 decaly add)% traits de rappel \psline[#1](! #5 #6)(! #5 decalx add #6 decaly add)% \pcline[offset=#7,#2]{<->}(! #3 #4)(! #5 #6)% tracé de la flèche \setlength{\pslabelsep}{#9}% on positionne le texte avec le décalage \MonOp{:U}{#8}% affichage du texte } \newcommand*{\TraceEllipse}{\@ifstar{\TraceEllipse@{linestyle=none}}{\TraceEllipse@{linestyle=dashed}}} \newcommand*{\TraceEllipse@}[1]{\@ifnextchar[{\TraceEllipse@i{#1}}{\TraceEllipse@i{#1}[linewidth=1pt]}} \def\TraceEllipse@i#1[#2]#3#4#5{% % #1 : argument dépendant de l'étoile ou non (rien ou pointillés) % #2 : optionnel = épaisseur du trait, par défaut 1pt % #3 : ordonnée positive au delà de laquelle on met des pointillés % #4 : demi axe horizontal >0 % #5 : demi axe vertical >0 \pstVerb{/AAsin {dup 1 gt {pop 90}{dup 1 neg lt {pop 90 neg}{asin} ifelse} ifelse} def /AAngl #3 #5 div AAsin def}% \psellipticarc[#2,#1](0,0)(! #4 #5){! AAngl}{! 180 AAngl sub}% pointillés éventuellement \psellipticarc[linestyle=solid,#2](0,0)(! #4 #5){! AAngl 180 add neg}{! AAngl}% \ignorespaces } \newcommand*{\TraceCone}{\@ifstar{\def\OpEllipse{\TraceEllipse*}\TraceCone@}{\def\OpEllipse{\TraceEllipse}\TraceCone@}} \newcommand*{\TraceCone@}[4][linewidth=1pt]{% Trace un cône dont la base horizontale est centrée sur l'origine % #1 : optionnel = épaisseur du trait, par défaut 1pt % #2 : rayon R > 0 % #3 : coeff d'aplatissement k > 0 % #4 : hauteur H (valeur signée : si H < 0 cône vu de dessus, pas de pointillé pour l'ellipse) \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 /ycoupe {#4 0 lt {bb}{yy} ifelse} def% si H négatif, on empêche les pointillés }% \OpEllipse[#1]{ycoupe}{#2}{bb}% tracé de la base \psline[#1](! xx neg yy)(! 0 #4)(! xx yy)% les génératrices extrêmes vues \ignorespaces } \makeatother \newcommand*{\NomPoints}[8][dotsize=3pt]{% Affiche les noms des points remarquables du cône ou du cylindre % #1 : optionnel = style point pour le centre de la base, par défaut [dotsize=3pt] % #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 \pstVerb{% /Corr 0.12 def% correction à apporter pour les placements /OrdSommet #4 abs Corr 1.6 mul add def% = |#4| + 1.6*Corr /xCentre {#4 0 lt {0}{Corr neg} ifelse} def% /ySommet {#4 0 lt {OrdSommet neg}{OrdSommet} ifelse} def% /xDiametre #2 Corr add def% }% \ifdim #4cm<0cm\def\PC{b}\def\PS{t}\else\def\PC{br}\def\PS{b}\fi \rput[r](! xDiametre neg 0){#5} \rput[\PC](! xCentre Corr){#6} \rput[l](! xDiametre 0){#7} \rput[\PS](! 0 ySommet){#8} \psdots[#1](0,0) } \makeatletter \newcommand*{\AxesFigure}[1][linewidth=0.7pt,linestyle=dashed]{\@ifnextchar[{\AxesFigure@i[#1]}{\AxesFigure@i[#1][linewidth=0.5pt,linestyle=dashed]}} \def\AxesFigure@i[#1][#2]{\@ifnextchar[{\AxesFigure@ii[#1][#2]}{\AxesFigure@ii[#1][#2][linewidth=0.5pt]}} \def\AxesFigure@ii[#1][#2][#3]{\@ifnextchar[{\AxesFigure@iii[#1][#2][#3]}{\AxesFigure@iii[#1][#2][#3][0.2]}} \def\AxesFigure@iii[#1][#2][#3][#4]#5#6#7{% % #1 : optionnel style des traits de l'axe. Par défaut [linewidth=0.7pt,linestyle=dashed] % #2 : optionnel style des traits du diamètre bas. Par défaut [linewidth=0.5pt,linestyle=dashed] % #3 : optionnel style des traits codage angle droit. Par défaut [linewidth=0.5pt] % #4 : optionnel taille du codage de l'angle droit. Par défaut [0.2] % #5 : rayon R % #6 : coeff d'applatissement k % #7 : hauteur H \psline[#1](! 0 0)(! 0 #7) \psline[#2](! #5 neg 0)(! #5 0) \pstVerb{/yy {#7 0 lt {#4 neg}{#4} ifelse} def} \psline[#3](! 0 yy)(! #4 yy)(! #4 0) } \newcommand*{\SectionCone}{\@ifstar{\def\OpEllipse{\TraceEllipse*}\SectionCone@}{\def\OpEllipse{\TraceEllipse}\SectionCone@}} \newcommand*{\SectionCone@}[5][linewidth=1pt]{% Affiche la section du cône % #1 : optionnel = épaisseur du trait, par défaut 1pt % #2 : rayon R % #3 : coeff d'applatissement k % #4 : hauteur H % #5 : ordonnée de la section z (0<z<H) \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){\OpEllipse[#1]{bb dup mul #4 div}{rr}{bb}} } \newcommand*{\AxesSectionCone}[1][linewidth=0.5pt,linestyle=dashed]{\@ifnextchar[{\AxesSectionCone@i[#1]}{\AxesSectionCone@i[#1][linewidth=0.5pt]}} \def\AxesSectionCone@i[#1][#2]{\@ifnextchar[{\AxesSectionCone@ii[#1][#2]}{\AxesSectionCone@ii[#1][#2][0.2]}} \def\AxesSectionCone@ii[#1][#2][#3]#4#5#6#7{% % #1 : style des traits du diamètre. Par défaut : linewidth=0.7pt,linestyle=dashed % #2 : style des traits codage angle droit. Par défaut : linewidth=0.5pt % #3 : taille du codage de l'angle droit. Par défaut : 0.2 % #4 : rayon R % #5 : coeff d'applatissement k % #6 : hauteur H % #7 : ordonnée de la section z \rput(! 0 #7){\AxesFigure[linestyle=none][#1][#2][#3]{#4 #6 abs #7 abs sub mul #6 abs div}{#5}{#6}}% } \makeatother \newcommand*{\NomSectionCone}[8][dotsize=3pt]{% % #1 : optionnel = style point pour le centre de la base, par défaut [dotsize=3pt] % #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 div}{#3}{#4}{#6}{#7}{#8}{}} } \makeatletter \newcommand*{\TraceCylindre}{\@ifstar{\def\OpEllipse{\TraceEllipse*}\TraceCylindre@}{\def\OpEllipse{\TraceEllipse}\TraceCylindre@}} \newcommand*{\TraceCylindre@}[4][linewidth=1pt]{% % #1 : optionnel = épaisseur du trait, par défaut 1pt % #2 : rayon > 0 % #3 : coeff aplatissement % #4 : hauteur > 0 \pstVerb{/rr #2 abs def /hh #3 abs def /bb rr bb mul def} \OpEllipse[#1]{0}{rr}{bb}% la base \psellipse[#1](! 0 #4)(! rr bb)% le haut \psline[#1](! rr neg 0)(! rr neg #4)\psline[#1](! rr 0)(! rr #4)% les génératrices \ignorespaces } \newcommand*{\TraceSphere}{\@ifstar{\def\OpEllipse{\TraceEllipse*}\TraceSphere@}{\def\OpEllipse{\TraceEllipse}\TraceSphere@}} \newcommand*{\TraceSphere@}[1][linewidth=1pt]{\@ifnextchar[{\TraceSphere@i[#1]}{\TraceSphere@i[#1][linewidth=0.7pt]}} \def\TraceSphere@i[#1][#2]#3#4{% % #1 : optionnel : style de traits de la sphère (par défaut linewidth=1pt) % #2 : optionnel : style de traits de l'équateur (par défaut linewidth=0.7pt) % #3 : Rayon R % #4 : aplatissement de l'équateur \pscircle[#1](! 0 0){#3} \OpEllipse[#2]{0}{#3}{#4 #3 mul} } \newcommand*{\AxesSphere}[1][linewidth=0.7pt,linestyle=dashed]{\@ifnextchar[{\AxesSphere@i[#1]}{\AxesSphere@i[#1][linewidth=0.5pt,linestyle=dashed]}} \def\AxesSphere@i[#1][#2]{\@ifnextchar[{\AxesSphere@ii[#1][#2]}{\AxesSphere@ii[#1][#2][linewidth=0.5pt]}} \def\AxesSphere@ii[#1][#2][#3]{\@ifnextchar[{\AxesSphere@iii[#1][#2][#3]}{\AxesSphere@iii[#1][#2][#3][0.2]}} \def\AxesSphere@iii[#1][#2][#3][#4]#5#6{% % #1 : style traits axe passant par les pôles % #2 : style traits diamètre équateur % #3 : style traits codage angle droit % #4 : taille codage angle droit % #5 : Rayon R % #6 : aplatissement équateur \AxesFigure[#1][#2][#3][#4]{#5}{0.5}{#5 1.1 mul} \AxesFigure[#1][linestyle=none][linestyle=none][#4]{#5}{0.5}{#5 1.1 mul neg} } \newcommand*{\SectionSphere}{\@ifstar{\def\OpEllipse{\TraceEllipse*}\SectionSphere@}{\def\OpEllipse{\TraceEllipse}\SectionSphere@}} \newcommand*{\SectionSphere@}[4][linewidth=0.7pt]{% % #1 : optionnel = style du trait % #2 : Rayon de la sphère R % #3 : aplatissement de la section % #4 : côte de la section z \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){\OpEllipse[#1]{#3 dup mul #4 mul 1 #3 dup mul sub div}{rr}{rr #3 mul}}% } \newcommand*{\AxesSectionSphere}[1][linewidth=0.5pt,linestyle=dashed]{\@ifnextchar[{\AxesSectionSphere@i[#1]}{\AxesSectionSphere@i[#1][linewidth=0.5pt]}} \def\AxesSectionSphere@i[#1][#2]{\@ifnextchar[{\AxesSectionSphere@ii[#1][#2]}{\AxesSectionSphere@ii[#1][#2][0.2]}} \def\AxesSectionSphere@ii[#1][#2][#3]#4#5#6{% % #1 : style des traits du diamètre. Par défaut : linewidth=0.7pt,linestyle=dashed % #2 : style des traits codage angle droit. Par défaut : linewidth=0.5pt % #3 : taille du codage de l'angle droit. Par défaut : 0.2 % #4 : rayon R % #5 : coeff d'applatissement k % #6 : ordonnée de la section z \rput(! 0 #6){\AxesFigure[linestyle=none][#1][#2][#3]{#6 dup mul #5 dup mul 1 sub div #4 dup mul add sqrt}{#5}{#4}}% } \makeatother \newcommand*{\NomSectionSphere}[7][dotsize=3pt]{% % #1 : optionnel = style point pour le centre de la base, par défaut [dotsize=3pt] % #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}{}} } \makeatletter \newcommand*{\Calotte}{\@ifstar{\def\OpEllipse{\TraceEllipse*}\Calotte@}{\def\OpEllipse{\TraceEllipse}\Calotte@}} \newcommand*{\Calotte@}[1][B]{\@ifnextchar[{\Calotte@i[#1]}{\Calotte@i[#1][linewidth=1pt]}} \def\Calotte@i[#1][#2]#3#4#5{% % #1 : optionnel [H] ou [B] selon que l'on veut la partie Haute ou Basse restante après coupe par un plan. Par défaut B % #2 : optionnel : style de trait de la calotte. Par défaut linewidth=1pt % #3 : Rayon de la sphere R % #4 : aplatissement de la section k % #5 : côte de la section z \pstVerb{% /RR #3 dup mul def /kk #4 dup mul def /zz #5 dup mul def% /rr zz kk 1 sub div RR add sqrt def% rayon de l'ellipse représentant la section /yy #5 1 kk sub div def% ordonnée du point de tangence entre ellipse et cercle /AAangle yy #3 div asin def% }% \ifx B#1% \psellipticarc[linestyle=solid,#2](! 0 0)(! #3 #3){! AAangle 180 add neg}{! AAangle} \rput(! 0 #5){\OpEllipse[#2]{rr #4 mul}{rr}{rr #4 mul}}% \fi \ifx H#1% \psellipticarc[linestyle=solid,#2](! 0 0)(! #3 #3){! AAangle}{! 180 AAangle sub} \rput(! 0 #5){\OpEllipse[#2]{yy #5 sub}{rr}{rr #4 mul}}% \fi } \makeatother