\chapter{Graphisme} Voici quelques notes en vrac sur divers logiciels qui permettent de faire des dessins et des images.\dots % ------------------------------------------------ \section{Flydraw}\index{Flydraw} Comment faire des dessins en écrivant des lignes de codes ? \begin{quote} flydraw is a drawing tool based on an interpreter which parses a language featuring rich graphic primitives; it uses libgd to output GIF, JPEG, or PNG\index{PNG} files. \end{quote} \lstinputlisting{code/dessiner.fly} Pour le moment, les résultats ne sont pas encourageants~: \begin{verbatim} tth@fubar:~/Documents/TetaTricks/code$ flydraw < dessiner.fly bad_parms -100000 tth@fubar:~/Documents/TetaTricks/code$ \end{verbatim} Mais en s'obstinant un peu au \textsl{cargocult}, il s'avère que la documentation et le code semble ne sont pas d'accord. Et les messages d'erreur trop cryptiques pour moi. Donc, on y arrive. \begin{figure}[h] \begin{center} \includegraphics[scale=0.75]{code/flydraw} \caption{Flydraw} \end{center} \end{figure} Ceci dit, une lecture attentive du code source\footnote{UTSL!} permettra de contourner ces petits désagréments, et de rédiger quelques exemples d'utilisation amusants. % package source % http://deb.debian.org/debian/pool/main/w/wims/wims_4.17b+svn13454~dfsg1.orig.tar.gz %==================================================================== \section{Povray}\index{Povray} \textbf{Persistence Of Vision} est un logiciel de raytracing qui existe depuis plus de trente ans. C'est un lointain descendant de DKBtrace. Mais le raytracing, c'est quoi ? \subsection{Caméra} Vous avez des problèmes pour caler les mouvement de la caméra ? Vous avez deux trajectoires (mal) calculées pour la \texttt{location} et le \texttt{look\_at}, et rien ne tombe en face de l'objectif ? Voici une approche de solution. La première étape est l'enregistrerement des paramètres de la caméra lors du calcul de la séquence~: \begin{verbatim} #if (0 = clock) #fopen CL "cam.log" create #else #fopen CL "cam.log" append #end #write (CL, clock, " ", CamX, " ", CamY, " ", CamZ, " ", LatX, " ", LatY, " ", LatZ,"\n") #fclose CL \end{verbatim} Et la seconde étape, l'exploitation, ou plutôt la visualisation de ces données avec l'indémodable gnuplot\index{gnuplot}~: \begin{verbatim} #!/bin/bash FILE="cam.log" TMPF="/dev/shm/cam.data" IMAGE="graphe.png" tail -360 ${FILE} | sort -n > ${TMPF} gnuplot << __EOC__ set term png size 720,720 set output "${IMAGE}" set ytics 2 set xtics 2 set grid front set title "Rush Camera" plot "${TMPF}" using 2:4 title "Cam", \ "${TMPF}" using 5:7 title "Lat" with dots __EOC__ display "${IMAGE}" & \end{verbatim} Dans ce cas, il s'agit d'une animation de 360 images, ce qui explique la commande\texttt{tail} au début du script. Ensuite les deux clauses \textsl{using 2:4 / 5:7} permettent de sélectionner les deux coordonnées X et Z, dans le repère POVray, qui n'est pas le même que celui de Gnuplot. % ------------------------------------------------ \subsection{image\_map} XXX \index{XXX} % ------------------------------------------------ \subsection{height\_field} Les champs d'altitude... Toute une histoire... \begin{verbatim} #declare Champ_Altitude = object { height_field { png "WS/hf5.png" gamma 1.8 } pigment { color Cyan } scale 2 } \end{verbatim} Le paramètre \texttt{gamma} est injustement méconnu. % ------------------------------------------------ \subsection{Random} \index{ramdom} C'est un peu différent de ce à quoi les programmeurs « classiques » sont habitués\footnote{Voir le random du C page \pageref{c-random}}. Avant de pouvoir obtenir des nombres aléatoires, il faut créer et initialiser un générateur~: \texttt{\#declare RND = seed(13.37);} Vous noterez au passage le fort degré alcolique de ce délicieux Corbière que je déguste en ce moment même. Ensuite, pour obtenir le résultat du tirage, on utilise le \textsl{handler} que l'on vient d'obtenir~: \texttt{\#local foo = rand(RND);} Par contre, on va obtenir un résultat bien classique~: \textsl{The numbers are uniformly distributed, and have values between 0.0 and 1.0,} Pourquoi nous faut-il plusieurs générateurs ? La réponse est dans la documentation\footnote{\texttt{https://wiki.povray.org/}}~: \textsl{Multiple random generators are very useful in situations where you use rand() to place a group of objects, and then decide to use rand() in another location earlier in the file to set some colors or place another group of objects. Without separate rand() streams, all of your objects would move when you added more calls to rand(). This is very annoying.} Ce qui nous conduit vers une autre question. Les PRNG sont des machines déterministes. C'est à dire qu'à conditions identiques au départ, nous aurons toujours la même séquence en sortie. ... \index{XXX} % ------------------------------------------------ \subsection{Trucs à voir} Des bouts de code piochés à droite et à gauche... \begin{verbatim} #declare VIRGINIA = transform { matrix < 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 > } box { 0, 1 transform {VIRGINIA} } \end{verbatim} Pour faire un vaisseau spatial (Thomas de Groot dans povray.binaries.images) \begin{verbatim} // the color bleeding is done by emission color: material { texture { pigment {rgb <0.50, 1.00, 1.00>} finish { specular 0 roughness 0.001 emission rgb <0.50, 1.00, 1.00>*5 diffuse 1 reflection {0} conserve_energy } } } \end{verbatim} % ================================================ \section{Avec Fortran} plplot\index{plplot} est la piste à explorer. % ------------------------------------------------ % ------------------------------------------------