\def\grille{% quadrillage du plan Oxy \psPoint(-5,-5,0){S1} \psPoint(-5,5,0){S2} \psPoint(5,5,0){S3} \psPoint(5,-5,0){S4} \pspolygon*[linecolor=gray!20](S1)(S2)(S3)(S4) \multido{\ix=-5+1}{11}{% \psPoint(\ix\space,-5,0){A} \psPoint(\ix\space,5,0){B} \psline(A)(B)} \multido{\iy=-5+1}{11}{% \psPoint(-5,\iy\space,0){A} \psPoint(5,\iy\space,0){B} \psline(A)(B)} \psPoint(0,0,0){O} \psPoint(5,0,0){X} \psPoint(0,5,0){Y} \psPoint(0,0,8){Z} \psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(O)(X) \psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(O)(Y) \psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(O)(Z) \uput[r](X){\textcolor{blue}{$x$}}\uput[u](Y){\textcolor{blue}{$y$}}% \uput[r](Z){\textcolor{blue}{$z$}}\uput[u](O){\textcolor{blue}{$O$}}} \section{Fusing with \textit{jps code}} We can also \Index{fuse solids} by passing the code directly using \textit{jps code}. The calculation of the hidden parts is carried out by the PostScript routines of the \texttt{solides.pro} file, but the lines of code are ``encapsulated'' within a \texttt{pspicture} environment thanks to the command \verb+\codejps{ps code}+. \subsection{Using \textit{jps code}} \subsubsection{The choice of object} \begin{compactitem} \item \texttt{[section] n newanneau}: choice of a cylindrical ring defined by the coordinates of the vertices of its intersection with the plane $Oyz$. \item \texttt{2 1.5 6 [4 16] newcylindre}: choice of a vertical cylinder with the following parameters: \begin{compactitem} \item \texttt{z0=2}: the position of the base centre on the axis $Oz$; \item \texttt{radius=1.5}: radius of the cylinder; \item \texttt{z1=6}: the position of the top centre on the axis $Oz$; \item \texttt{[4 16]}: the cylinder is sliced horizontally into 4 pieces and vertically into 16 sectors. \end{compactitem} \end{compactitem} \subsubsection{The transformations} \begin{compactitem} \item \texttt{\{-1 2 5 translatepoint3d\} solidtransform}: the object previously chosen is translated to the point with the coordinates $(x=-1,y=2,z=5)$. \item \texttt{\{90 0 45 rotateOpoint3d\} solidtransform}: the object previously chosen is rotated around the axes $(Ox,Oy,Oz)$, in this order: rotation of 90$^\mathsf{o}$ about $(Ox)$ followed by a rotation of 45$^\mathsf{o}$ about $(Oz)$. \end{compactitem} \subsubsection{The choice of object colour} \begin{compactitem} \item dup (yellow) outputcolors: a yellow object illuminated in white light. \end{compactitem} \subsubsection{Fusing objects} \begin{compactitem} \item The \Index{fusion} is finally made with the instruction \texttt{solidfuz}. \end{compactitem} \subsubsection{Designing objects} \begin{compactitem} \item There are three drawing options: \begin{compactitem} \item \texttt{drawsolid}: only draw edges; hidden edges are drawn dashed; \item \texttt{drawsolid*}: draw and fill solids in their coded order (not a very interesting option at first glance); hidden edges are drawn dashed; \item \texttt{drawsolid**}: draw and fill solids with the painting algorithm; only those parts seen by the observer are drawn. \end{compactitem} \end{compactitem} \begin{center} \psset{lightsrc=50 -50 50,viewpoint=40 16 32 rtp2xyz,Decran=40} \psset{unit=0.4} \begin{minipage}{0.3\linewidth} \begin{pspicture}(-6,-5)(6,7) \psframe*[linecolor=gray!40](-6,-5)(6,7) \codejps{ % solide 1 /tour { -6 1.5 6 [4 16] newcylindre dup (jaune) outputcolors } def % solide 2 /anneau { [4 -1 4 1 3 1 3 -1] 24 newanneau {0 0 -1 translatepoint3d} solidtransform dup (orange) outputcolors } def % fusion tour anneau solidfuz drawsolid} \end{pspicture} \end{minipage} \hfill \begin{minipage}{0.3\linewidth} \begin{pspicture}(-6,-5)(6,7) \psframe*[linecolor=gray!40](-6,-5)(6,7) \codejps{ % solide 1 /tour { -6 1.5 6 [4 16] newcylindre dup (jaune) outputcolors } def % solide 2 /anneau { [4 -1 4 1 3 1 3 -1] 24 newanneau {0 0 -1 translatepoint3d} solidtransform dup (orange) outputcolors } def % fusion tour anneau solidfuz drawsolid*} \end{pspicture} \end{minipage} \hfill \begin{minipage}{0.3\linewidth} \begin{pspicture}(-6,-5)(6,7) \psframe*[linecolor=gray!40](-6,-5)(6,7) \codejps{ % solide 1 /tour { -6 1.5 6 [4 16] newcylindre dup (jaune) outputcolors } def % solide 2 /anneau { [4 -1 4 1 3 1 3 -1] 24 newanneau {0 0 -1 translatepoint3d} solidtransform dup (orange) outputcolors } def % fusion tour anneau solidfuz drawsolid**} \psPoint(0,0,8){Z} \psPoint(0,0,6){Z'} \psline[arrowsize=0.3,arrowinset=0.2]{->}(Z')(Z) \uput[u](Z){$z$} \end{pspicture} \end{minipage} \end{center} \begin{verbatim} \psset{lightsrc=50 -50 50,viewpoint=50 20 50 rtp2xyz,Decran=50} \begin{pspicture}(-6,-2)(6,8) \psframe(-6,-2)(6,8) \codejps{ % solide 1 /tour{ -6 1.5 6 [4 16] newcylindre dup (jaune) outputcolors } def % solide 2 /anneau{ [4 -1 4 1 3 1 3 -1] 24 newanneau {0 0 -1 translatepoint3d} solidtransform dup (orange) outputcolors } def % fusion tour anneau solidfuz drawsolid**} \end{pspicture} \end{verbatim} \newpage \subsection{A \Index{chloride ion}} \begin{LTXexample}[width=6cm] \begin{pspicture}(-3,-4)(3,4) \psset{lightsrc=100 -50 -10,lightintensity=3,viewpoint=200 20 10 rtp2xyz,Decran=20} {\psset{linewidth=0.5\pslinewidth} \codejps{/Cl {9.02 [18 16] newsphere {-90 0 0 rotateOpoint3d} solidtransform dup (Green) outputcolors} def /Cl1 { Cl {10.25 10.25 10.25 translatepoint3d} solidtransform } def /Cl2 { Cl {10.25 -10.25 10.25 translatepoint3d} solidtransform } def /Cl3 { Cl {-10.25 -10.25 10.25 translatepoint3d} solidtransform } def /Cl4 { Cl {-10.25 10.25 10.25 translatepoint3d} solidtransform } def /Cl5 { Cl {10.25 10.25 -10.25 translatepoint3d} solidtransform } def /Cl6 { Cl {10.25 -10.25 -10.25 translatepoint3d} solidtransform } def /Cl7 { Cl {-10.25 -10.25 -10.25 translatepoint3d} solidtransform } def /Cl8 { Cl {-10.25 10.25 -10.25 translatepoint3d} solidtransform } def /Cs {8.38 [18 16] newsphere dup (White) outputcolors} def /Cl12{ Cl1 Cl2 solidfuz} def /Cl123{ Cl12 Cl3 solidfuz} def /Cl1234{ Cl123 Cl4 solidfuz} def /Cl12345{ Cl1234 Cl5 solidfuz} def /Cl123456{ Cl12345 Cl6 solidfuz} def /Cl1234567{ Cl123456 Cl7 solidfuz} def /Cl12345678{ Cl1234567 Cl8 solidfuz} def /C_Cs { Cl12345678 Cs solidfuz} def C_Cs drawsolid**}}% \psPoint(0,0,0){P} \psPoint(10.25,10.25,10.25){Cl1} \psPoint(10.25,-10.25,10.25){Cl2} \psPoint(-10.25,-10.25,10.25){Cl3} \psPoint(-10.25,10.25,10.25){Cl4} \psPoint(10.25,10.25,-10.25){Cl5} \psPoint(10.25,-10.25,-10.25){Cl6} \psPoint(-10.25,-10.25,-10.25){Cl7} \psPoint(-10.25,10.25,-10.25){Cl8} \pspolygon[linestyle=dashed](Cl1)(Cl2)(Cl3)(Cl4) \pspolygon[linestyle=dashed](Cl5)(Cl6)(Cl7)(Cl8) \psline[linestyle=dashed](Cl2)(Cl6) \psline[linestyle=dashed](Cl3)(Cl7) \psline[linestyle=dashed](Cl1)(Cl5) \psline[linestyle=dashed](Cl4)(Cl8) \pcline[offset=0.5]{<->}(Cl2)(Cl1) \aput{:U}{a} \pcline[offset=0.5]{<->}(Cl6)(Cl2) \aput{:U}{a} \end{pspicture} \end{LTXexample} We define the chloride ion $\mathrm{Cl^-}$: \begin{verbatim} /Cl {9.02 [12 8] newsphere {-90 0 0 rotateOpoint3d} solidtransform dup (Green) outputcolors} def \end{verbatim} which we shift to each vertex of a cube: \begin{verbatim} /Cl1 { Cl {10.25 10.25 10.25 translatepoint3d} solidtransform } def /Cl2 { Cl {10.25 -10.25 10.25 translatepoint3d} solidtransform } def /Cl3 { Cl {-10.25 -10.25 10.25 translatepoint3d} solidtransform } def /Cl4 { Cl {-10.25 10.25 10.25 translatepoint3d} solidtransform } def /Cl5 { Cl {10.25 10.25 -10.25 translatepoint3d} solidtransform } def /Cl6 { Cl {10.25 -10.25 -10.25 translatepoint3d} solidtransform } def /Cl7 { Cl {-10.25 -10.25 -10.25 translatepoint3d} solidtransform } def /Cl8 { Cl {-10.25 10.25 -10.25 translatepoint3d} solidtransform } def \end{verbatim} Then a caesium ion $\mathrm{Cs^+}$ is placed in the center: \begin{verbatim} /Cs {8.38 [12 8] newsphere dup (White) outputcolors} def \end{verbatim} Finally we fuse the separate spheres in pairs. \vfill \subsection{A prototype of a \Index{vehicle}} \begin{center} \psset{lightsrc=100 0 100,viewpoint=25 10 10,Decran=30} \begin{pspicture}(-6,-4)(6,8) \pstVerb{/Pneu { /m {90 4 div} bind def /Scos {m cos 2 m mul cos add 3 m mul cos add} bind def /Z0 {h 4 div} bind def /c {Z0 Scos div} bind def /Z1 {Z0 c m cos mul add} bind def /Z2 {Z1 c m 2 mul cos mul add} bind def /R1 {R c m sin mul sub} bind def /R2 {R1 c m 2 mul sin mul sub} bind def /R3 {R2 c m 3 mul sin mul sub} bind def R h 4 div neg % 1 R h 4 div % 2 R1 Z1 % 3 R2 Z2 % 4 R3 h 2 div % 5 r h 2 div % 6 r h 2 div neg % 7 R3 h 2 div neg % 8 R2 Z2 neg % 9 R1 Z1 neg % 10 } def}% \grille \codejps{ /roue12 { % solide 1 /R 2 def /r 1 def /h 1 def [Pneu] 36 newanneau {90 0 90 rotateOpoint3d} solidtransform {3 4 2 translatepoint3d} solidtransform dup (White) outputcolors % solide 2 [Pneu] 36 newanneau {90 0 90 rotateOpoint3d} solidtransform {-3 4 2 translatepoint3d} solidtransform dup (White) outputcolors % fusion solidfuz } def /axe12{ 0 0.1 6 [4 16] newcylindre {90 0 90 rotateOpoint3d} solidtransform {-3 4 2 translatepoint3d} solidtransform dup (White) outputcolors } def /roue12axes { roue12 axe12 solidfuz } def /roue34 { % solide 3 /R 1.5 def /r 1 def /h 1 def [Pneu] 36 newanneau {90 0 110 rotateOpoint3d} solidtransform {3 -4 1.5 translatepoint3d} solidtransform dup (White) outputcolors % solide 4 [Pneu] 36 newanneau {90 0 110 rotateOpoint3d} solidtransform {-3 -4 1.5 translatepoint3d} solidtransform dup (White) outputcolors % fusion solidfuz } def /axe34{ 0 0.1 6 [16 16] newcylindre {90 0 90 rotateOpoint3d} solidtransform {-3 -4 1.5 translatepoint3d} solidtransform dup (White) outputcolors } def /roue34axes34 { roue34 axe34 solidfuz } def /roues {roue34axes34 roue12axes solidfuz} def /chassis { 0 1 8 [4 16] newcylindre {100 0 0 rotateOpoint3d} solidtransform {0 4 2.5 translatepoint3d} solidtransform dup (White) outputcolors } def roues chassis solidfuz drawsolid**} \psPoint(0,0,2.7){Z'} \psline[arrowsize=0.3,arrowinset=0.2,linecolor=blue]{->}(Z')(Z) \end{pspicture} \end{center} We have to operate in several steps to fuse the solids in pairs: \begin{compactitem} \item We first fuse the two front wheels \texttt{roue12}: \begin{verbatim} /roue12 { % solide 1 /R 2 def /r 1 def /h 1 def [Pneu] 36 newanneau {90 0 90 rotateOpoint3d} solidtransform {3 4 2 translatepoint3d} solidtransform dup (White) outputcolors % solide 2 [Pneu] 36 newanneau {90 0 90 rotateOpoint3d} solidtransform {-3 4 2 translatepoint3d} solidtransform dup (White) outputcolors % fusion solidfuz } def \end{verbatim} \item Then the two wheels and their axis: \begin{verbatim} /axe12{ 0 0.1 6 [4 16] newcylindre {90 0 90 rotateOpoint3d} solidtransform {-3 4 2 translatepoint3d} solidtransform dup (White) outputcolors } def /roue12axes { roue12 axe12 solidfuz } def \end{verbatim} \item After that the rear wheels and their axis: \begin{verbatim} /roue34 { % solide 3 /R 1.5 def /r 1 def /h 1 def [Pneu] 36 newanneau {90 0 110 rotateOpoint3d} solidtransform {3 -4 1.5 translatepoint3d} solidtransform dup (White) outputcolors % solide 4 [Pneu] 36 newanneau {90 0 110 rotateOpoint3d} solidtransform {-3 -4 1.5 translatepoint3d} solidtransform dup (White) outputcolors % fusion solidfuz } def /axe34{ 0 0.1 6 [16 16] newcylindre {90 0 90 rotateOpoint3d} solidtransform {-3 -4 1.5 translatepoint3d} solidtransform dup (White) outputcolors } def /roue34axes34 { roue34 axe34 solidfuz } def \end{verbatim} \item Then fuse the two wheel assemblies: \begin{verbatim} /roues {roue34axes34 roue12axes solidfuz} def \end{verbatim} \item The final step is to fuse the previously generated solid with the chassis: \begin{verbatim} /chassis { 0 1 8 [4 16] newcylindre {100 0 0 rotateOpoint3d} solidtransform {0 4 2.5 translatepoint3d} solidtransform dup (White) outputcolors } def roues chassis solidfuz drawsolid**} \end{verbatim} \end{compactitem} \subsection{A \Index{wheel} -- or a space station} \begin{center} \begin{pspicture}(-6,-5)(6,6) \psset{lightsrc=50 -50 50,viewpoint=40 50 60,Decran=60,linewidth=0.5\pslinewidth} %\psframe*[linecolor=black](-6,-5)(6,5) \codejps{ /rayon0 { 1 0.2 6 [4 16] newcylindre {90 0 0 rotateOpoint3d} solidtransform dup (White) outputcolors } def 36 36 360 { /angle exch def /rayon1 { 1 0.2 6 [4 16] newcylindre {90 0 angle rotateOpoint3d} solidtransform dup (White) outputcolors } def /rayons {rayon0 rayon1 solidfuz} def /rayon0 rayons def } for /moyeu { -2 1 2 [4 10] newcylindre dup (jaune) outputcolors} def /rayonsmoyeu {rayons moyeu solidfuz} def /pneu {2 7 [18 36] newtore dup (White) outputcolors} def /ROUE {pneu rayonsmoyeu solidfuz} def ROUE drawsolid**} \end{pspicture} \end{center} We define the first spoke: \begin{verbatim} /rayon0 { 1 0.2 6 [4 16] newcylindre {90 0 0 rotateOpoint3d} solidtransform dup (White) outputcolors } def \end{verbatim} Then, with a loop, we fuse all the spokes of the wheel: \begin{verbatim} 36 36 360 { /angle exch def /rayon1 { 1 0.2 6 [4 16] newcylindre {90 0 angle rotateOpoint3d} solidtransform dup (White) outputcolors } def /rayons {rayon0 rayon1 solidfuz} def /rayon0 rayons def } for \end{verbatim} After that, we draw the hub and the tyre of the wheel, and finally fuse all of them: \begin{verbatim} /moyeu { -0.5 1 0.5 [4 10] newcylindre dup (White) outputcolors} def /rayonsmoyeu {rayons moyeu solidfuz} def /pneu {2 7 [18 36] newtore dup (jaune) outputcolors} def /ROUE {pneu rayonsmoyeu solidfuz} def ROUE drawsolid** \end{verbatim} \subsection{Intersection of two cylinders} \begin{LTXexample}[width=8cm] \begin{pspicture}(-4,-3)(6,3) \psset{lightsrc=50 -50 50,viewpoint=100 -30 40,Decran=100,linewidth=0.5\pslinewidth, unit=0.5} \codejps{ /cylindre1 { -6 2 6 [36 36] newcylindrecreux %newcylindre {90 0 0 rotateOpoint3d} solidtransform dup (Yellow) (White) inoutputcolors } def /cylindre2 { -6 2 6 [36 36] newcylindrecreux %newcylindre {90 0 90 rotateOpoint3d} solidtransform dup (Yellow) (White) inoutputcolors } def /UnionCylindres {cylindre1 cylindre2 solidfuz} def UnionCylindres drawsolid**} \end{pspicture} \end{LTXexample} \subsection{Intersection between a sphere and a cylinder} This time we draw the curve of intersection using \verb+\psSolid[object=courbe]+. \begin{LTXexample}[width=8cm] \psset{unit=0.5,lightsrc=50 -50 50,viewpoint=100 0 0 rtp2xyz,Decran=110,linewidth=0.5\pslinewidth} \begin{pspicture}(-7,-6)(5,6) \defFunction{F}(t){t cos dup mul 5 mul}{t cos t sin mul 5 mul}{t sin 5 mul} \codejps{% /cylindre1 { -5 2.5 5 [36 36] newcylindre {2.5 0 0 translatepoint3d} solidtransform dup (White) outputcolors } def /sphere1 { 5 [36 72] newsphere dup (White) outputcolors } def /CS {cylindre1 sphere1 solidfuz} def CS drawsolid**} \psPoint(0,0,0){O} \psSolid[object=courbe,r=0, function=F, range=0 360, linecolor=red,linewidth=4\pslinewidth] \end{pspicture} \end{LTXexample} \subsection{Two linked \Index{rings}} \begin{LTXexample}[width=8cm] \begin{pspicture}(-5,-4)(3,3) \psset{lightsrc=50 50 50,viewpoint=40 50 60,Decran=30,unit=0.85} \codejps{ /anneau1 {1 7 [12 36] newtore {0 0 0 translatepoint3d} solidtransform dup (Yellow) outputcolors} def /anneau2 {1 7 [12 36] newtore {90 0 0 rotateOpoint3d} solidtransform {7 0 0 translatepoint3d} solidtransform dup (White) outputcolors} def /collier {anneau1 anneau2 solidfuz} def collier drawsolid**} \end{pspicture} \end{LTXexample} \subsection{The \Index{methane molecule}: wooden model} \begin{LTXexample}[width=8cm] \begin{pspicture}(-4.5,-4)(3.2,5) \psset{lightsrc=50 50 10,lightintensity=2,viewpoint=100 50 20 rtp2xyz, Decran=30} \psset{linecolor={[cmyk]{0,0.72,1,0.45}},linewidth=0.5\pslinewidth, unit=1} %\psframe[fillstyle=solid,fillcolor=green!20](-4,-4)(3.2,5) \pstVerb{/hetre {0.764 0.6 0.204 setrgbcolor} def /chene {0.568 0.427 0.086 setrgbcolor} def /bois {0.956 0.921 0.65 setrgbcolor} def }% \codejps{ /H1 { 2 [18 16] newsphere {-90 0 0 rotateOpoint3d} solidtransform {0 10.93 0 translatepoint3d} solidtransform dup (hetre) outputcolors} def /L1 { 0 0.25 10 [12 10] newcylindre {-90 0 0 rotateOpoint3d} solidtransform dup (bois) outputcolors } def /HL1{ H1 L1 solidfuz} def /HL2 { HL1 {0 0 -109.5 rotateOpoint3d} solidtransform } def /HL3 { HL2 {0 -120 0 rotateOpoint3d} solidtransform } def /HL4 { HL2 {0 120 0 rotateOpoint3d} solidtransform } def /C {3 [18 16] newsphere {90 0 0 rotateOpoint3d} solidtransform dup (chene) outputcolors} def /HL12 { HL1 HL2 solidfuz} def /HL123 { HL12 HL3 solidfuz} def /HL1234 { HL123 HL4 solidfuz} def /methane { HL1234 C solidfuz} def methane drawsolid**} \end{pspicture} \end{LTXexample} \subsection{The \Index{thiosulphate ion}} \begin{center} \begin{pspicture}(-4,-3)(4.5,5.5) \psset{lightsrc=100 10 -20,lightintensity=3,viewpoint=200 30 20 rtp2xyz,Decran=40} %\psframe(-4,-3)(4.5,5.5) {\psset{linewidth=0.5\pslinewidth} \codejps{ /Soufre1 {3.56 [20 16] newsphere dup (Yellow) outputcolors} def /Soufre2 {3.56 [20 16] newsphere {0 0.000 20.10 translatepoint3d} solidtransform dup (Yellow) outputcolors} def % Liaison simple /LiaisonR { 7.5 0.5 15 [10 10] newcylindre dup (Red) outputcolors } def /LiaisonY { 0 0.5 7.5 [10 10] newcylindre dup (Yellow) outputcolors } def % fin Liaison simple /Liaison{LiaisonR LiaisonY solidfuz} def /Ox {2.17 [20 16] newsphere {0 0 15 translatepoint3d} solidtransform dup (Red) outputcolors} def /LO { Liaison Ox solidfuz} def /LO1 { LO {0 -109.5 0 rotateOpoint3d} solidtransform } def /LOx1 { LO1 {0 0 120 rotateOpoint3d} solidtransform } def % fin liaison simple S-O % Liaison double S=O /LiaisonD1 {Liaison {-0.75 0 0 translatepoint3d} solidtransform} def /LiaisonD2 {Liaison {0.75 0 0 translatepoint3d} solidtransform} def /LiaisonDD { LiaisonD1 LiaisonD2 solidfuz} def /LiaisonDOx {LiaisonDD Ox solidfuz} def /LiaisonDOx1 {LiaisonDOx {0 -109.5 0 rotateOpoint3d} solidtransform } def /LiaisonDOx2 {LiaisonDOx1 {0 0 -120 rotateOpoint3d} solidtransform } def /LO12 { LiaisonDOx1 LiaisonDOx2 solidfuz} def /LO123 {LO12 LOx1 solidfuz} def % liaison simple S-S /L4 { 0 0.5 20.10 [16 10] newcylindre dup (Yellow) outputcolors } def /S1L4{ Soufre1 L4 solidfuz} def /S1S2L4{ S1L4 Soufre2 solidfuz} def /S2O3 { S1S2L4 LO123 solidfuz} def S2O3 drawsolid**} \axesIIID(0,0,0)(25,20,25)} \psPoint(0,0,20.1){S2} \psPoint(-14.14,0,-5){O1} \psPoint(7.07,-12.24,-5 ){O2} \psPoint(7.07,12.24,-5 ){O3} \pcline[linestyle=dotted]{<->}(O2)(O) \aput{:U}{15 pm} \pcline[linestyle=dotted]{<->}(O)(S2) \aput{:U}{\small 20,1 pm} \pcline[linestyle=dotted]{<->}(O2)(O3) \lput*{:U}{\small 24,5 pm} \pcline[linestyle=dotted]{<->}(O2)(S2) \lput*{:U}{\small 28,8 pm} \pstMarkAngle[arrows=<->,MarkAngleRadius=0.8,linestyle=dotted]{O2}{O}{O3}{\footnotesize 109,4$^{\mathrm{o}}$} \pstMarkAngle[arrows=<->,MarkAngleRadius=0.8,linestyle=dotted]{O1}{O}{S2}{\footnotesize 109,5$^{\mathrm{o}}$} \rput(0,-2.5){$\mathrm{S_2^{\phantom{2}}O_3^{2-}}$} \end{pspicture} \end{center} We first define the two sulphur atoms and place them on the $Oz$ axis. $\mathrm{S_1}$ is placed at the origin $O$. \begin{verbatim} \codejps{ /Soufre1 {3.56 [20 16] newsphere dup (Yellow) outputcolors} def /Soufre2 {3.56 [20 16] newsphere {0 0.000 20.10 translatepoint3d} solidtransform dup (Yellow) outputcolors} def \end{verbatim} Then the single bond \textsf{S-O} using the following convention: half red---the half connected to \textsf{O}, and half yellow---the half connected to \textsf{S}. \begin{verbatim} /LiaisonR { 7.5 0.5 15 [10 10] newcylindre dup (Red) outputcolors } def /LiaisonY { 0 0.5 7.5 [10 10] newcylindre dup (Yellow) outputcolors } def /Liaison{LiaisonR LiaisonY solidfuz} def \end{verbatim} The oxygen atom, its bond, and the setting of the combined unit: \begin{verbatim} /Ox {2.17 [20 16] newsphere {0 0 15 translatepoint3d} solidtransform dup (Red) outputcolors} def /LO { Liaison Ox solidfuz} def /LO1 { LO {0 -109.5 0 rotateOpoint3d} solidtransform } def /LOx1 { LO1 {0 0 120 rotateOpoint3d} solidtransform } def % fin liaison simple S-O \end{verbatim} For the double bond \textsf{S=O}, we take the single bond above and duplicate it with shifts of 0.75~cm along the $Ox$ axis. \begin{verbatim} % Liaison double S=O /LiaisonD1 {Liaison {-0.75 0 0 translatepoint3d} solidtransform} def /LiaisonD2 {Liaison {0.75 0 0 translatepoint3d} solidtransform} def /LiaisonDD { LiaisonD1 LiaisonD2 solidfuz} def \end{verbatim} Connecting it to the \textsf{O} atom: \begin{verbatim} /LiaisonDOx {LiaisonDD Ox solidfuz} def \end{verbatim} and with two successive rotations we position the two bonds \textsf{=O}: \begin{verbatim} /LiaisonDOx1 {LiaisonDOx {0 -109.5 0 rotateOpoint3d} solidtransform } def /LiaisonDOx2 {LiaisonDOx1 {0 0 -120 rotateOpoint3d} solidtransform } def \end{verbatim} The following step consists of fusing the two connections: \begin{verbatim} /LO12 { LiaisonDOx1 LiaisonDOx2 solidfuz} def /LO123 {LO12 LOx1 solidfuz} def \end{verbatim} Then the single bond \textsf{S-S} is created: \begin{verbatim} % liaison simple S-S /L4 { 0 0.5 20.10 [16 10] newcylindre dup (Yellow) outputcolors } def \end{verbatim} and fused with the two atoms \textsf{S-S}: \begin{verbatim} /S1L4{ Soufre1 L4 solidfuz} def /S1S2L4{ S1L4 Soufre2 solidfuz} def \end{verbatim} The last step will be to fuse the two \textsf{S-S} and the three \textsf{O} already equipped with their bonds: \begin{verbatim} /S2O3 { S1S2L4 LO123 solidfuz} def S2O3 drawsolid**} \end{verbatim} \endinput