N.F.I. 3ième année

Manipulations d'attributs

octobre 2004
points et barre à 0.9
Des points tirés d'une distribution uniforme sur [0 1] sont représentés, et on place une barre entre 0 et 1; on affiche la proportion de points de cette distribution, placés à droite de la barre.

La barre est un objet graphique ayant le comportement suivant. Quand on clique au voisinage, à gauche de la barre, elle se déplace de 0.1 sur la gauche. Comportement analogue quand on clique à droite de la barre.
Après chaque déplacement la proportion de points à droite de la barre est mise à jour.

points et barre à 0.6
Principe: une première fonction, appelée dessin met en place tous les éléments graphiques, et le lien (cf. ButtonDownFcn) entre la barre et le traitement déclenché (cf. deplace) quand l'utilisateur clique au voisinage de la barre. La deuxième fonction, deplace, exécute le déplacement de la barre et la mise à jour de la proportion de points à droite de la barre.

Tracé initial

function i_bar=dessin(n)
% Placer les points et la barre; placer le réflexe

% Les points, la barre et le texte affiché
val=rand(n,1);      % valeurs pseudo-aléatoires
plot(val,zeros(n,1),'+')
hold on
% La barre en rouge, à l'abscisse 0.9
xb=0.9; lg=0.5;
i_bar=plot([xb,xb],0.5*[-lg lg],'Color','r','LineWidth',2);
% proportion de valeurs supérieures à xb
pc = sum(val>xb)/length(val);
txt = [num2str(pc) ' valeurs à droite de la barre']
text(0,-lg/2,txt,'Tag','pourcent');
axis([-0.1 1.1 -lg lg])     % bornes sur les axes
hold off                    % fin des tracés

% Pour animation de la barre
a.val = val;
% Le réflexe: deplace(3); (si la fenêtre est 3)
i_gr=get(i_bar,'Parent'); i_fen=get(i_gr,'Parent');
rfx = ['deplace(' int2str(i_fen) ');'];
set(i_bar,'UserData',a, 'ButtonDownFcn',rfx);

Réflexe

function deplace(i_fen)
% Déplacer la barre et afficher nouvelle proportion

i_bar = gcbo;            % la barre, source de l'événement

% Récupérer l'abscisse de la souris
i_gr = get(i_bar,'Parent');                 % les axes
pos_souris = get(i_gr,'CurrentPoint');
x_souris = pos_souris(1,1);                  % ne garder que l'abscisse

% Déplacer la barre
x_bar = get(i_bar,'XData');                 % ses abscisses
if x_souris<x_bar(1), x_bar=x_bar-0.1;       % vers la gauche
else                  x_bar=x_bar+0.1;       % vers la droite
end
set(i_bar,'XData',x_bar);

% Mettre à jour la proportion
a = get(i_bar,'UserData');                  % récupérer les val.alétoires
pc = sum(a.val>x_bar(1))/length(a.val);      % la nouvelle proportion
txt = [num2str(pc) ' valeurs à droite de la barre'];
i_t = findobj(i_fen,'Type','text','Tag','pourcent');    % objet texte
set(i_t,'String',txt);                      % changement du texte