trackplot.m 25.07 KiB
function [tout, Nout] = trackplot(varargin)
%TRACKPLOT Estimates the line of synchronization in a cross recurrence plot.
% TRACKPLOT(X [,DX, DY, FP, PARAM]) estimates the line of synchronization in a
% cross recurrence plot X. The resulted path can be saved to the
% workspace variable T_OUT. This command allows interactive
% changing of estimation parameters.
%
% [A B]=TRACKPLOT(X,DX,DY) estimates the LOS in a recurrence
% plot X and stores it in A. The number of recurrence points
% met by the LOS is stored in B(1) and the number of lacks in
% the LOS is stored in B(2).
%
% TRACKPLOT(X,DX,DY,FP) estimates a LOS whith some fixed points
% given by the two-column vector FP (eg. [194 0; 201 10]).
%
% Parameter: The search of the LOS can be forced with the
% parameters DX and DY. PARAM can be used to suppress the GUI
% (useful in order to use this programme by other programmes).
%
% Suppressing the GUI.
% gui - Creates the GUI and the output plot.
% nogui - Suppresses the GUI and the output plot.
% silent - Suppresses all output.
%
% Examples: y = sin([1:900]*2*pi/67)';
% y2 = sin(.01*([1:900]*2*pi/67).^2)';
% x = crp_big(y,y2,3,12,.1,'fan','nogui');
% trackplot(x,2,2)
%
% See also CRP2, CRP and CRP_BIG.
%
% References:
% Marwan, N., Thiel, M., Nowaczyk, N.: Cross Recurrence Plot Based
% Synchronization of Time Series, Nonlin. Proc. Geophys., 2001.
% Copyright (c) 1998-2005 by AMRON
% Norbert Marwan, Falko Zetsche, Potsdam University, Germany
% http://www.agnld.uni-potsdam.de
%
% $Date$
% $Revision$
%
% $Log$
% Revision 4.9 2005/09/02 08:02:57 marwan
% line fitting algorithm improved (linear interpolation between set points)
%
% Revision 4.8 2005/03/16 11:19:02 marwan
% help text modified
%
% Revision 4.7 2004/11/10 07:09:31 marwan
% initial import
%
%
% This program is part of the new generation XXII series.
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or any later version.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% programme properties
global errcode props
init_properties
errcode=0; mflag=0;fixp=[]; X=[];Dmax1=1;Dmax2=1;
set(0,'ShowHidden','On')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% check and read the input
warning off
error(nargchk(1,5,nargin)) % error, if < 1 oder > 4 input variables
if nargout>2, error('Too many output arguments'), end
if isnumeric(varargin{1}) % read commandline input
vargin{4}=[];
i_double=find(cellfun('isclass',varargin,'double'));
i_char=find(cellfun('isclass',varargin,'char'));
% check the text input parameter for gui
check_gui={'gui','nog','sil'};
temp_gui=0;
if ~isempty(i_char)
for i=1:length(i_char),
varargin{i_char(i)}(4)='0';
temp_gui=temp_gui+strcmpi(varargin{i_char(i)}(1:3),check_gui');
end
nogui=min(find(temp_gui))-1;
if isempty(nogui), nogui=0; end
if nogui>2,nogui=2; end
else
nogui=0;
end
% get the parameters for creating RP
if max(size(varargin{1}))<2
error('Too less values in data X.')
end
X=double(varargin{1});
Nx = size(X,2); Ny = size(X,1);
if nargin<3 ,Dmax1=1; Dmax2=1;
else
if isnumeric(varargin{2}), Dmax1=double(varargin{2});
else Dmax1=1;
end
if isnumeric(varargin{3}), Dmax2=double(varargin{3});
else Dmax2=1;
end
end
if nargin>=4
if isnumeric(varargin{4}), fixp=fliplr(varargin{4});
fixp = sortrows(fixp,1);
else fixp=[];
end
end
action='start_gui';
else
%%%%%%%%%%%%%%%%%%%%%%%%%% read input from the GUI
action=varargin{1};
nogui=0;
h=get(gcf,'Name');
h=h(findstr(h,'(')+1:findstr(h,')')-1);
hTP=findobj('Name',['TrackPlot (' h ')']);
hTPCtrl=findobj('Name',['TPControl (' h ')']);
h=str2num(h);
temp=get(findobj('Tag','fixp','Parent',findobj('Parent',hTP,'Tag','TPPlot')),'XData');
if ~isempty(temp)
for i=1:length(temp), if iscell(temp), fixp(i,1)=temp{i}; else, fixp(i,1)=temp(i); end, end
temp=get(findobj('Tag','fixp','Parent',findobj('Parent',hTP,'Tag','TPPlot')),'YData');
for i=1:length(temp), if iscell(temp), fixp(i,2)=temp{i}; else, fixp(i,2)=temp(i); end, end
fixp = sortrows(fixp,1);
else
fixp=[];
end
if ( nogui == 0 & ~isempty(hTPCtrl))
Dmax1=str2num(get(findobj('Tag','LOSwidthX','Parent',hTPCtrl),'string'));
Dmax2=str2num(get(findobj('Tag','LOSwidthY','Parent',hTPCtrl),'string'));
X=double(get(findobj('Tag','RP','Parent',findobj('Parent',hTP,'Tag','TPPlot')),'UserData'));
Nx=size(X,2); Ny=size(X,1);
end
if isempty(findobj('Tag','TPFig')) & nogui==0
action='start_gui';
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% splash the GPL
splash_gpl('trackplot');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nogui
if nogui>0
hTP=9999;
action='LOSsearch';
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% switch routines
try
switch(action)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% start_gui
case 'start_gui'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% create GUI
errcode=2;
if isempty(X)
lasterr(['??? Error using ==> trackplot',10,...
'No properly input. Check the class of input.',10,...
'Only INT and DOUBLE are allowed, but not LOGICAL.'])
disp(lasterr)
return
end
scr=get(0,'ScreenSize');
root_ud=get(0,'UserData');
if isstruct(root_ud)
if isfield(root_ud,'tp')
if ~isempty(root_ud.tp)
root_ud.tp=[root_ud.tp max(root_ud.tp)+1];
else
root_ud.tp=1;
end
h=num2str(root_ud.tp(end));
else
root_ud.tp=1;
h=num2str(1);
end
else
root_ud.old=root_ud;
root_ud.tp=1;
h=num2str(1);
end
set(0,'UserData',root_ud)
%%%%%%%%%%%%%%%%% Trackplot Figure
h8=figure('Tag','TPFig',... %Plot Figure
'Position',[scr(3)/4 scr(4)/4 3*scr(3)/8 3*scr(3)/8 ],...
'NumberTitle','off',...
'Name',['TrackPlot (' h ')'],...
'Color',props.window.Color,...
'DeleteFcn','trackplot smartclose',...
'PaperType','a4',...
'PaperOrientation','portrait');
set(h8,props.window,'Units','Norm')
h1=axes(props.axes,'Parent',h8, ... % Initialize CRP Plot
'Units','normalized', ...
'Position',[.1 .1 .8 .8], ...
'Color',[1 1 1], ...
'Tag','TPPlot', ...
'XColor',[0 0 0], ...
'YColor',[0 0 0], ...
'ZColor',[0 0 0]);
h2=imagesc('Tag','RP','Parent',h1); % Plot Data
X=(X-min(min(X)))/(max(max(X))-min(min(X)));
% set(h2,'cdata',64*(-(X-max(max(X)))),'UserData',X);
axis tight
minvalue=min(min(X));maxvalue=max(max(X));
set(h1,'tickdir','out','box','on','layer','top')
h4=line('Parent',h1,'visible','off','Tag','Diagonal',...
'color',[1 0 0],'LineWidth',1);
cm={'hsv';'hot';'gray';'french';'bone';'copper';... % Colormap
'pink';'flag';'lines';'colorcube';...
'jet';'prism';'cool';'autumn';...
'spring';'winter';'summer'};
h0=uimenu('Label','Colormap','Tag','cm');
if (length(find(X==minvalue))+length(find(X==maxvalue))==length(X(:)))
set(h2,'cdata',(-X),'UserData',X);
colormap((gray(2))); cmflag=0;
else
set(h2,'cdata',(X),'UserData',X);
colormap(french(256)); cmflag=1;
end
set(h1,'XLim',[0 size(X,2)], 'YLim',[0 size(X,1)])
for i=1:length(cm);
h1=uimenu(h0,'Label',cm{i},'Checked','Off',...
'Tag',num2str(i),...
'Callback','trackplot colormap');
if i==18 & cmflag==1, set(h1,'Checked','On'), end
end
h1=uimenu(h0,'Label','b/w','Tag','18','Callback','trackplot colormap');
if cmflag==0, set(h1,'Checked','On'), end
h1=uimenu(h0,'Label','inverse','Tag','19','Separator','On','Callback','trackplot colormap');
h1=uimenu('Label','SmartClose',... % SmartClose
'Callback','trackplot smartclose');
%%%%%%%%%%%%%%%%% Control Figure
errcode=3;
h3=figure('Tag','TPFig',... % Control Figure
'Position',[5*scr(3)/8+10 scr(4)/4 1*scr(3)/6 3*scr(4)/9.8],...
'NumberTitle','off',...
'Color',props.window.Color,...
'Name',['TPControl (' h ')'],...
'DeleteFcn','trackplot handlevisON',...
'MenuBar','None',...
'Resize','Off');
set(h3,props.window,'Units','Norm')
uicontrol(props.frame, ... % Frame LOSsearch
'Units','Normalized',...
'Position',[.1 .51 .8 .42]);
h0=uicontrol(props.text,... % Text LOSsearch
'Units','Normalized',...
'FontAngle','italic', ...
'String','LOS Search',...
'Tag','TextLOSsearch',...
'Enable','on',...
'Position',[.13 .846 .35 .065]);
h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)])
uicontrol(props.button,... % Set Point
'Units','Normalized',...
'Tag','SetPoint',...
'String','Set Point',...
'Position',[.16 .765 .314 .08],...
'Enable','on',...
'ToolTip','Set a Point on LOS.',...
'CallBack','trackplot LOSset');
uicontrol(props.button,... % Clear Point
'Units','Normalized',...
'Tag','ClearPoint',...
'String','Clear P',...
'Position',[.52 .765 .314 .08],...
'Enable','on',...
'ToolTip','Clear a Point on LOS.',...
'CallBack','trackplot LOSclear');
uicontrol(props.button,... % Clear All Point
'Units','Normalized',...
'Tag','ClearAllPoint',...
'String','Clear All',...
'Position',[.52 .65 .314 .08],...
'Enable','on',...
'ToolTip','Clear All Points on LOS.',...
'CallBack','trackplot LOSallclear');
h0=uicontrol(props.text,... % Text LOSwidthX
'Units','Normalized',...
'Tag','LOSwidthXtext',...
'String','dx:',...
'Position',[.16 .542 .35 .07],...
'Enable','on');
h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)])
h0=uicontrol(props.edit,... % Input LOSwidthX
'Units','Normalized',...
'Tag','LOSwidthX',...
'Position',[.31 .55 .14 .06],...
'String',num2str(Dmax1),...
'Enable','on',...
'ToolTip','Insert the LOS search width in X-direction.' );
h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)])
h0=uicontrol(props.text,... % Text LOSwidthY
'Units','Normalized',...
'Tag','LOSwidthYtext',...
'String','dy:',...
'Position',[.52 .542 .35 .07],...
'Enable','on');
h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)])
h0=uicontrol(props.edit,... % Input LOSwidthY
'Units','Normalized',...
'Tag','LOSwidthY',...
'Position',[.68 .55 .14 .06],...
'String',num2str(Dmax2),...
'Enable','on',...
'ToolTip','Insert the LOS search width in Y-direction.' );
h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)])
if ~isunix
h0=uicontrol(props.frame, ... % Frame Embedding
'Units','Normalized',...
'Position',[.1 .365 .38 .11]);
end
uicontrol(props.checkbox, ... % Button Stretch Plot
'Units','Normalized',...
'String','Stretch', ...
'Position',[.1 .365 .38 .11], ...
'Tag','Stretch',...
'CallBack','trackplot stretch',...
'Value',1,...
'ToolTip','Streches the plotted CRP to a squared plot.' );
uicontrol(props.button,... % Button Stores LOS
'Units','Normalized',...
'String','Store',...
'Position',[.52 .365 .38 .11],...
'Tag','Store2',...
'Callback','trackplot store2',...
'Enable','off',...
'ToolTip','Stores the LOS.');
uicontrol(props.button,... % Button ApplyLOSsearch
'Units','Normalized',...
'String','Find LOS',...
'Position',[.1 .22 .8 .11],...
'Tag','Apply2',...
'Callback','trackplot LOSsearch',...
'Enable','on',...
'ToolTip','Searches the LOS.');
uicontrol(props.button,... % Button Help
'Units','Normalized',...
'String','Help',...
'Position',[.1 .075 .38 .11],...
'Tag','Help',...
'Callback','helpwin trackplot',...
'ToolTip','Opens the helpwindow.');
uicontrol('Parent',h3, ...
props.button,... % Button Close
'Units','Normalized',...
'String','Close',...
'Position',[.52 .075 .38 .11],...
'Tag','Close',...
'Callback','trackplot close',...
'ToolTip','Closes Trackplot windows.');
set(h8, 'HandleVis','CallBack')
set(h3, 'HandleVis','CallBack')
if nargout>=1
tout=h0;
end
if nargout>=2
Nout=h2;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% change colormap
case 'colormap'
errcode=81;
c=str2num(get(gcbo,'Tag'));
if c~=19,
set(get(get(gcbo,'Parent'),'Children'),'Checked','Off')
set(gcbo,'Checked','On')
end
cm_old=get(hTP,'Colormap');
cm=[{hsv(256)}; {hot(256)}; {gray(256)};...
{french(256)}; {bone(256)}; {copper(256)}; {pink(256)};...
{flag(256)}; {lines(256)}; {colorcube(256)};...
{jet(256)}; {prism(256)}; {cool(256)};...
{autumn(256)}; {spring(256)}; {winter(256)};...
{summer(256)}; {(gray(2))}; {flipud(cm_old)}];
set(hTP,'Colormap',(cm{c}))
clear cm cm_old c
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% handlevisON
case 'handlevisON'
set(hTP, 'HandleVis','on')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% close
case 'close'
errcode=101;
if ~isempty(findobj('Tag','TPFig')), delete(findobj('Tag','TPFig')), end
root_ud=get(0,'UserData');
if isstruct(root_ud)
if isfield(root_ud,'tp')
root_ud=rmfield(root_ud,'tp');
if length(fieldnames(root_ud))==1
if isfield(root_ud,'old'); root_ud=root_ud.old; end
end
end
end
try, set(0,'UserData',root_ud,props.root), end
clear all
disp('Thank you for using CRP toolbox.')
case 'smartclose'
errcode=102;
[h h1]=strtok(get(hTP,'Name'),'(');
h1([1, end])=[];
if ishandle(hTPCtrl), delete(hTPCtrl), end
if ishandle(hTP), delete(hTP), end
root_ud=get(0,'UserData');
if isstruct(root_ud)
if isfield(root_ud,'tp')
root_ud.tp(root_ud.tp==str2num(h1))=[];
if isempty(root_ud.tp), root_ud=rmfield(root_ud,'tp'); end
end
if length(fieldnames(root_ud))==1
if isfield(root_ud,'old'); root_ud=root_ud.old; end
end
end
try, set(0,'UserData',root_ud,props.root), end
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% store2
case 'store2'
errcode=15;
t=get(findobj('Tag','Apply2','Parent',hTPCtrl),'UserData');
if isempty(t)
warndlg('The LOS vector is still empty. Please start the computation of the LOS before storing.','No LOS')
waitforbuttonpress
else
assignin('base','t_out', t)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% stretch
case 'stretch'
errcode=7;
if get(findobj('Tag','Stretch','Parent',gcf),'value')==1
set(findobj('Tag','TPPlot','Parent',hTP),'PlotBoxAspectRatio',[1 1 1])
elseif get(findobj('Tag','Stretch','Parent',gcf),'value')==0
set(findobj('Tag','TPPlot','Parent',hTP),'PlotBoxAspectRatio',[Nx Ny 1])
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSmove
case 'LOSmove'
errcode=16;
if isempty(get(gco,'UserData'))
set(gco,'UserData',1,'ButtonDownFcn','trackplot LOSmove_end')
set(gcf,'WindowButtonMotionFcn','trackplot LOSmove')
end
h1 = round(get(gca,'CurrentPoint'));
set(gco, 'XData', h1(1,1), 'YData', h1(1,2))
clear h1
case 'LOSmove_end'
if ~isempty(get(gco,'UserData'))
set(gco,'UserData',[],'ButtonDownFcn','')
set(gcf,'WindowButtonMotionFcn','')
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSclear
case 'LOSclear'
errcode=17;
if gcf==hTPCtrl
figure(hTP)
k=waitforbuttonpress;
h1 = round(get(gca,'CurrentPoint')); h1(2,:)=[]; h1(:,3)=[];
finalRect = rbbox;
h2 = round(get(gca,'CurrentPoint')); h2(2,:)=[]; h2(:,3)=[];
h(1,1)=min(h1(:,1),h2(:,1));h(2,1)=max(h1(:,1),h2(:,1));
h(1,2)=min(h1(:,2),h2(:,2));h(2,2)=max(h1(:,2),h2(:,2));
i=find(fixp(:,1)>=h(1,1) & fixp(:,2)>=h(1,2) & fixp(:,1)<=h(2,1) & fixp(:,2)<=h(2,2));
for j=1:length(i); delete(findobj('tag','fixp','Parent',findobj('Parent',hTP,'Tag','TPPlot'),'xdata',fixp(i(j),1))), end
else
h(1,1)=get(gco,'XData');h(1,2)=get(gco,'YData');
delete(gco)
end
clear h
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSallclear
case 'LOSallclear'
errcode=171;
delete(findobj('tag','fixp','Parent',findobj('Parent',hTP,'Tag','TPPlot')))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSset
case 'LOSset'
errcode=18;
if gcf==hTPCtrl
figure(hTP)
ginput(1);
end
h=round(get(gca,'currentp'));
fixp(end+1,1)=h(1,1); fixp(end,2)=h(1,2);
[i j]=sort(fixp(:,1));
fixp=fixp(j,:);
h0=uicontextmenu;
line(h(1,1),h(1,2),1000,...
'MarkerSize',12,...
'Marker','.',...
'Color',[1 0 0],...
'Tag','fixp',...
'UIContextMenu',h0)
uimenu(h0, 'Label', 'Set Point', 'Callback', 'trackplot LOSset')
uimenu(h0, 'Label', 'Move Point', 'Callback', 'trackplot LOSmove')
uimenu(h0, 'Label', 'Clear Point', 'Callback', 'trackplot LOSclear')
clear h h0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSsearch
case 'LOSsearch'
errcode=19;
x0=0;
y0=0;
N=size(X);
Nleer=0; Nvoll=0;
minvalue=min(min(X));maxvalue=max(max(X));
if (length(find(X==minvalue))+length(find(X==maxvalue))==length(X(:)))
flagpoint=0;
% supress output for 'silence'
if nogui~=2
h_wait=waitbar(0,'Compute LOS ...');
set(h_wait,'HandleVisibility','on',props.window);
end
if nogui==0
setptr([hTP,hTPCtrl],'watch')
h=findobj('Tag','Apply2','Parent',hTPCtrl);
obj.children=get(hTPCtrl,'Children');
obj.enable=get(obj.children,'Enable');
set(obj.children,'Enable','off')
set(h(1),'String','Stop',...
'ToolTip','Stops the computation.',...
'Enable','on',...
'Callback','set(gcbo,''String'',''Stopped'')')
end
% looks for the beginning of the diagonal LOS
errcode=191;
for i=1:N(2);
if nogui==0
if check_stop_LOS(hTP,hTPCtrl,nogui,obj), break, end
end
if nogui~=2
waitbar(i/N(2))
end
if i<=N(1)
if ~isempty(fixp), if i>=fixp(1,1), x0=fixp(1,1); y0=fixp(1,2); end, end
if X(i+y0,1+x0)~=0
v=i+y0;
h=1+x0;
break
end
end
if X(1+y0,i+x0)~=0
h=i+x0;
v=1+y0;
break
end
end
if ~isempty(fixp) & nogui~=0
h=fixp(1,1);v=fixp(1,2);x0=0;y0=0;
end
Nleer=i-1;
% t(1:v)=h;
t(1+x0:h)=v;
% start estimation of the LOS
errcode=192;
mflag=0;
i=2;
while h<N(2)-1 & v<N(1)-1 & mflag~=1,
if nogui==0
if check_stop_LOS(hTP,hTPCtrl,nogui,obj), break, end
end
if nogui~=2
waitbar(h/N(2))
end
dw=1;
if v < 1, v = 1; end
if h < 1, h = 1; end
W=X(v:v+dw,h:h+dw);
W(1,1)=0;
if ~isempty(fixp)
if find(h==fixp(:,1))
dv=fixp(find(h==fixp(:,1)),2)-v;
dh=1;
if dv <= 0
h0 = min(find(t > v+dv));
if isempty(h0), h0 = h; end
t0 = t(end) + dv;
fixold = find(h==fixp(:,1));
if ~isempty(fixold) & fixold > 1; fixold = fixp(fixold - 1,1); else fixold = 0; end
h1 = max([h0-min([Dmax1,Dmax2]);1;fixold]);
h2 = max([h0;1;fixold]);
% h1 = max([h-2*(h-h0);1])
if length(t) > h1 & length(t) > h2
t1 = t(h1);
t2 = t(h2);
p = polyfit([h1 h2 h],[t1 t2 t0],1);
t(h1:h) = polyval(p,h1:h);
% t(h1:h) = spline([h1 h2 h],[t1 t2 t0],h1:h);
end
v = v + dv;
dv = 1; dw = 0;
end
flagpoint=1;
end
end
if flagpoint==0;
% looks for the existence of the next recurrence point in diagonal direction
errcode=193;
while sum(sum(W))==0 & mflag==0 & flagpoint==0,
Nleer=Nleer+1;
if ~isempty(fixp)
if find(h+dw==fixp(:,1))
W=1; dh=dw;
flagpoint=1;
break
end
end
dw=dw+1;
if v+dw < N(1) & h+dw < N(2)
W=X(v:v+dw,h:h+dw);
W(1,1)=0;
else
mflag=1;
end
end
if mflag==1
break
end
% determines the coordinates of the next recurrence point
errcode=194;
dh0=min(find(sum(W)));
dv0=min(find(sum(W')));
dh=min(find(W(dv0,:)));
dv=min(find(W(:,dh0)));
if dh>dh0, dh=dh0;end
if dv>dv0, dv=dv0;end
% determines the local width of the diagonal LOS
errcode=195;
dh1=dh;
dv1=dv;
% neues Fenster
WL1=Dmax1;
WL2=Dmax2;
if v+dv1-2+WL2>=N(1), WL2=N(1)-(v+dv1-2); end
if h+dh1-2+WL1>=N(2), WL1=N(2)-(h+dh1-2); end
Wn=X(v+dv1-1:v+dv1-2+WL2,h+dh-1:h+dh-2+WL1);
% Schwerpunkt davon ausrechnen
if sum(sum(Wn))~=0, Sh=sum(sum(Wn).*[1:WL1])/sum(sum(Wn));else Sh=WL1/2;end
if sum(sum(Wn'))~=0,Sv=sum(sum(Wn').*[1:WL2])/sum(sum(Wn'));else Sv=WL2/2;end
% neue Dmax berechnen
if Sh>=Sv, Dmax2n=WL1*Sv/Sh; Dmax1n=WL1; end
if Sv>Sh, Dmax1n=WL2*Sh/Sv; Dmax2n=WL2; end
% while X(v+dv1-1,h:dh-1)==1 & v+dv1-1<N(1) &dv1<Dmax2
while X(v+dv1-1,h+dh-1)==1 & v+dv1-1<N(1) &dv1<Dmax2n
dv1=dv1+1;
end
% while X(v:dv-1,h+dh1-1)==1 & h+dh1-1<N(2) & dh1<Dmax1
while X(v+dv-1,h+dh1-1)==1 & h+dh1-1<N(2) & dh1<Dmax1n
if ~isempty(fixp)
if find(h+dh1-1==fixp(:,1)) & find(h+fix((dh1+dh)/2)==fixp(:,1))
dv=fixp(find((h+dh1-1)==fixp(:,1)),2)-v;
if isempty(dv), dv=fixp(find((h+fix((dh1+dh)/2))==fixp(:,1)),2)-v; end
flagpoint=1;
break
end
end
dh1=dh1+1;
end
% compute the mean of the diagonal LOS
errcode=196;
if flagpoint==0
dh=fix((dh1+dh)/2);
dv=fix((dv1+dv)/2);
if dh>0
dh=dh-1;
end
if dv>0
dv=dv-1;
end
% dh=dh+dh1;
end
end % flagpoint end
flagpoint=0;
% output
errcode=197;
if dh~=0 & dv~=0
t(h:h+dh)=v:dv/dh:v+dv;
elseif dv~=0
t(h)=v+dv;
elseif dv==0
t(h:h+dh)=v;
end
Nvoll=Nvoll+sqrt(dv^2+dh^2);
if dh==0 & dv==0
dh=1;
end
% moves the startpoint for further looking
h=h+dh;
v=v+dv;
end
else
% DTW algorithm
if nogui~=2
h_wait=waitbar(0,'Compute LOS ...');
set(h_wait,'HandleVisibility','on',props.window);
end
t=1;
i=y0+1; j=x0+1;
while i<N(1)-Dmax1-1 & j<N(2)-Dmax2-1
errcode=197;
if nogui~=2
waitbar(i/N(1)), j0=j;
end
% [temp pos]=min([sum(sum(X(i:i+Dmax1,j+1:j+1+Dmax2))),sum(sum(X(i+1:i+1+Dmax1,j+1:j+1+Dmax2))),sum(sum(X(i+1:i+1+Dmax1,j:j+Dmax2)))]);
[temp pos]=min([(mean(X(i,j+1:j+1+Dmax2))),(mean(diag(X(i+1:i+1+Dmax1,j+1:j+1+Dmax2)))),(mean(X(i+1:i+1+Dmax1,j)))]);
switch(pos)
case 1
j=j+1;
flag1=1;
case 2
i=i+1; j=j+1;
flag1=1;
flag2=1;
case 3
i=i+1;
flag2=1;
end
if ~isempty(fixp) & flag1==1 & flag2==1
errcode=1981;
h=find(fixp(:,1)==j);
if ~isempty(h) & i<max(fixp(h,2));
h2=find(i<=fixp(h,2));
i=fixp(h(h2(1)),2); flag1=0; end
end
if ~isempty(fixp) & flag2==1 & flag1==1
errcode=1982;
h=find(fixp(:,2)==i);
if ~isempty(h) & j<max(fixp(h,1));
h2=find(j<=fixp(h,1));
j=fixp(h(h2(1)),1)
t(j0:j-1)=t(j0);
flag2=0; end
end
t(j)=i;
end
t(find(~t))=1;
Nvoll=NaN; Nleer=NaN;
end
errcode=199;
if nogui~=2
delete(h_wait)
end
if nogui==0
h1=findobj('Parent',hTP,'Tag','TPPlot');
h2=findobj('Tag','Diagonal','Parent',h1);
if isempty(h2)
h2=line('Parent',h1,'visible','on','Tag','Diagonal','color',[1 0 0],...
'LineWidth',1);
end
set(h2,'xdata',[1:length(t)],'ydata',t,'visible','on')
h=findobj('Tag','Apply2','Parent',hTPCtrl);
set(h(1),'String','Apply',...
'ToolTip','Searches the LOS.',...
'Callback','trackplot LOSsearch')
for i=1:length(obj.enable), set(obj.children(i),'Enable',obj.enable{i}); end
set(findobj('Tag','Store2','Parent',hTPCtrl),'Enable','On')
set(findobj('Tag','Apply2','Parent',hTPCtrl),'UserData',t)
end
if nargout~=0, tout=t; end
if nargout==2
tout=t;
Nout(1)=Nvoll;
Nout(2)=Nleer;
end
if nogui==0
setptr([hTP,hTPCtrl],'arrow')
end
end
warning on
try, set(0,props.root), end
set(0,'ShowHidden','Off')
%%%%%%% error handling
%if 0
catch
z=whos;x=lasterr;y=lastwarn;in=varargin{1};
print_error('trackplot',z,x,y,in,[],action)
try, set(0,props.root), end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function out=check_stop_LOS(hCRP,hCtrl,nogui,obj)
global errcode
errcode=errcode+.02;
out=0;
if nogui==0
h=findobj('Tag','Apply2','Parent',hCtrl);
if strcmpi(get(h(1),'String'),'stopped')
set(h(1),'String','Apply',...
'ToolTip','Searches the LOS.',...
'Callback','trackplot LOSsearch')
for i=1:length(obj.enable), set(obj.children(i),'Enable',obj.enable{i}); end
set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')'),'String','Stopped'),drawnow
setptr([hCRP,hCtrl],'arrow')
out=1;
end
end