mardi 19 février 2013

Construction et animation de molécules chirales avec pst-solides3d

Les molécules sont constituées d'un atome central et de 4 atomes de grosseurs et de couleurs différentes schématisés par des sphères et reliés par des tiges.
On donne un des énantiomères et on construit l'autre par symétrie par rapport à un plan.

Pour accélérer l'affichage et les calculs des images nécessaires à une animation les caractéristiques des deux molécules sont calculées une fois pour toute et enregistrées sur le disque.
On opère dans le \codejps{...} ce qui permet de travail uniquement avec postscript sans passer par les variables LaTeX : on gagne ainsi un peu de rapidité dans les calculs.


\documentclass[a4paper]{article}
\usepackage{pst-solides3d}
\pagestyle{empty}
\begin{document}
% Ecriture des fichiers
\begin{center}
\begin{pspicture}(-7,-7)(7,7)
\psset{lightsrc=50 50 10,lightintensity=1,viewpoint=1000 50 20 rtp2xyz,Decran=250}
\codejps{
 /atome1 {2  [18 16] newsphere
 {-90 0 0 rotateOpoint3d} solidtransform
 {0 10.93 0 translatepoint3d} solidtransform} def
 /atome2 {2.25  [18 16] newsphere
 {-90 0 0 rotateOpoint3d} solidtransform
 {0 10.93 0 translatepoint3d} solidtransform} def
 /atome3 {2.5  [18 16] newsphere
 {-90 0 0 rotateOpoint3d} solidtransform
 {0 10.93 0 translatepoint3d} solidtransform} def
 /atome4 {2.75  [18 16] newsphere
 {-90 0 0 rotateOpoint3d} solidtransform
 {0 10.93 0 translatepoint3d} solidtransform} def
 /H1 {atome1 dup (White) outputcolors} def
 /H2 {atome2 dup (rouge) outputcolors} def
 /H3 {atome3 dup (jaune) outputcolors} def
 /H4 {atome4 dup (bleu) outputcolors} def
  /L1 {
     0 0.25 10  [12 10] newcylindre
     {-90 0 0 rotateOpoint3d} solidtransform
      dup (White) outputcolors
   } def
 /L2 { L1 {0 0 -109.5 rotateOpoint3d} solidtransform } def
/HL1{ H1 L1  solidfuz} def
/HL2 { H2 L1  solidfuz {0 0 -109.5 rotateOpoint3d} solidtransform } def
/HL3 { H3 L1  solidfuz {0 0 -109.5 rotateOpoint3d} solidtransform {0 -120 0 rotateOpoint3d} solidtransform } def
/HL4 { H4 L1  solidfuz {0 0 -109.5 rotateOpoint3d} solidtransform {0 120 0 rotateOpoint3d} solidtransform } def
 /C {3  [18 16] newsphere
  {90 0 0 rotateOpoint3d} solidtransform
   dup (gris) outputcolors} def
/HL12 { HL1 HL2 solidfuz} def
/HL123 { HL12 HL3 solidfuz} def
/HL1234 { HL123 HL4 solidfuz} def
/methane { HL1234 C solidfuz} def
  methane {90 0 0 rotateOpoint3d} solidtransform
  (molecule) writesolidfile
  (molecule) readsolidfile
  dupsolid exch pop
   {[1 0 0 0] symplan3d} solidtransform
   dup solidfacesreverse
   (moleculechirale) writesolidfile
  }
\end{pspicture}
\end{center}
\end{document}


Ensuite on peut afficher une image pour voir si le résultat est satisfaisant :

\documentclass[a4paper]{article}
\usepackage{pst-solides3d}
\pagestyle{empty}
\begin{document}
\begin{center}
\begin{pspicture}(-7,-7)(7,7)
\psset{lightsrc=50 50 10,lightintensity=1,viewpoint=1000 50 20 rtp2xyz,Decran=125}
\psframe*[linecolor=gray!10](-7,-7)(7,7)
\psSolid[object=datfile,file=moleculechirale,deactivatecolor=true,grid,RotZ=90](-15,0,0)
\psSolid[object=plan,action=draw**,
         fillcolor=blue!20,opacity=0.5,
         linecolor=blue,
         definition=equation,
         args={[1 0 0 0] 90},
         showBase,
         base=-75 75 -35 35]
\psSolid[object=datfile,file=molecule,deactivatecolor=true,grid,RotZ=-90](15,0,0)
\end{pspicture}
\end{center}
\end{document}


LaTeX->DVIPS ->ps2pdf

Pour l'animation, il fait créer les images dans un fichier postscript, par une boucle :

\documentclass[a4paper]{article}
\usepackage{pst-solides3d}
\pagestyle{empty}
\begin{document}
\begin{center}
\multido{\Rotz=0+10}{36}{
\begin{pspicture}(-7,-7)(7,7)
\psset{lightsrc=50 50 10,lightintensity=1,viewpoint=1000 50 20 rtp2xyz,Decran=125}
\psframe*[linecolor=gray!10](-7,-7)(7,7)
\psSolid[object=datfile,file=moleculechirale,deactivatecolor=true,grid,RotZ=\Rotz](-15,0,0)
\psSolid[object=plan,action=draw**,
         fillcolor=blue!20,opacity=0.5,
         linecolor=blue,
         definition=equation,
         args={[1 0 0 0] 90},
         showBase,
         base=-75 75 -35 35]
\psSolid[object=datfile,file=molecule,deactivatecolor=true,grid,RotZ=-\Rotz](15,0,0)
\end{pspicture}\newpage}
\end{center}
\end{document}


Puis extraire chaque page du fichier, par exemple sous DOS :

For %N in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) Do psselect -p%N chiral_images.ps page%N.ps

Et les convertir en fichier eps, avec la commande perl, toujours sous DOS :

For %N in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36) Do perl ps2eps.pl page%N.ps

http://www.ipv6.tm.uka.de/~bless/ps2eps

Transformer les eps en pdf :

FOR %G IN (*.eps) DO gswin32c  -sDEVICE=pdfwrite  -dEPSCrop  -o "%~nG.pdf" "%~nG.eps"

Pour un gif animé :

FOR %G IN (*.pdf) DO convert "%G"  "%~nG.gif" 

suivi de :

convert -delay 10 -loop 0 *.gif animation.gif


Pour un pdf animé avec la roulette de la souris, il faut réunir tous les pdf dans un fichier unique, par exemple avec PDFTK Builder :

http://www.angusj.com/pdftkb/



Pour une animation au format flash, les fichiers pdf étant trop volumineux, il faut les convertir en png :

FOR %G IN (*.pdf) DO convert "%G"  "%~nG.png"

Puis avec les outils de swftools :

png2swf -r 0.5 page*.png -o chiral.swf


Tous les fichiers sont ici (le fichier zippé les contient tous) :







Aucun commentaire:

Enregistrer un commentaire