196 lines
5.3 KiB
TeX
196 lines
5.3 KiB
TeX
\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}
|
|
|
|
\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}
|
|
|
|
% ================================================
|
|
|
|
\section{Avec Fortran}
|
|
|
|
plplot\index{plplot} est la piste à explorer.
|
|
|
|
|
|
% ------------------------------------------------
|
|
|
|
% ------------------------------------------------
|