| 1 | Le fond | |
| 2 | Les boutons | |
| 3 | Les informations | |
| 4 | Le source de mandel01 | |
| 5 | La fabrication des images | |
Le fond est composé avec MetaPost.
prologues := 1;
verbatimtex
%&latex
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{marvosym}
\usepackage{mflogo}
\usepackage{times}
\begin{document}
etex
color bouton,fond;
bouton = (0.35,0.5,0.8);
fond = (0.77,0.75,0.2);
vardef linkhttp@#(expr s,z,url,c) =
picture p;
p := thelabel@#(s,z);
special "[ /Rect [ " & decimal ((xpart llcorner p) -2) & " " &
decimal((ypart llcorner p)-2) & " " &
decimal ((xpart urcorner p)+2) & " " &
decimal ((ypart urcorner p)+2) & " ] " &
"/Border [ 0 0 0 ] " &
"/Action << /Subtype /URI /URI (" & url & ") >> " &
"/Subtype /Link /ANN pdfmark";
draw p withcolor c;
enddef;
vardef cadre(expr xmin,ymin,xmax,ymax,r) =
numeric t;
t = 1-1/sqrt(2);
((xmin,ymin) + (0,r)) -- ((xmin,ymax) - (0,r)){dir 90}
.. ((xmin,ymax) + t*(r,-r)) .. {dir 0}
((xmin,ymax) + (r,0)) -- ((xmax,ymax) - (r,0)){dir 0}
.. ((xmax,ymax) - t*(r,r)) .. {dir 270}
((xmax,ymax) - (0,r)) -- ((xmax,ymin) + (0,r)){dir 270}
.. ((xmax,ymin) + t*(-r,r)) .. {dir 180}
((xmax,ymin) - (r,0)) -- ((xmin,ymin) + (r,0)){dir 180}
.. ((xmin,ymin) + t*(r,r)) .. {dir 90}cycle;
enddef;
beginfig(1);
fill (0,0)--(0,450)--(600,450)--(600,0)--cycle withcolor fond;
path c[];
c1 = (184,5)--(584,5)--(584,405)--(184,405)--cycle;
c2 = (32,375)--(132,375)--(132,275)--(32,275)--cycle;
c3 = (0,0)--(120,0)--(120,18)--(0,18)--cycle;
c4 = (20,5)--(144,5)--(144,380)--(20,380)--cycle;
draw (16,410)--(584,410)
withcolor (0.5white-fond)
withpen pencircle scaled 2pt;
label(btex \textbf{Syracuse} etex xscaled 10 yscaled 5 ,(300,425))
withcolor 0.9*fond;
labeloffset := 0;
label.rt(btex \bf
Exploration de l'ensemble de Mandelbrot
etex scaled 3,(16,427))
withcolor 0.6red;
fill cadre(16,120,148,390,5)
withcolor 0.9fond;
draw cadre(16,120,148,390,5)
withpen pencircle scaled 1.5pt
withcolor 0.6fond;
fill c1 withcolor white;
fill c2 withcolor white;
label(btex \large Chargement en cours... etex,(384,205));
label(btex \large Calcul en cours... etex,(82,325));
label(btex \begin{minipage}{120pt}
\begin{center}
-- 9 mai 2004 --\\
Jean-Michel Sarlat
\end{center}
\end{minipage} etex scaled 1.2, (82,60))
withcolor (black -0.6fond);
endfig;
end
Une fois ce fichier chargé et compilé, je dispose d'un fichier fond.1 que je transforme en pdf en m'aidant d'un fichier pilote fond.ps.
<</PageSize [600 450]>> setpagedevice
/TeXBase1Encoding [
% 0x00 (encoded characters from Adobe Standard not in Windows 3.1)
/.notdef /dotaccent /fi /fl
/fraction /hungarumlaut /Lslash /lslash
/ogonek /ring /.notdef
/breve /minus /.notdef
% These are the only two remaining unencoded characters, so may as
% well include them.
/Zcaron /zcaron
% 0x10
/caron /dotlessi
% (unusual TeX characters available in, e.g., Lucida Bright)
/dotlessj /ff /ffi /ffl
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
% very contentious; it's so painful not having quoteleft and quoteright
% at 96 and 145 that we move the things normally found there down to here.
/grave /quotesingle
% 0x20 (ASCII begins)
/space /exclam /quotedbl /numbersign
/dollar /percent /ampersand /quoteright
/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
% 0x30
/zero /one /two /three /four /five /six /seven
/eight /nine /colon /semicolon /less /equal /greater /question
% 0x40
/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
% 0x50
/P /Q /R /S /T /U /V /W
/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
% 0x60
/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
% 0x70
/p /q /r /s /t /u /v /w
/x /y /z /braceleft /bar /braceright /asciitilde
/.notdef % rubout; ASCII ends
% 0x80
/Euro /.notdef /quotesinglbase /florin
/quotedblbase /ellipsis /dagger /daggerdbl
/circumflex /perthousand /Scaron /guilsinglleft
/OE /.notdef /.notdef /.notdef
% 0x90
/.notdef /.notdef /.notdef /quotedblleft
/quotedblright /bullet /endash /emdash
/tilde /trademark /scaron /guilsinglright
/oe /.notdef /.notdef /Ydieresis
% 0xA0
/.notdef % nobreakspace
/exclamdown /cent /sterling
/currency /yen /brokenbar /section
/dieresis /copyright /ordfeminine /guillemotleft
/logicalnot
/hyphen % Y&Y (also at 45); Windows' softhyphen
/registered
/macron
% 0xD0
/degree /plusminus /twosuperior /threesuperior
/acute /mu /paragraph /periodcentered
/cedilla /onesuperior /ordmasculine /guillemotright
/onequarter /onehalf /threequarters /questiondown
% 0xC0
/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
/Egrave /Eacute /Ecircumflex /Edieresis
/Igrave /Iacute /Icircumflex /Idieresis
% 0xD0
/Eth /Ntilde /Ograve /Oacute
/Ocircumflex /Otilde /Odieresis /multiply
/Oslash /Ugrave /Uacute /Ucircumflex
/Udieresis /Yacute /Thorn /germandbls
% 0xE0
/agrave /aacute /acircumflex /atilde
/adieresis /aring /ae /ccedilla
/egrave /eacute /ecircumflex /edieresis
/igrave /iacute /icircumflex /idieresis
% 0xF0
/eth /ntilde /ograve /oacute
/ocircumflex /otilde /odieresis /divide
/oslash /ugrave /uacute /ucircumflex
/udieresis /yacute /thorn /ydieresis
] def
% Activer l'encodage ISO latin1 au moment de la conversion
/ISOEncode {
dup length dict begin
{1 index /FID ne {def} {pop pop} ifelse} forall
/Encoding TeXBase1Encoding def
currentdict
end
/Temporary exch definefont
} bind def
% Récupération dans le systemdict de la procédure setfont
/syssetfont {
systemdict /setfont get exec
} def
% Création dans le userdict d'une procédure setfont adaptée
/setfont {ISOEncode syssetfont} def
% Documentation du PDF
[ /Author (Jean-Michel Sarlat) /DOCINFO pdfmark
[ /Title (fond de présentation de mandel01) /DOCINFO pdfmark
[ /Subject (Ensemble de Mandelbrot) /DOCINFO pdfmark
[ /Creator (Metapost + ps2pdf + pdf2swf) /DOCINFO pdfmark
% Insertion du code généré par MetaPost (prologues != 0)
(fond.1) run
Il ne reste plus qu'a transformer en clip d'animation à l'aide de pdf2swf.
Il y en 6 et pour chacun 3 images correspondant au trois états: normal, souris au dessus, pressé.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Là encore, l'image présentant les informations est fabriquée avec MetaPost suivant la même méthode que pour le fond.
prologues :=1;
verbatimtex
%&latex
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage[frenchb]{babel}
\usepackage{mflogo}
\usepackage{times}
\begin{document}
etex
def cadre = fill (0,0)--(400,0)--(400,400)--(0,400)--cycle
withcolor 0.9white; enddef;
beginfig(1);
% échappement de l'encodage latin1 pour ces trois fontes
special "/cmsy10 {/CMSY10 /OT1 1 def} def";
special "/cmr10 {/CMR10 /OT1 1 def} def";
special "/logo10 {/LOGO10 /OT1 1 def} def";
cadre;
label(btex
\begin{minipage}{11cm}
L'application montre deux images:
\begin{itemize}
\item celle de gauche (100$\times$100) est celle à partir de laquelle
s'effectue la navigation,
\item celle de droite (400$\times$400, où
s'inscrit ce texte) n'est qu'un agrandissement de la première (bouton:
{\sf Agrandissement}).
\end{itemize}
\vspace{0.5cm}
Les images sont calculées sur le serveur Mélusine, en cliquant sur
\begin{itemize}
\item l'imagette, vous centrez l'image au point sous le curseur;
\item le bouton {\sf Zoom avant}, vous diminuez la zone couverte par
l'image d'un facteur 1.5;
\item le bouton {\sf Zoom arrière}, vous agrandissez la zone couverte
par l'image d'un facteur 1.5;
\item le bouton {\sf Rotation de palette}, vous modifiez la palette
de couleurs (15 en tout);
\item le bouton {\sf Initialisation}, vous reprenez la zone initiale
couvrant l'ensemble de Mandelbrot.
\end{itemize}
\vspace{0.5cm}
Cette application est obtenue à l'aide de \LaTeX{} et \MP{} pour la
présentation, la librairie GD pour les images et les SWF Tools pour
l'assemblage.
\end{minipage}
etex scaled 1.15, (200,200)) withcolor (0.4,0.25,0.1);
endfig;
end
%!
<</PageSize [400 400]>> setpagedevice
/TeXBase1Encoding [
% 0x00 (encoded characters from Adobe Standard not in Windows 3.1)
/.notdef /dotaccent /fi /fl
/fraction /hungarumlaut /Lslash /lslash
/ogonek /ring /.notdef
/breve /minus /.notdef
% These are the only two remaining unencoded characters, so may as
% well include them.
/Zcaron /zcaron
% 0x10
/caron /dotlessi
% (unusual TeX characters available in, e.g., Lucida Bright)
/dotlessj /ff /ffi /ffl
/.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef
% very contentious; it's so painful not having quoteleft and quoteright
% at 96 and 145 that we move the things normally found there down to here.
/grave /quotesingle
% 0x20 (ASCII begins)
/space /exclam /quotedbl /numbersign
/dollar /percent /ampersand /quoteright
/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
% 0x30
/zero /one /two /three /four /five /six /seven
/eight /nine /colon /semicolon /less /equal /greater /question
% 0x40
/at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
% 0x50
/P /Q /R /S /T /U /V /W
/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
% 0x60
/quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
% 0x70
/p /q /r /s /t /u /v /w
/x /y /z /braceleft /bar /braceright /asciitilde
/.notdef % rubout; ASCII ends
% 0x80
/Euro /.notdef /quotesinglbase /florin
/quotedblbase /ellipsis /dagger /daggerdbl
/circumflex /perthousand /Scaron /guilsinglleft
/OE /.notdef /.notdef /.notdef
% 0x90
/.notdef /.notdef /.notdef /quotedblleft
/quotedblright /bullet /endash /emdash
/tilde /trademark /scaron /guilsinglright
/oe /.notdef /.notdef /Ydieresis
% 0xA0
/.notdef % nobreakspace
/exclamdown /cent /sterling
/currency /yen /brokenbar /section
/dieresis /copyright /ordfeminine /guillemotleft
/logicalnot
/hyphen % Y&Y (also at 45); Windows' softhyphen
/registered
/macron
% 0xD0
/degree /plusminus /twosuperior /threesuperior
/acute /mu /paragraph /periodcentered
/cedilla /onesuperior /ordmasculine /guillemotright
/onequarter /onehalf /threequarters /questiondown
% 0xC0
/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
/Egrave /Eacute /Ecircumflex /Edieresis
/Igrave /Iacute /Icircumflex /Idieresis
% 0xD0
/Eth /Ntilde /Ograve /Oacute
/Ocircumflex /Otilde /Odieresis /multiply
/Oslash /Ugrave /Uacute /Ucircumflex
/Udieresis /Yacute /Thorn /germandbls
% 0xE0
/agrave /aacute /acircumflex /atilde
/adieresis /aring /ae /ccedilla
/egrave /eacute /ecircumflex /edieresis
/igrave /iacute /icircumflex /idieresis
% 0xF0
/eth /ntilde /ograve /oacute
/ocircumflex /otilde /odieresis /divide
/oslash /ugrave /uacute /ucircumflex
/udieresis /yacute /thorn /ydieresis
] def
% Activer l'encodage ISO latin1 au moment de la conversion
/ISOEncode {
dup length dict begin
{1 index /FID ne {def} {pop pop} ifelse} forall
/Encoding TeXBase1Encoding def
currentdict
end
/Temporary exch definefont
} bind def
% Récupération dans le systemdict de la procédure setfont
/syssetfont {
systemdict /setfont get exec
} def
% Création dans le userdict d'une procédure setfont adaptée
/OT1 0 def
/setfont {OT1 1 eq {}{ISOEncode} ifelse syssetfont /OT1 0 def} def
% Documentation du PDF
[ /Author (Jean-Michel Sarlat) /DOCINFO pdfmark
[ /Title (Informations concernant mandel01) /DOCINFO pdfmark
[ /Subject (Ensemble de Mandelbrot) /DOCINFO pdfmark
[ /Creator (Metapost + ps2pdf + pdf2swf) /DOCINFO pdfmark
% Insertion du code généré par MetaPost (prologues != 0)
% Les fontes déclarées dans infos.1 doivent être accessibles à gs via Fontmap.GS
(infos.1) run
.flash name="mandel01.swf" bbox=600x450 version=6
.swf fond "fond.swf"
.put fond 0 0
.box imgControle width=100 height=100 fill=white color=white
.sprite clipControle
.put imgControle 32 75
.end
.box imgBouton width=120 height=18 fill=#869537 color=#869537
.sprite clipBouton
.put imgBouton -120 -18
.end
.action:
var palette = ["210","120","201","102","021","420","321","312",
"231","213","123","132","000","222","012"];
var ic = 0;
var xc = -0.7;
var yc = 0;
var rc = 1.5;
_root.attachMovie("clipControle","controle",1);
_root.createEmptyMovieClip("imagette",2);
_root.createEmptyMovieClip("image",3);
function majImagette () {
imagette.loadMovie("/syracuse/cgi-bin/mandel01jpeg.pl?z=n&p=" +
palette[ic] + "&xc=" + xc + "&yc=" + yc + "&rc=" + rc);
}
function majImage () {
image.loadMovie("/syracuse/cgi-bin/mandel01jpeg.pl?z=o&p=" +
palette[ic] + "&xc=" + xc + "&yc=" + yc + "&rc=" + rc);
}
function afficheInfos () {
image.loadMovie("infos.swf");
}
imagette._x = 32;
imagette._y = 75;
image._x = 184;
image._y = 45;
controle._alpha = 0;
controle.onPress = function () {
var xt = _root._xmouse - 82;
var yt = _root._ymouse - 125;
xc = xc + xt /50 * rc;
yc = yc - yt /50 * rc;
majImagette();
};
majImagette();
majImage();
.end
.jpeg zav filename="za-normal.jpg" quality=100%
.jpeg zav2 filename="za-dessus.jpg" quality=100%
.jpeg zav3 filename="za-pressed.jpg" quality=100%
.button zavbouton
.show zav as=idle
.show zav2 as=hover
.show zav3 as=pressed
.on_press:
rc /= 1.5;
majImagette();
.end
.end
.put zavbouton 22 187
.jpeg zar filename="zar-normal.jpg" quality=100%
.jpeg zar2 filename="zar-dessus.jpg" quality=100%
.jpeg zar3 filename="zar-pressed.jpg" quality=100%
.button zarbouton
.show zar as=idle
.show zar2 as=hover
.show zar3 as=pressed
.on_press:
rc *= 1.5;
majImagette();
.end
.end
.put zarbouton 22 210
.jpeg ag filename="ag-normal.jpg" quality=100%
.jpeg ag2 filename="ag-dessus.jpg" quality=100%
.jpeg ag3 filename="ag-pressed.jpg" quality=100%
.button agbouton
.show ag as=idle
.show ag2 as=hover
.show ag3 as=pressed
.on_press:
majImage();
.end
.end
.put agbouton 22 233
.jpeg rp filename="r-normal.jpg" quality=100%
.jpeg rp2 filename="r-dessus.jpg" quality=100%
.jpeg rp3 filename="r-pressed.jpg" quality=100%
.button rpbouton
.show rp as=idle
.show rp2 as=hover
.show rp3 as=pressed
.on_press:
ic = (ic + 1) % 15;
majImagette();
.end
.end
.put rpbouton 22 256
.jpeg ini filename="i-normal.jpg" quality=100%
.jpeg ini2 filename="i-dessus.jpg" quality=100%
.jpeg ini3 filename="i-pressed.jpg" quality=100%
.button inibouton
.show ini as=idle
.show ini2 as=hover
.show ini3 as=pressed
.on_press:
xc = -0.7; yc = 0; rc = 1.5; majImagette();
.end
.end
.put inibouton 22 279
.jpeg inf filename="in-normal.jpg" quality=100%
.jpeg inf2 filename="in-dessus.jpg" quality=100%
.jpeg inf3 filename="in-pressed.jpg" quality=100%
.button infbouton
.show inf as=idle
.show inf2 as=hover
.show inf3 as=pressed
.on_press:
afficheInfos();
.end
.end
.put infbouton 22 302
.end
Elle est assurée par un petit programme en C: mandel01jpeg.c déjà utilisé (avec une sortie PNG) sur ce site à la page http://melusine.eu.org/syracuse/gd/mandel01/.