From 28c260ea5e163c68518020b9691e8b0d39818e3a Mon Sep 17 00:00:00 2001 From: tTh Date: Tue, 21 Mar 2023 15:03:09 +0100 Subject: [PATCH] first gif89a with fortran & plplot --- chap/Fortran.tex | 25 +++++++++--- code/fortran/.gitignore | 4 +- code/fortran/Makefile | 6 +++ code/fortran/WS/README.md | 3 ++ code/fortran/dessiner.f90 | 83 +++++++++++++++++++++++++++------------ 5 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 code/fortran/WS/README.md diff --git a/chap/Fortran.tex b/chap/Fortran.tex index 6c4aebd..3e61798 100644 --- a/chap/Fortran.tex +++ b/chap/Fortran.tex @@ -13,6 +13,13 @@ de bonnes choses, la septième va vous tenir compagnie. % ======================================== +% +% un petit historique ? +% +\section{On the big irons} + +TODO\index{XXX} + \section{FORTRAN77} Dernière version à exiger le format '80 colonnes' des cartes perforées, @@ -235,7 +242,7 @@ Par exemple \textbf{g2} (vue en page \pageref{g2}) semble être utilisable avec les vieux F77, et possiblement avec un Fortran moderne, il faut juste un peu de \textsc{rtfm}. -Nous allons donc commencer par Plplot, pour envisager ensuite les alternatives. +Nous allons donc commencer par PlPlot, pour envisager ensuite les alternatives. % -------------------------------------------------------- % @@ -276,10 +283,7 @@ Premièrement, nous allons chosir de démarrer automatiquement dans une fenètre X11, en gardant le reste de la configuration avec ses valeurs par défaut. Pour cela, il suffit de rajouter \texttt{call plsdev('xwin')} juste avant -l'appel à \texttt{plinit}, il vous faudra utiliser la touche -\textsl{} pour sortir\footnote{Une de mes prochaines tâche sera -de regarder comment quitter avec le '\textbf{q}' canonique}. - +l'appel à \texttt{plinit}, Ensuite, pour mettre en évidence notre art, nous allons choisir une couleur pour l'encre (qui est d'un rouge du meilleur effet par défaut en mode "xwin"), @@ -314,17 +318,26 @@ immédiatement garnir de données pertinentes~: Une fois en possession de ces données conceptuelles, que l'on peut aisément voire comme un cheminement, nous allons demander au crayon de se promener sur notre feuille virtuelle en suivant -ce chemin~: +ce chemin, et enfin de s'arreter de dessiner~: \begin{verbatim} call plcol0 (12) call plline (x, y) + call plend () \end{verbatim} Au passage, vous pouvez remarquer la magie du Fortran moderne~: il n'est plus nécessaire de signifier la dimension des tableaux lors de l'appel de la procédure. +Dans ce mode de fonctionnement interactif, +il vous faudra utiliser la touche +\textsl{} pour sortir\footnote{Une de mes prochaines tâche sera +de regarder comment quitter avec le '\textbf{q}' canonique}. +Nous verrons pas la suite comment écrire des fichiers 'image' +vectoriels ou bitmap en mode \textsl{batch}. +Enfin une ouverture vers les Gifs animées\index{gif89a}. + % -------------------------------------------------------- \section{Questions en attente} diff --git a/code/fortran/.gitignore b/code/fortran/.gitignore index be8f205..c838d00 100644 --- a/code/fortran/.gitignore +++ b/code/fortran/.gitignore @@ -3,4 +3,6 @@ plplotting dessiner *.png - +*.gif +WS/*.png +WS/*.eps diff --git a/code/fortran/Makefile b/code/fortran/Makefile index 792a807..886244c 100644 --- a/code/fortran/Makefile +++ b/code/fortran/Makefile @@ -6,3 +6,9 @@ plplotting: plplotting.f90 Makefile dessiner: dessiner.f90 Makefile gfortran -g $< $(INCS) -lplplotfortran -o $@ + + +foo.gif: dessiner Makefile + rm -f WS/A????.png + ./dessiner + convert -delay 10 -colors 31 WS/A????.png foo.gif \ No newline at end of file diff --git a/code/fortran/WS/README.md b/code/fortran/WS/README.md new file mode 100644 index 0000000..a6e9175 --- /dev/null +++ b/code/fortran/WS/README.md @@ -0,0 +1,3 @@ +# Workspace + +This directory must exist if you want to run exemples. diff --git a/code/fortran/dessiner.f90 b/code/fortran/dessiner.f90 index b360f4d..f7ed0fa 100644 --- a/code/fortran/dessiner.f90 +++ b/code/fortran/dessiner.f90 @@ -3,35 +3,17 @@ program dessiner implicit none integer :: i - real :: a, b, c, d character(len=80) :: version call plgver(version) - write (*,'(a,a)') 'plplot version: ', trim(version) + write (*,'(a,a)') 'plPlot version: ', trim(version) - call plsdev('xwin') - call plinit () - - call plenv(-2.2, 2.2, -2.2, 2.2, 0, 1) - - a = 0 - b = 0 - c = 0 - d = 0 - do i=1, 100 - a = a + 0.01 - b = b + 0.02 - call dessin_1 (a, b, 12) - c = c + 0.03 - d = d + 0.04 - call dessin_1 (c, d, 13) - enddo - - call plend + ! call dessin_X11 (0.00, 1.51, 11) + call dessin_dans_un_fichier () contains ! ----------------------------- !------------------------------------------------------ -subroutine dessin_1 (sha, shb, color) +subroutine dessin_X11 (sha, shb, color) real, intent(in) :: sha, shb integer, intent(in) :: color @@ -40,8 +22,13 @@ subroutine dessin_1 (sha, shb, color) real :: k, amp integer :: i - ! print *, 'dessin 1' - amp = 2.0 + print *, 'dessin X11:', sha, shb, color + + call plsdev('xwin') + call plinit () + call plenv (-2.1, 2.1, -2.1, 2.1, 1, 2) + + amp = 2.16 do i = 1, lg k = real(i)/real(lg) * 6.2832 * 4.0 x(i) = amp * sin((k+sha)*5) @@ -54,11 +41,55 @@ subroutine dessin_1 (sha, shb, color) call plcol0 (color) call plline (x, y) + call plend + end subroutine !------------------------------------------------------ -subroutine dessin_2 () +!- _ __ ___ ___ ___ +!- __ _ (_) / _| ( _ ) / _ \ __ _ |__ \ +!- / _` | | | | |_ / _ \ | (_) | / _` | / / +!- | (_| | | | | _| | (_) | \__, | | (_| | |_| +!- \__, | |_| |_| \___/ /_/ \__,_| (_) +!- |___/ + +subroutine dessin_dans_un_fichier () + + integer, parameter :: nbpts = 40 + real :: x(nbpts), y(nbpts) + integer :: frame, i + character(len=89) :: filename + character(len=89) :: buffer + character(len=3) :: str + + print *, 'Dessin dans un fichier' + + do i=1, nbpts + x(i) = 8.50 * (rand() - 0.5000) + y(i) = 8.50 * (rand() - 0.5000) + enddo + + do frame= 0, 149 + write (filename, "(a, i4.4, a)") "WS/A", frame, ".png" + print *, frame, ' => ', trim(filename) + call plsdev ('pngcairo') + call plsfnam (trim(filename)) + call plinit () + call plenv (-10., 10., -10., 10., 0, 1) + call plcol0 (3) + do i=1, nbpts + x(i) = x(i) + (rand() - 0.5000) + y(i) = y(i) + (rand() - 0.5000) + call plline (x, y) + enddo + write(buffer, "(i3.3)") frame + str = trim(buffer) + call plcol0 (15) + call plstring (x, y, buffer) + + call plend + enddo + - print *, 'dessin 2' end subroutine !------------------------------------------------------