📄 mmpolar.m
字号:
end
P.Style='unknown';
case 'TGridColor' % TGridColor
[istrue,cs]=local_iscolorspec(S.TGridColor);
if istrue
set(D.HTGrid,'Color',cs)
set(D.HTTickLabel,'Color',cs)
P.TGridColor=cs;
else
local_error('Unknown ''TGridColor'' Property Value.')
end
case 'TGridLineStyle' % TGridLineStyle
if local_islinespec(S.TGridLineStyle)
set(D.HTGrid,'LineStyle',S.TGridLineStyle)
P.TGridLineStyle=S.TGridLineStyle;
else
local_error('Unknown ''TGridLineStyle'' Property Value.')
end
case 'TGridLineWidth' % TGridLineWidth
if isnumeric(S.TGridLineWidth) && isscalar(S.TGridLineWidth)
set(D.HTGrid,'LineWidth',S.TGridLineWidth)
P.TGridLineWidth=S.TGridLineWidth;
else
local_error('Unknown ''TGridLineWidth'' Property Value.')
end
case 'TGridVisible' % TGridVisible
[istrue,onoff]=local_isonoff(S.TGridVisible);
if istrue
set(D.HTGrid,'Visible',onoff)
P.TGridVisible=onoff;
else
local_error('Unknown ''TGridVisible'' Property Value.')
end
case 'TickLength' % TickLength
if isnumeric(S.TickLength) && isscalar(S.TickLength)
P.TickLength=max(min(abs(S.TickLength),0.1),.001);
tdir=2*strcmp(P.TTickDirection,'in')-1;
tdata=[D.TTickValue;D.TTickValue;NaN(1,D.TTickLabelN)];
rdata=[ones(1,D.TTickLabelN)
(1-tdir*P.TickLength)+zeros(1,D.TTickLabelN)
NaN(1,D.TTickLabelN)];
xdata=rdata(:).*cos(tdata(:));
ydata=rdata(:).*sin(tdata(:));
set(D.HTTick,'XData',xdata,'YData',ydata) % theta ticks
phi=asin(P.TickLength./(2*D.RTickRadius));
tdata=[D.RTickAngle-phi; D.RTickAngle+zeros(size(D.RTickRadius))
D.RTickAngle+phi; NaN(size(D.RTickRadius))];
rdata=[D.RTickRadius; D.RTickRadius
D.RTickRadius; NaN(size(D.RTickRadius))];
xdata=rdata(:).*cos(tdata(:));
ydata=rdata(:).*sin(tdata(:));
set(D.HRTick,'XData',xdata,'YData',ydata) % rho ticks
else
local_error('Unknown ''TickLength'' Property Value.')
end
case 'TLimit' % TLimit
if isnumeric(S.TLimit) && numel(S.TLimit)==2
if abs(diff(S.TLimit))>1.9*pi % make full circle if close
P.TLimit=[0 2*pi];
else
P.TLimit=mod(S.TLimit,2*pi); % move limits to range 0 to 2pi
end
[P,D]=local_getTTickValue(P,D,S);
[P,D]=local_placeAxesPatch(HAxes,P,D,S);
[P,D]=local_placeRGrid(HAxes,P,D,S);
[P,D]=local_placeTGrid(HAxes,P,D,S);
[P,D]=local_placeTTickLabel(HAxes,P,D,S);
[P,D]=local_placeRTickLabel(HAxes,P,D,S);
for k=1:length(D.TData) % hide data outside TLimits
tdata=D.TData{k};
if P.TLimit(1)>P.TLimit(2)
tdata(tdata<P.TLimit(1) & tdata>P.TLimit(2))=NaN;
else
tdata(tdata<P.TLimit(1) | tdata>P.TLimit(2))=NaN;
end
xdata=D.RDataN{k}.*cos(tdata);
ydata=D.RDataN{k}.*sin(tdata);
set(D.HLines(k),'XData',xdata,'YData',ydata)
end
else
local_error('Unknown ''TLimit'' Property Value.')
end
case 'TTickDelta' % TTickDelta
if isnumeric(S.TTickDelta) && isscalar(S.TTickDelta)
if strcmp(P.TTickScale,'degrees')
P.TTickDelta=min(max(abs(S.TTickDelta),5),90);
else
P.TTickDelta=min(max(abs(S.TTickDelta),pi/36),pi/2);
end
[P,D]=local_getTTickValue(P,D,S);
[P,D]=local_placeTGrid(HAxes,P,D,S);
[P,D]=local_placeTTickLabel(HAxes,P,D,S);
else
local_error('Unknown ''TTickDelta'' Property Value.')
end
case 'TTickDirection' % TTickDirection
if ischar(S.TTickDirection) &&...
(strcmpi(S.TTickDirection,'out') || strcmpi(S.TTickDirection,'in'))
P.TTickDirection=S.TTickDirection;
tdir=2*strcmp(P.TTickDirection,'in')-1;
tdata=[D.TTickValue;D.TTickValue;NaN(1,D.TTickLabelN)];
rdata=[ones(1,D.TTickLabelN)
(1-tdir*P.TickLength)+zeros(1,D.TTickLabelN)
NaN(1,D.TTickLabelN)];
xdata=rdata(:).*cos(tdata(:));
ydata=rdata(:).*sin(tdata(:));
set(D.HTTick,'XData',xdata,'YData',ydata) % theta ticks
else
local_error('Unknown ''TTickDirection'' Property Value.')
end
case 'TTickLabel' % TTickLabel
if iscellstr(S.TTickLabel)
NumS=length(S.TTickLabel);
for k=1:D.TTickLabelN
str=S.TTickLabel{rem(k-1,NumS)+1};
set(D.HTTickLabel(k),'String',str)
end
P.TTickLabel=S.TTickLabel;
else
local_error('Unknown ''TTickLabel'' Property Value.')
end
case 'TTickLabelVisible' % TTickLabelVisible
[istrue,onoff]=local_isonoff(S.TTickLabelVisible);
if istrue
set(D.HTTickLabel,'Visible',onoff)
P.TTickLabelVisible=onoff;
else
local_error('Unknown ''TTickLabelVisible'' Property Value.')
end
case 'TTickOffset' % TTickOffset
if isnumeric(S.TTickOffset) && isscalar(S.TTickOffset)
P.TTickOffset=S.TTickOffset;
for k=1:D.TTickLabelN
xdata=(1+P.TTickOffset)*cos(D.TTickValue(k));
ydata=(1+P.TTickOffset)*sin(D.TTickValue(k));
set(D.HTTickLabel(k),'Position',[xdata ydata])
end
else
local_error('Unknown ''TTickOffset'' Property Value.')
end
case 'TTickScale' % TTickScale
if ischar(S.TTickScale) && strncmpi(S.TTickScale,'degrees',3)...
&& strcmp(P.TTickScale,'radians')
P.TTickScale='degrees';
P.TTickDelta=P.TTickDelta*180/pi;
P.RTickAngle=P.RTickAngle*180/pi;
[P,D]=local_getTTickValue(P,D,S);
[P,D]=local_placeTTickLabel(HAxes,P,D,S);
elseif ischar(S.TTickScale) && strncmpi(S.TTickScale,'radians',3)...
&& strcmp(P.TTickScale,'degrees')
P.TTickScale='radians';
P.TTickDelta=P.TTickDelta*pi/180;
P.RTickAngle=P.RTickAngle*pi/180;
[P,D]=local_getTTickValue(P,D,S);
[P,D]=local_placeTTickLabel(HAxes,P,D,S);
elseif ~ischar(S.TTickScale)
local_error('Unknown ''TTickScale'' Property Value.')
end
case 'TTickSign' % TTickSign
if ischar(S.TTickSign)
if strcmp(S.TTickSign,'+')
P.TTickSign='+';
else
P.TTickSign='+-';
end
[P,D]=local_getTTickValue(P,D,S);
[P,D]=local_placeTTickLabel(HAxes,P,D,S);
else
local_error('Unknown ''TTickSign'' Property Value.')
end
case 'TTickValue' % TTickValue
if isnumeric(S.TTickValue) && numel(S.TTickValue)>0
TTick=S.TTickValue(:)';
if strcmp(P.TTickScale,'degrees')
TTick=TTick*pi/180;
end
if P.TLimit(1)>P.TLimit(2)
idx=TTick<=P.TLimit(2) | TTick>=P.TLimit(1); % keepers
else
idx=TTick>=P.TLimit(1) & TTick<=P.TLimit(2); % keepers
end
S.TTickValue=S.TTickValue(idx);
if length(S.TTickValue)>1
P.TTickValue=S.TTickValue(:)';
D.TTickValue=TTick(idx);
D.TTickLabelN=length(P.TTickValue);
[P,D]=local_placeTGrid(HAxes,P,D,S);
[P,D]=local_placeTTickLabel(HAxes,P,D,S);
end
else
local_error('Unknown ''TTickValue'' Property Value.')
end
case 'TTickVisible' % TTickVisible
[istrue,onoff]=local_isonoff(S.TTickVisible);
if istrue
set(D.HTTick,'Visible',onoff)
P.TTickVisible=onoff;
else
local_error('Unknown ''RTickVisible'' Property Value.')
end
case 'TZeroDirection' % TZeroDirection
if ischar(S.TZeroDirection) && strncmpi(S.TZeroDirection,'north',1)
P.TZeroDirection='north';
if strcmp(P.TDirection,'ccw')
set(HAxes,'View',[270 90])
elseif strcmp(P.TDirection,'cw')
set(HAxes,'View',[90 -90])
end
elseif ischar(S.TZeroDirection) && strncmpi(S.TZeroDirection,'east',1)
P.TZeroDirection='east';
if strcmp(P.TDirection,'ccw')
set(HAxes,'View',[0 90])
elseif strcmp(P.TDirection,'cw')
set(HAxes,'View',[0 -90])
end
elseif ischar(S.TZeroDirection) && strncmpi(S.TZeroDirection,'south',1)
P.TZeroDirection='south';
if strcmp(P.TDirection,'ccw')
set(HAxes,'View',[90 90])
elseif strcmp(P.TDirection,'cw')
set(HAxes,'View',[270 -90])
end
elseif ischar(S.TZeroDirection) && strncmpi(S.TZeroDirection,'west',1)
P.TZeroDirection='west';
if strcmp(P.TDirection,'ccw')
set(HAxes,'View',[180 90])
elseif strcmp(P.TDirection,'cw')
set(HAxes,'View',[180 -90])
end
else
local_error('Unknown ''TZeroDirection'' Property Value.')
end
P.Style='unknown';
end
end
setappdata(HAxes,'MMPOLAR_Properties',P)
setappdata(HAxes,'MMPOLAR_Data',D)
%--------------------------------------------------------------------------
%--------------------------------------------------------------------------
function [out,errmsg]=local_isfield(fnames,str) % local_isfield
% compare str to fnames, if found, return complete fieldname
% otherwise return error and empty string.
% fnames is cell array, str is a string
% outputs are strings
% look for exact match first
idx=find(strcmpi(fnames,str));
if isempty(idx) % no exact match, so look for more general match
idx=find(strncmpi(str,fnames,max(length(str),2)));
end
if numel(idx)==1 % unique match found
out=fnames{idx};
errmsg='';
else % trouble
out='';
errmsg=sprintf('Unknown or Not Unique Property: %s',str);
end
%--------------------------------------------------------------------------
function [istrue,cs]=local_iscolorspec(arg) % local_iscolorspec
% see if arg is a valid color specification including 'none'
rgb={[1 0 0],[0 1 0],[0 0 1],[0 1 1],[1 0 1],[1 1 0],[0 0 0],[1 1 1],'none'};
cc='rgbcmykwn';
istrue=false;
cs=[];
if ~isempty(arg) && ischar(arg)
idx=find(arg(1)==cc);
if ~isempty(idx)
istrue=true;
cs=rgb{idx};
end
elseif ~isempty(arg) && isnumeric(arg)
istrue=all(size(arg)==[1 3])...
&& all(arg>=0) && all(arg<=1);
cs=arg;
else
istrue=false;
end
%--------------------------------------------------------------------------
function istrue=local_islinespec(arg) % local_islinespec
% see if arg is a valid line style specification
str={'-','-.','--',':'};
if isempty(arg)
istrue=false;
elseif ischar(arg) && length(arg)<3
istrue=any(strncmp(str,arg,length(arg)));
else
istrue=false;
end
%--------------------------------------------------------------------------
function [istrue,s]=local_isonoff(arg) % local_isonoff
% see if arg is either on or off
istrue=false;
s='';
if ~isempty(arg) && ischar(arg) && strcmpi(arg,'on')
istrue=true;
s='on';
elseif ~isempty(arg) && ischar(arg) && strcmpi(arg,'off')
istrue=true;
s='off';
end
%--------------------------------------------------------------------------
function local_error(arg)
% Add message identifier to error message and post error
if ~isempty(arg) && ischar(arg)
error('MMPOLAR:error',arg)
end
%--------------------------------------------------------------------------
function [P,D]=local_placeAxesPatch(HAxes,P,D,S) %#ok local_placeAxesPatch
% Draw Axes Border and Patch
tinc=pi/250;
if P.TLimit(1)>P.TLimit(2)
theta=[P.TLimit(1):tinc:(P.TLimit(2)+2*pi-eps) P.TLimit(2)+2*pi];
else
theta=[P.TLimit(1):tinc:P.TLimit(2)-eps P.TLimit(2)];
end
costheta=cos(theta);
sintheta=sin(theta);
if abs(diff(P.TLimit))<2*(1-eps)*pi; % less than 4 quadrant box
xdata=[0 costheta 0];
ydata=[0 sintheta 0];
else % four quadrant box
xdata=costheta;
ydata=sintheta;
end
% let the axes grow for less than 4 quadrant box
set(HAxes,'Xlim',[min(xdata) max(xdata)],'Ylim',[min(ydata) max(ydata)])
if nargin==3 % new plot
D.HAPatch=patch('XData',xdata,'YData',ydata,...
'Parent',HAxes,...
'LineStyle','-',...
'Linewidth',2*P.RGridLineWidth,...
'EdgeColor',P.BorderColor,...
'FaceColor',P.BackgroundColor,...
'HandleVisibility','off',...
'HitTest','off');
else % old plot, update data
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -