LOOKUP2D
function [x,y,typ]=LOOKUP2D(job,arg1,arg2)
// Copyright INRIA
x=[];y=[];typ=[];
select job
case 'plot' then
standard_draw(arg1)
case 'getinputs' then
[x,y,typ]=standard_inputs(arg1)
case 'getoutputs' then
[x,y,typ]=standard_outputs(arg1)
case 'getorigin' then
[x,y]=standard_origin(arg1)
case 'set' then
x=arg1
model=arg1.model
graphics=arg1.graphics
exprs=graphics.exprs
ok=%f;
SaveExit=%f
while %t do
Ask_again=%f
[ok,xx,yy,zz,Method,graf,exprs]=getvalue('2D Lookup table parameters',['Row index input values';'Column index input values';'Table data';'Lookup method(1..5)';'Launch graphic window(y/n)?'],list('vec',-1,'vec',-1,'matrix',[-1,-1],'vec',1,'str',1),exprs)
// 1 : Interpolation-extrapolation (Bilinear)
// 2 : Interpolation_endvalues
// 3 : use input nearest
// 4 : use input below
// 5 : use input above
// 6 : Interpolation-extrapolation (linear)
if ~ok then break;end
mtd=int(Method); if mtd<1 then mtd=1;end; if mtd>6 then mtd=6;end;
if graf<>'y' & graf<>'Y' then graf='n'; end
exprs(5)='n';// exprs.graf='n'
exprs(4)=sci2exp(mtd);// pour le cas methode>7 | method<0
METHOD=getmethod(mtd);
if ~Ask_again then
xx=xx(:);yy=yy(:);
[nx,mx]=size(xx); [ny,my]=size(yy);[nz,mz]=size(zz);
if ((nx<=1)|(ny<=1)) then, x_message('input row/column data size should be greater than one'); Ask_again=%t;end
if ~((nx==nz)&(ny==mz)) then, x_message('incompatible size of x and y'); Ask_again=%t;end
[ok]=test_increasing(xx);if (~ok) then x_message('Row input values must be monotonically increasing');Ask_again=%t;end
[ok]=test_increasing(yy);if (~ok) then x_message('Column input values must be monotonically increasing');Ask_again=%t;end
end
if ~Ask_again then
if (graf=='Y' | graf=='y') then
gh=gcf();
curwin=gh.figure_id;
save_curwin=curwin;
gh2=scf();
curwin=max(winsid())+1;
plot3d(xx,yy,zz,35,45,'X@Y@Z',[5,2,4]) ;
curwin=save_curwin;
gh.figure_id=curwin;
end
model.rpar=[xx(:);yy(:);zz(:)]
model.ipar=[nx;ny;mtd]
graphics.exprs=exprs;
x.model=model
x.graphics=graphics
break
end
end
//======================================================================
case 'define' then
model=scicos_model();
xx=[1:4]
yy=[1:3]
zz=[4,5,6;16,19,20;10,18,23;6, 3,-1];
Method=1;
Graf='n'
Nx=length(xx);
Ny=length(yy);
model.sim=list('lookup2d',4)
model.in=[1;1]
model.out=1
model.rpar=[xx(:);yy(:);zz(:)]
model.ipar=[Nx;Ny;Method]
model.blocktype='c'
model.dep_ut=[%t %f]
exprs=list(strcat(sci2exp(xx)),strcat(sci2exp(yy)),strcat(sci2exp(zz)),sci2exp(Method),Graf)
gr_i=['txt=['' Lookup'';'' table''];';
'xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');';
'txt=''r'';';'xstringb(orig(1)+.01*sz(1), orig(2)+.5*sz(1), txt, sz(1)/6,sz(2)/6,''fill'');'
'txt=''c'';';'xstringb(orig(1)+.01*sz(1), orig(2)+.1*sz(1), txt, sz(1)/6,sz(2)/6,''fill'');'
]
x=standard_define([2.5 2],model,exprs,gr_i)
end
endfunction
function [ok]=test_increasing(xx)
ok=%f
[nx,mx]=size(xx);// adjusting the x and y size
for i=1:mx
if (xx(i)<>xx(i)) then
xinfo('x contains no data in x('+string(i)+')');
return;
end
end
for i=1:mx-1
if (xx(i)>xx(i+1)) then
return;
end
end
ok=%t
endfunction
//============================
function METHOD=getmethod(order)
select order
case 1 then, METHOD='Interpolation-extrapolation(biliniear)'
case 2 then, METHOD='Interpolation_endvalues'
case 3 then, METHOD='use input nearest'
case 4 then, METHOD='use input below'
case 5 then, METHOD='use input above'
case 6 then, METHOD='Interpolation-extrapolation'
end
endfunction
//=========================================================