\section {Sectionner un solide par un plan} \subsection{Tracer l'intersection d'un plan et d'un solide} \subsubsection{Les paramètres} C'est l'option \Cadre{intersectionplan=\{[a b c d]\}} qui permet de tracer l'intersection d'un plan et d'un solide. L'argument entre les crochets contient les paramètres du plan affine ayant pour équation : $ax+by+cz+d=0$. Il est possible de dessiner l'intersection du solide avec plusieurs plans en plaçant à la suite les paramètres de ces plans comme dans l'exemple suivant. Le tracé est activé avec \Cadre{intersectiontype=0} ou toute autre valeur $\geq0$. La couleur du tracé est choisie dans l'option \Cadre{intersectioncolor=(bleu) (rouge) etc.}. On donne successivement dans l'ordre, l'épaisseur de chaque tracé par \Cadre{intersectionlinewidth=1 2 etc.} (dimensions en picas). Le tracé en traits discontinus des parties cachées sera activé avec \Cadre{action=draw}. \begin{LTXexample}[width=6cm] \begin{pspicture}(-3,-2)(3,7) \psset{lightsrc=viewpoint,viewpoint=50 20 20 rtp2xyz,Decran=50} \psset{lightsrc=viewpoint} \psSolid[object=cylindre, ngrid=1 24, r=2, fillcolor=yellow!25, intersectiontype=0, intersectionplan={ [0 0 1 -1] [0 0 1 -2] [0 0 1 -3] [0.894 0 0.447 -1.8]}, intersectioncolor=(bleu) (rouge) (vert) (rose), intersectionlinewidth=1 1.5 1.8 2.2] \axesIIID(2,2,6)(3,3,7) \end{pspicture} \end{LTXexample} \subsection{Coupes d'un solide} \subsubsection{Coupe du solide plein} L'objet étudié est un cylindre. Le plan qui coupe l'objet sera défini par : \begin{gbar} \begin{verbatim} plansepare={[a b c d]} \end{verbatim} \end{gbar} Les deux parties ne seront pas tracées mais mises en mémoire avec le nom commun \Cadre{name=partiescylindre} : \begin{gbar} \begin{verbatim} \psset{solidmemory} \psSolid[object=cylindre, r=2,h=6 ngrid=6 24, plansepare={[0.707 0 0.707 0]}, name=partiescylindre, action=none](0,0,-3) \end{verbatim} \end{gbar} Puis affichées séparément avec leur indice respectif. C'est le sens de la normale du plan de séparation qui détermine le numérotage des deux parties : \Cadre{0} celle qui est \textit{au-dessus} de la normale et \Cadre{1} celle qui est \textit{au-dessous}. Pour les deux parties, la face de découpe porte le numéro \Cadre{0}. S'il y a plusieurs faces de découpe, comme dans le cas du tore elles sont numérotées \Cadre{0, 1 etc.} \begin{gbar} \begin{verbatim} \psSolid[object=load, load=partiescylindre1, fillcolor={[rgb]{0.7 1 0.7 }}, fcol=0 (1 1 0.7 setrgbcolor)] \psSolid[object=load, load=partiescylindre0,RotZ=60, fillcolor={[rgb]{0.7 1 0.7 }}, fcol=0 (1 1 0.7 setrgbcolor)](0,4,0) \end{verbatim} \end{gbar} \begin{center} \begin{pspicture}(-4,-5)(7,4) \psframe(-4,-5)(7,4) \psset{viewpoint=50 -40 10 rtp2xyz,Decran=50,linecolor=darkgray} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille,action=draw, base=-3 5 -3 5, linecolor=red](0,0,-3) \psset{solidmemory} \psSolid[object=cylindre, r=2,h=6, ngrid=6 24, plansepare={[0.707 0 0.707 0]}, name=partiescylindre, action=none](0,0,-3) \psSolid[object=load, load=partiescylindre1, fillcolor={[rgb]{0.7 1 0.7 }}, fcol=0 (1 1 0.7 setrgbcolor)] \psSolid[object=load, load=partiescylindre0,RotZ=90, fillcolor={[rgb]{0.7 1 0.7 }}, fcol=0 (1 1 0.7 setrgbcolor)](0,4,0) \psSolid[object=plan,action=draw, definition=equation, args={[0.707 0 0.707 0] 90}, base=-2 2 -3 3,planmarks,showBase] \axesIIID(0,0,0)(2.5,2.5,3.5) \end{pspicture} \end{center} \subsubsection{Coupe du solide creux} Les options \Cadre{rm=0,hollow} permettent, l'une d'enlever la face de découpe \Cadre{rm=0} et l'autre, \Cadre{hollow} de voir l'intérieur. \begin{center} \begin{pspicture}(-4,-5)(7,4) \psframe(-4,-5)(7,4) \psset{viewpoint=50 -40 10 rtp2xyz,Decran=50,linecolor=darkgray} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille,action=draw, base=-3 5 -3 5, linecolor=red](0,0,-3) \psset{solidmemory} \psSolid[object=cylindre, r=2,h=6, ngrid=6 24, plansepare={[0.707 0 0.707 0.5]}, name=partiescylindre, action=none](0,0,-3) \psSolid[object=load, load=partiescylindre1, fillcolor={[rgb]{0.7 1 0.7 }}, rm=0,hollow, incolor={[rgb]{1 1 0.7}}] \psSolid[object=load, load=partiescylindre0,RotZ=90, fillcolor={[rgb]{0.7 1 0.7 }}, rm=0,hollow, incolor={[rgb]{1 1 0.7}}](0,4,0) \psSolid[object=plan,action=draw, definition=equation, args={[0.707 0 0.707 0.5] 90}, base=-2 2 -3 3,planmarks,showBase] \composeSolid \end{pspicture} \end{center} \subsection{Tranche d'une pyramide} \subsubsection{Marquage des lignes de niveau et première découpe} Cette pyramide est créée comme un \Cadre{object=new} en donnant le liste des coordonnées des sommets et des faces. \begin{gbar} \begin{verbatim} sommets= 0 -2 0 %% 0 -2 0 0 %% 1 0 4 0 %% 2 4 0 0 %% 3 0 0 5, %% 4 faces={ [3 2 1 0] [4 0 3] [4 3 2] [4 2 1] } \end{verbatim} \end{gbar} Dans une première étape, facultative, on marque les lignes de découpe. \begin{gbar} \begin{verbatim} intersectiontype=0, intersectionplan={[0 0 1 -1] [0 0 1 -2]}, intersectionlinewidth=1 2, intersectioncolor=(bleu) (rouge) \end{verbatim} \end{gbar} Et on coupe la pointe supérieure, en dessinant aussi le plan de coupe. \begin{gbar} \begin{verbatim} \psSolid[object=new, sommets= 0 -2 0 %% 0 -2 0 0 %% 1 0 4 0 %% 2 4 0 0 %% 3 0 0 5, %% 4 faces={ [3 2 1 0] [4 0 3] [4 3 2] [4 2 1] [4 1 0]}, plansepare={[0 0 1 -2]}, name=firstSlice, action=none] \psSolid[object=load,action=draw*, load=firstSlice1] \psSolid[object=plan, definition=equation, args={[0 0 1 -2]}, base=-3 5 -3 5,action=draw] \end{verbatim} \end{gbar} Pour ne pas avoir à chaque fois à réécrire sommets et faces de la pyramide, on enregistre ses données dans les fichiers : \begin{itemize} \item Pyramid-couleurs.dat \item Pyramid-faces.dat \item Pyramid-sommets.dat \item Pyramid-io.dat \end{itemize} grâce à la commande \Cadre{action=writesolid} : \begin{gbar} \begin{verbatim} \psSolid[object=new, sommets= 0 -2 0 %% 0 -2 0 0 %% 1 0 4 0 %% 2 4 0 0 %% 3 0 0 5, %% 4 faces={ [3 2 1 0] [4 0 3] [4 3 2] [4 2 1] [4 1 0] },file=Pyramid,fillcolor=yellow!50, action=writesolid] \end{verbatim} \end{gbar} Toutes ces lignes pourront alors être supprimées et par la suite, on appellera ces données avec la commande : \begin{gbar} \begin{verbatim} \psSolid[object=datfile, file=Pyramid] \end{verbatim} \end{gbar} \begin{center} \psset{unit=0.75} \begin{pspicture}(-5,-2)(5,7) \psframe(-5,-2)(5,7) \psset{viewpoint=50 20 10 rtp2xyz,Decran=50} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-3 5 -3 5, linecolor=gray] %% create the pyramid with base area in xy-plane \psSolid[object=new, sommets= 0 -2 0 %% 0 -2 0 0 %% 1 0 4 0 %% 2 4 0 0 %% 3 0 0 5, %% 4 faces={ [3 2 1 0] [4 0 3] [4 3 2] [4 2 1] [4 1 0] }, action=draw*, intersectiontype=0, intersectionplan={[0 0 1 -1] [0 0 1 -2]}, intersectionlinewidth=1 2, intersectioncolor=(bleu) (rouge)] \axesIIID[linecolor=blue](4,4,5)(5,5,6) \end{pspicture} \hfill \begin{pspicture}(-5,-2)(5,7) \psframe(-5,-2)(5,7) \psset{viewpoint=50 20 10 rtp2xyz,Decran=50} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-3 5 -3 5, linecolor=gray] \psset{solidmemory} %% create the pyramid with base area in xy-plane \psSolid[object=new, sommets= 0 -2 0 %% 0 -2 0 0 %% 1 0 4 0 %% 2 4 0 0 %% 3 0 0 5, %% 4 faces={ [3 2 1 0] [4 0 3] [4 3 2] [4 2 1] [4 1 0] }, plansepare={[0 0 1 -2]}, name=firstSlice, action=none] \psSolid[object=load,action=draw*, load=firstSlice1] \psSolid[object=plan, definition=equation, args={[0 0 1 -2]}, base=-3 5 -3 5,action=draw] \axesIIID[linecolor=blue](4,4,2)(5,5,6) \end{pspicture} \end{center} \subsubsection{Deuxième découpe et son insertion dans la pyramide} Après avoir ôté la partie supérieure \Cadre{firstSlice0} (elle n'apparaît plus), on découpe dans la partie restante, nommée \Cadre{firstSlice1}, la base de la pyramide en gardant le haut \Cadre{secondSlice0}, puis on enregistre la tranche de pyramide restante afin de l'insérer dans la pyramide en fil de fer~: \begin{gbar} \begin{verbatim} \psset{solidmemory} \psSolid[object=datfile, file=Pyramid, plansepare={[0 0 1 -2]}, name=firstSlice, action=none] \psSolid[object=load, load=firstSlice1, action=none, plansepare={[0 0 1 -1]}, name=secondSlice] \psSolid[object=load,action=draw*, load=secondSlice0] \psSolid[object=load, load=secondSlice0, file=slicePyramid, action=writesolid] \psSolid[object=datfile,fillcolor=yellow!50, file=slicePyramid] \end{verbatim} \end{gbar} \begin{center} \psset{unit=0.75} \begin{pspicture}(-5,-2)(4,7) %\psframe(-4,-2)(4,7) \psset{viewpoint=50 20 10 rtp2xyz,Decran=50} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-3 5 -3 5, linecolor=gray] \psset{solidmemory} %% create the pyramid with base area in xy-plane %\psSolid[object=new, % sommets= % 0 -2 0 %% 0 % -2 0 0 %% 1 % 0 4 0 %% 2 % 4 0 0 %% 3 % 0 0 5, %% 4 % faces={ % [3 2 1 0] % [4 0 3] % [4 3 2] % [4 2 1] % [4 1 0] %},file=Pyramid,fillcolor=yellow!50, % action=writesolid] \psSolid[object=datfile, file=Pyramid, plansepare={[0 0 1 -2]}, name=firstSlice, action=none] \psSolid[object=plan, definition=equation, args={[0 0 1 -1]},action=draw, base=-3 5 -3 5] \psSolid[object=load, load=firstSlice1, action=none, plansepare={[0 0 1 -1]}, name=secondSlice] %\psSolid[object=load,action=draw*, % load=secondSlice0] %\psSolid[object=load, % load=secondSlice0, % file=slicePyramid, % action=writesolid] \psSolid[object=datfile,fillcolor=yellow!50, file=slicePyramid] \psSolid[object=plan, definition=equation, args={[0 0 1 -2]}, base=-3 5 -3 5,action=draw] \axesIIID[linecolor=blue](0,0,2)(5,5,6) \end{pspicture} \hfill \begin{pspicture}(-4,-2)(6,7) \psset{viewpoint=50 20 10 rtp2xyz,Decran=50} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-3 5 -3 5, linecolor=gray] \psSolid[object=datfile,fillcolor=yellow!50, file=slicePyramid] \psSolid[object=datfile, file=Pyramid,action=draw] \axesIIID[linecolor=blue](4,4,2)(5,5,6) \end{pspicture} \end{center} \subsection{Coupe d'un octaèdre par un plan parallèle à l'une des faces} \subsubsection{Voir l'intérieur} Rappelons que ce sont les options \Cadre{rm=0,hollow} qui permettent, l'une d'enlever la face de découpe \Cadre{rm=0} et l'autre \Cadre{hollow} de voir l'intérieur. Dans l'exemple ci-dessous, on commence par construire les objets nécessaires, sans les dessiner (\verb+action=none+). On construit l'octaèdre, on nomme $G$ le centre de la face d'indice $1$, puis on définit le point $H$ vérifiant $\overrightarrow{OH} = 0,8\overrightarrow {OG}$. On définit ensuite le plan $P$ passant par $H$ et parallèle à la face d'indice $1$ de l'octaèdre. On pratique ensuite la séparation de l'octaèdre par le plan $P$. \begin{LTXexample}[width=7.5cm] \begin{pspicture}(-3.5,-3)(4.5,5) \psset{viewpoint=100 5 10 rtp2xyz,Decran=80, lightsrc=viewpoint,solidmemory,action=none} \psSolid[object=octahedron, a=4,name=my_octahedron,] \psSolid[object=point, definition=solidcentreface, args=my_octahedron 1, name=G,] \psSolid[object=point, definition=mulv3d, args=G .8, name=H,] \psSolid[object=plan, definition=solidface, args=my_octahedron 1, base=-4 4 -4 4, name=P,](H,,) \psSolid[object=load, load=my_octahedron, plansepare=P, name=part] \psSolid[object=load,load=part1, rm=0,hollow,action=draw**, fillcolor={[rgb]{0.7 1 0.7}}, incolor={[rgb]{1 1 0.7}},] \psSolid[object=plan,args=P, action=draw,showBase] \psSolid[object=line, args=0 0 0 H, linestyle=dashed,] \psProjection[object=point,plan=P,args=0 0, fontsize=20,pos=cl,text=H,phi=90,] \axesIIID[linecolor=blue,linewidth=0.4pt](0,0,0)(4,4,4) \end{pspicture} \end{LTXexample} \subsubsection{On considère le solide comme plein} L'option \Cadre{fcol=0 (YellowOrange)} permet de colorier la face de découpe qui est la face \Cadre{0}. \begin{LTXexample}[width=7.5cm] \begin{pspicture}(-3.5,-3)(4.5,5) \psset{viewpoint=100 5 10 rtp2xyz,Decran=80, lightsrc=viewpoint,solidmemory,action=none} \psSolid[object=octahedron, a=4,name=my_octahedron,] \psSolid[object=point, definition=solidcentreface, args=my_octahedron 1, name=G,] \psSolid[object=point, definition=mulv3d, args=G .8, name=H,] \psSolid[object=plan, definition=solidface, args=my_octahedron 1, base=-4 4 -4 4, name=P,](H,,) \psSolid[object=load, load=my_octahedron, plansepare=P, name=part] \psSolid[object=load, load=part1, fcol=0 (YellowOrange), action=draw**, fillcolor={[rgb]{0.7 1 0.7}},] \psSolid[object=plan,args=P, action=draw,showBase] \psSolid[object=line, args=0 0 0 H, linestyle=dashed,] \psProjection[object=point,plan=P,args=0 0, fontsize=20,pos=cl,text=H,phi=90,] \axesIIID[linecolor=blue,linewidth=0.4pt](0,0,0)(4,4,4) \end{pspicture} \end{LTXexample} \subsubsection{Les deux parties du solide découpé} On rappelle que c'est le sens de la normale du plan de séparation qui détermine le numérotage des deux parties : \Cadre{0} celle qui est \textit{au-dessus} de la normale et \Cadre{1} celle qui est \textit{au-dessous}. Pour les deux parties, la face de découpe porte le numéro \Cadre{0}. S'il y a plusieurs faces de découpe, comme dans le cas du tore elles sont numérotées \Cadre{0, 1 etc.} On opère en deux étapes, mise en mémoire des deux parties du solide découpé : \begin{gbar} \begin{verbatim} \psSolid[object=load, load=my_octahedron, plansepare=P, name=part] \end{verbatim} \end{gbar} Puis placement et traitement de chacune des parties : \begin{gbar} \begin{verbatim} \psSolid[object=load, fcol=0 (YellowOrange), fillcolor={[rgb]{0.7 1 0.7}}, load=part1] \psSolid[object=load, fillcolor={[rgb]{0.7 1 0.7}}, load=part0](H 2 mulv3d,,) \composeSolid \end{verbatim} \end{gbar} \begin{LTXexample}[width=7.5cm] \begin{pspicture}(-3.5,-3)(4.5,5) \psset{viewpoint=100 5 20 rtp2xyz,Decran=150, lightsrc=viewpoint,solidmemory,action=none} \psSolid[object=octahedron, a=2,name=my_octahedron,] \psSolid[object=point, definition=solidcentreface, args=my_octahedron 1, name=G,] \psSolid[object=point, definition=mulv3d, args=G .7, name=H,] \psSolid[object=plan, definition=solidface, args=my_octahedron 1, base=-4 4 -4 4, name=P,](H,,) \psSolid[object=load, load=my_octahedron, plansepare=P, name=part] \psset{action=draw**} \psSolid[object=load, load=part1, fcol=0 (YellowOrange), fillcolor={[rgb]{0.7 1 0.7}},] \psSolid[object=load, fillcolor={[rgb]{0.7 1 0.7}}, load=part0](H 2 mulv3d,,) \composeSolid \end{pspicture} \end{LTXexample} \subsection{Coupes d'un cube} \subsubsection{Marquage de la ligne de découpage} \begin{LTXexample}[width=8cm] \psset{viewpoint=100 30 20 rtp2xyz,Decran=150} \begin{pspicture}(-4,-3)(4,5) \psframe(-4,-3)(4,5) \psset{solidmemory} \psSolid[object=plan,definition=normalpoint, args={1 1 1 [1 1 1]},action=none,name=P] \psSolid[object=cube,a=2,action=draw, intersectiontype=0, intersectionplan=P, intersectionlinewidth=2, intersectioncolor=(rouge), ](1,1,1) \psProjection[object=point, args=0 0,fontsize=10,pos=dc, text=H,phi=-30,plan=P, ] \psSolid[object=line, linestyle=dashed, args=0 0 0 1 1 1] \psSolid[object=vecteur, linecolor=red, args=1 1 1 .7 mulv3d](1,1,1) \axesIIID[linecolor=blue](2,2,2)(2.5,2.5,2.5) \end{pspicture} \end{LTXexample} \subsubsection{Représentation du cube découpé avec une face de découpe hexagonale} \begin{LTXexample}[width=8cm] \psset{viewpoint=100 30 20 rtp2xyz,Decran=150} \begin{pspicture}(-4,-3)(4,5) \psframe(-4,-3)(4,5) \psset{solidmemory} \psSolid[object=plan,action=none,definition=normalpoint, args={1 1 1 [1 1 1]},name=P] \psSolid[object=cube,a=2, plansepare=P, action=none, name=parts_cube, ](1,1,1) \psSolid[object=load, load=parts_cube1, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, ] \psProjection[object=point, args=0 0,fontsize=10,pos=dc, text=H,phi=-30,plan=P, ] \psSolid[object=vecteur, linecolor=red, args=1 1 1 .7 mulv3d](1,1,1) \axesIIID[linecolor=blue](2,2,2)(2.5,2.5,2.5) \end{pspicture} \end{LTXexample} \subsubsection{Cube découpé dans des différentes positions} Où on utilise l'option permettant de mémoriser un solide pour, après diverses transformations, faire reposer le cube tronqué sur sa face de découpe. \begin{gbar} \begin{verbatim} \psset{solidmemory} \psSolid[object=datfile, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, name=C1, action=none, file=cubeHexagone] \end{verbatim} \end{gbar} \begin{center} \begin{pspicture}(-3,-3)(3,3) \psframe(-3,-2)(3,3) \psset{viewpoint=100 30 20 rtp2xyz,Decran=100} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-2 3 -2 3, linecolor=gray] \psSolid[object=datfile, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, file=cubeHexagone] \axesIIID[linecolor=blue](2,2,2)(2.5,2.5,2.5) \end{pspicture} \hfil \begin{pspicture}(-2,-3)(4,3) \psframe(-2,-2)(4,3) \psset{viewpoint=100 -30 20 rtp2xyz,Decran=100} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-2 3 -2 3, linecolor=gray] \psSolid[object=datfile, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, file=cubeHexagone] \axesIIID[linecolor=blue](2,2,2)(2.5,2.5,2.5) \end{pspicture} \begin{pspicture}(-3,-2)(3,3) \psframe(-3,-2)(3,3) \psset{viewpoint=100 225 20 rtp2xyz,Decran=100} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-2 3 -2 3, linecolor=gray] \psSolid[object=datfile, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, file=cubeHexagone] \axesIIID[linecolor=blue](0,0,0)(2.5,2.5,2.5) \end{pspicture} \hfil \begin{pspicture}(-3,-2)(3,3) \psframe(-3,-2)(3,3) \psset{viewpoint=100 30 20 rtp2xyz,Decran=100} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-2 3 -2 3, linecolor=gray] \psset{solidmemory} \psSolid[object=datfile, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, name=C1, action=none, file=cubeHexagone] \codejps{C1 {-1.5 -1.5 0 translatepoint3d} solidtransform drawsolid** } \axesIIID[linecolor=blue](0,0,0)(2.5,2.5,2.5) \end{pspicture} \begin{pspicture}(-3,-2)(3,4) \psframe(-3,-2)(3,3) \psset{viewpoint=100 30 20 rtp2xyz,Decran=100} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-2 3 -2 3, linecolor=gray] \psset{solidmemory} \psSolid[object=datfile, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, name=C1, action=none, file=cubeHexagone] \codejps{C1 {-1.5 -1.5 0 translatepoint3d} solidtransform {0 0 45 rotateOpoint3d} solidtransform drawsolid** } %\composeSolid \axesIIID[linecolor=blue](0,0,0)(2.5,2.5,2.5) \end{pspicture} \hfil \begin{pspicture}(-3,-2)(3,4) \psframe(-3,-2)(3,3) \psset{viewpoint=100 30 20 rtp2xyz,Decran=100} %\lightsource \psset{lightsrc=viewpoint} \psSolid[object=grille, base=-2 3 -2 3, linecolor=gray] \psset{solidmemory} \psSolid[object=datfile, fcol=0 (Dandelion), fillcolor={[rgb]{0.7 1 0.7}}, name=C1, action=none, file=cubeHexagone] \codejps{C1 {-1.5 -1.5 0 translatepoint3d} solidtransform {0 0 45 rotateOpoint3d} solidtransform {-35.2644 -90 add 0 0 rotateOpoint3d} solidtransform drawsolid* } \axesIIID[linecolor=blue](1,2.5,0.5)(2.5,3,2.5) \end{pspicture} \end{center} \subsection{Sections multiples} \subsubsection{Coupes dans une sphère avec \texttt{PStricks}} \begin{LTXexample}[width=8cm] \begin{pspicture}(-4,-4)(4,4) \psframe(-4,-4)(4,4) \psset{viewpoint=100 20 20 rtp2xyz,Decran=75} \psset{solidmemory,lightsrc=viewpoint} \codejps{ /coeff 0.75 def /rO 4 def /OH coeff rO mul neg def}% \psSolid[object=sphere, r=rO,ngrid=9 18, plansepare={[1 0 0 OH]}, name=part, action=none] \psSolid[object=load, load=part1,plansepare={[-1 0 0 OH]},action=none,name=part] \psSolid[object=load, load=part1,plansepare={[0 1 0 OH]},action=none,name=part] \psSolid[object=load, load=part1,plansepare={[0 -1 0 OH]},action=none,name=part] \psSolid[object=load, load=part1,plansepare={[0 0 1 OH]},action=none,name=part] \psSolid[object=load, load=part1,plansepare={[0 0 -1 OH]},action=none,name=part] \psSolid[object=load,hue=.1 .8 0.5 1, load=part1](0,0,0) \composeSolid \end{pspicture} \end{LTXexample} \subsubsection{Sections multiples d'un parallélépipède} Les sections multiples gagneront à être exécutées dans une boucle \texttt{postscript}, dans \Cadre{\textbackslash codejps}, c'est plus simple et plus rapide ! Dans cet exemple, le solide de départ est un parallélépipède. Troncatures des sommets et chanfreinages des arêtes sont réalisées avec des plans de coupe successifs, d'abord les sommets puis les arêtes. \begin{LTXexample}[width=7cm] \begin{pspicture}(-3.5,-4)(3.5,4) \psset{viewpoint=100 -20 10 rtp2xyz,Decran=100} %\lightsource \psset{lightsrc=viewpoint} \psframe(-3.5,-4)(3.5,4) \codejps{ 4 4 6 newparallelepiped 45 90 360 { /iAngle exch def /n_x iAngle cos 35.2644 cos mul def /n_y iAngle sin 35.2644 cos mul def /n_z 35.2644 sin def /distance 2 3 add 3 sqrt div neg def [ n_x n_y n_z distance] solidplansepare } for 45 90 360 { /iAngle exch def /n_x iAngle cos 35.2644 cos mul def /n_y iAngle sin 35.2644 cos mul def /n_z 35.2644 sin neg def /distance 2 3 add 3 sqrt div neg def [ n_x n_y n_z distance] solidplansepare } for 45 90 360 { /iAngle exch def % plan : ax+by+cz-d=0 [ iAngle cos % a iAngle sin % b 0 % c -2.5 % -d ] solidplansepare } for dup [.5 .2] solidputhuecolors solidlightOn drawsolid*} \end{pspicture} \end{LTXexample} \subsection{Sections d'un tore} %\begin{pspicture}(-6,-4)(6,4) %\psSolid[r1=3,r0=1.5, % object=tore, %% ngrid=18 60, % file=tore1860,action=writesolid] %\end{pspicture} \begin{center} \begin{pspicture}(-6,-4)(6,4) \pstVerb{/Ampl 3 2 sqrt mul def}% \psset{viewpoint=50 -10 30 rtp2xyz,Decran=50} %\lightsource \psset{lightsrc=viewpoint} \defFunction[algebraic]{lemniscate}(t){1.5}{Ampl*sin(t)/(1+cos(t)*cos(t))}{Ampl*sin(t)*cos(t)/(1+cos(t)*cos(t))} \psframe[fillstyle=solid,fillcolor=gray!50](-6,-4)(6,4) %\psset{solidmemory} %\psSolid[object=datfile,file=tore1860, % plansepare={[1 0 0 -1.5]}, % name=lemniscate, % action=none](0,0,0) %\psSolid[object=load, % load=lemniscate1, % file=tore1860lemniscate,action=writesolid](0,0,0) \psSolid[object=datfile,file=tore1860lemniscate, fcol=0 (0.5 0.72 0.5 setrgbcolor) 1 (0.5 0.72 0.5 setrgbcolor), fillcolor=green!30, intersectiontype=0, intersectionplan={ [1 0 0 -1.5]}, intersectioncolor=(rouge), intersectionlinewidth=2.2] \psSolid[object=courbe,r=0,linewidth=2pt, range=0 6.28, linecolor=red, function=lemniscate]% \psSolid[object=plan,action=draw, definition=equation, args={[1 0 0 -1.5] 90}, base=-5 5 -2 2,planmarks,showBase] %\composeSolid \end{pspicture} \end{center} \begin{center} \begin{pspicture}(-6,-4)(6,4) \pstVerb{/Ampl 3 2 sqrt mul def}% \defFunction[algebraic]{lemniscate}(t){1.5}{Ampl*sin(t)/(1+cos(t)*cos(t))}{Ampl*sin(t)*cos(t)/(1+cos(t)*cos(t))} \psset{viewpoint=50 -10 30 rtp2xyz,Decran=50} %\lightsource \psset{lightsrc=viewpoint} \psframe[fillstyle=solid,fillcolor=gray!50](-6,-4)(6,4) \psSolid[object=datfile,file=tore1860lemniscate, hollow, rm=0 1, fillcolor=green!30,incolor=yellow!50] \psSolid[object=courbe,r=0,linewidth=2pt, range=0 6.28, linecolor=red, function=lemniscate]% \psSolid[object=plan,action=draw, definition=equation, args={[1 0 0 -1.5] 90}, base=-5 5 -2 2,planmarks,showBase] \end{pspicture} \end{center} \subsection{Autres exemples} \begin{enumerate} \item Vous trouverez une version codée de ce document en \Cadre{jps} dans la commande \Cadre{\textbackslash codejps} dans le document suivant : \centerline{\url{http://melusine.eu.org/syracuse/mluque/solides3d2007/sections}} \item Une étude des sections coniques sur : \centerline{\url{http://melusine.eu.org/syracuse/mluque/solides3d2007/sections/sections-cone}} \item Une étude des sections cylindriques sur : \centerline{\url{http://melusine.eu.org/syracuse/mluque/solides3d2007/sections/section-cylindre}} \item Une étude sur les sections du tore : \centerline{\url{http://melusine.eu.org/syracuse/mluque/solides3d2007/sections/section-tore}} \end{enumerate}