-- Bug description --
The Sfgrayplot function hangs on small instance of dataset.
-- Scilab error message --
feval: stack size exceeded (Use stacksize function to increase it).
at line 51 of function Sfgrayplot called by :
Sfgrayplot(x,y,zones,rect=[-x0,-y0,x0,y0],strf="040")
-- How to reproduce the bug --
clf();
n=5; //nombre de rayons de zones
p0=100.25; //ordre au centre (voir plus bas)
thetamax=sqrt(n/p0); //rayon limite de la (n-1)éme zone
N1=5; a=thetamax/N1;delta=thetamax+a; //fraction du rayon limite entre la dernière zone et le bord;
//distance correspondante; demi-côté du carré d'un sytème de zones;
N2=11; //nombre de zones sur une ligne ou une colonne;
function [z]=anneaux(x,y)
theta=sqrt((x-delta).^2+(y-delta).^2);
if theta <thetamax then
z=1/2*(1+cos(2*%pi*p0*cos(theta)))
else
z=0;
end
endfunction
function [w]=zones(x,y)
w=anneaux(x-floor(x/(2*delta))*2*delta,y-floor(y/(2*delta))*2*delta);
endfunction
function [M]=macouleur(n)
r(1)=0;v(1)=0;b(1)=0;
r(2)=1;v(2)=1;b(2)=1;
[M]=[r v b];
endfunction
x0=N2*delta;y0=N2*delta;
x=-x0-2*delta:0.01:x0;
y=-y0-2*delta:0.01:y0;
xset("colormap",macouleur(2))
Sfgrayplot(x,y,zones,rect=[-x0,-y0,x0,y0],strf="040")
//Les rayons des cercles limites consécutifs doivent être proportionnels aux racines carrées des entiers consécutifs.
//Si p0 est l'ordre d'interférence au centre, et pour theta petit, sur un cercle d'intensité égale à la moitié du max :
// 2*pi*p0*(1-theta^2/2) = 2*pi*Ent(p0)+pi/2-n*pi (avec n >=1). On peut écrire aussi :
// p0*(1-theta^2/2) = Ent(p0)+1/4-n*pi et
// theta^2/2=p0-Ent(p0)-1/4 + n*pi
//On obtient theta proportionnel à sqrt(n) si p0-Ent(p0)=1/4, d'où les valeurs de p0 ci-dessus avec le .25.
//Pour n=0, theta=0 vérifie la condition et se trouve (heureusement) au début, et non à la fin d'un disque brillant.