Retour

Source de espace.tex

Fichier TeX
%#####################################################################################
%######################## MACROS : SOLIDES À SURFACES COURBES ########################
%########################        v 0.1 du 5/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]{yy}{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 #2 dup mul def /kk #3 dup mul def /zz #4 dup mul def%
		/rr kk kk 1 sub div zz mul kk div RR add sqrt def% rayon de l'ellipse représentant la section
		/yy kk #4 mul 1 kk sub div def% point de tangence entre ellipse et cercle
	}%
	\rput(! 0 #4){\OpEllipse[#1]{yy}{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
	\pstVerb{%
		/RR #4 dup mul def /kk #5 dup mul def /zz #6 dup mul def%
		/rr kk kk 1 sub div zz mul kk div RR add sqrt def% rayon de l'ellipse représentant la section
	}%
	\rput(! 0 #6){\AxesFigure[linestyle=none][#1][#2][#3]{rr}{#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
	\pstVerb{%
		/RR #2 dup mul def /kk #3 dup mul def /zz #4 dup mul def%
		/rr kk kk 1 sub div zz mul kk div RR add sqrt def% rayon de l'ellipse représentant la section
	}%
	\rput(! 0 #4){\NomPoints[#1]{rr}{#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 kk kk 1 sub div zz mul kk 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