📄 example.m
字号:
x1=[];
y1=[];
for k=1:length(n),
x1=[x1 x(k) (x(k)+(dx(k)*(1:n(k)-1))./n(k))];
y1=[y1 y(k) (y(k)+(dy(k)*(1:n(k)-1))./n(k))];
end;
x1=[x1 x(end)];
y1=[y1 y(end)];
pntr=[x1;y1];
function WindowButtonMotionFcn;
global hCI;
gw=getappdata(hCI,'handles');
[st,px,py,dxyr,nc]=current_state(gw);
switch gw.action,
case 'none',
if st==1,
set(hCI,'pointer','crosshair');
else
if st==2,
c_sel=gw.c_sel;
degr=atan2(py-gw.G(c_sel,2),px-gw.G(c_sel,1));
m=transform_pointer(gw.pntr,degr);
set(hCI,'pointer','custom','pointershapecdata',m,'PointerShapeHotSpot',[8 8]);
else
set(hCI,'pointer','arrow');
end;
end;
case 'radius',
c_sel=gw.c_sel;
rad=sqrt((px-gw.G(c_sel,1))^2+(py-gw.G(c_sel,2))^2);
gw.G(c_sel,3)=rad-gw.dxyr(3);
ang=(0:360)*pi/180;
set(gw.hG(c_sel),'XData',gw.G(c_sel,1)+gw.G(c_sel,3)*cos(ang),'YData',gw.G(c_sel,2)+gw.G(c_sel,3)*sin(ang));
set(gw.h_center_sel,'XData',gw.G(c_sel,1),'YData',gw.G(c_sel,2));
set(gw.edtR,'String',num2str(round(10*gw.G(c_sel,3))/10));
setappdata(hCI,'handles',gw);
degr=atan2(py-gw.G(c_sel,2),px-gw.G(c_sel,1));
m=transform_pointer(gw.pntr,degr);
set(hCI,'pointer','custom','pointershapecdata',m,'PointerShapeHotSpot',[8 8]);
apply_circles_intersection;
case 'center'
c_sel=gw.c_sel;
gw.G(c_sel,1)=px-gw.dxyr(1);
gw.G(c_sel,2)=py-gw.dxyr(2);
ang=(0:360)*pi/180;
set(gw.hG(c_sel),'XData',gw.G(c_sel,1)+gw.G(c_sel,3)*cos(ang),'YData',gw.G(c_sel,2)+gw.G(c_sel,3)*sin(ang));
set(gw.h_center_sel,'XData',gw.G(c_sel,1),'YData',gw.G(c_sel,2));
set(gw.edtX,'String',num2str(round(10*gw.G(c_sel,1))/10));
set(gw.edtY,'String',num2str(round(10*gw.G(c_sel,2))/10));
setappdata(hCI,'handles',gw);
apply_circles_intersection;
end;
function WindowButtonDownFcn;
global hCI;
gw=getappdata(hCI,'handles');
[st,px,py,dxyr,nc]=current_state(gw);
gw.action='none';
if st==3,
SelectCircle(nc,gw);
end;
if st==1,
gw.action='center';
gw.dxyr=dxyr;
setappdata(hCI,'handles',gw);
end;
if st==2,
gw.action='radius';
gw.dxyr=dxyr;
setappdata(hCI,'handles',gw);
end;
function WindowButtonUpFcn;
global hCI;
gw=getappdata(hCI,'handles');
gw.action='none';
setappdata(hCI,'handles',gw);
function popKT;
global hCI;
gw=getappdata(hCI,'handles');
v=get(gw.popKT,'Value');
if v~=gw.kt,
gw.kt=v;
setappdata(hCI,'handles',gw);
apply_circles_intersection;
end;
function [st,px,py,dxyr,nc]=current_state(gw);
c_sel=gw.c_sel;
xlim=get(gw.hAxs,'xlim');
ylim=get(gw.hAxs,'ylim');
pa=get(gw.hAxs,'position');
kx=diff(xlim)/pa(3);
ky=diff(ylim)/pa(4);
p=get(gw.hAxs,'CurrentPoint');
px=p(1,1);
py=p(1,2);
dx=px-gw.G(c_sel,1);
dy=py-gw.G(c_sel,2);
dc=sqrt(dx*dx+dy*dy);
dr=dc-gw.G(c_sel,3);
dxyr=[dx dy dr];
do=abs(dr);
if 2*dc/(kx+ky)<7,
% center of selected circle
st=1;
nc=c_sel;
else
if 2*do/(kx+ky)<7,
% over selected circumference
st=2;
nc=c_sel;
else
% over non-selected circumference
for k=1:gw.Ng,
if k~=c_sel,
dx=px-gw.G(k,1);
dy=py-gw.G(k,2);
dc=sqrt(dx*dx+dy*dy);
dr=dc-gw.G(k,3);
do=abs(dr);
if 2*do/(kx+ky)<7,
nc=k;
st=3;
return;
end;
end;
end;
st=0;
nc=0;
end;
end;
function m=transform_pointer(pntr,deg);
sn=sin(deg);
cn=cos(deg);
rot=[cn -sn;sn cn];
pntr=((pntr-8)'*rot)'+8;
m=zeros(16)*NaN;
z=16*floor(pntr(1,:))+floor(pntr(2,:));
m(z+1)=1;
function strpop=popupmenustring(Ng);
strpop=[];
for k=1:Ng,
ppp=' ';
sss=num2str(k);
ls=length(sss);lp=length(ppp);
ppp(lp-ls+1:lp)=sss;
strpop{k}=ppp;
end;
function popSel;
global hCI;
gw=getappdata(hCI,'handles');
nc=get(gw.popSel,'Value');
SelectCircle(nc,gw);
function edit;
global hCI;
gw=getappdata(hCI,'handles');
c_sel=gw.c_sel;
gw.G(c_sel,1)=str2num(get(gw.edtX,'String'));
gw.G(c_sel,2)=str2num(get(gw.edtY,'String'));
gw.G(c_sel,3)=str2num(get(gw.edtR,'String'));
ang=(0:360)*pi/180;
set(gw.hG(c_sel),'XData',gw.G(c_sel,1)+gw.G(c_sel,3)*cos(ang),'YData',gw.G(c_sel,2)+gw.G(c_sel,3)*sin(ang));
set(gw.h_center_sel,'XData',gw.G(c_sel,1),'YData',gw.G(c_sel,2));
setappdata(hCI,'handles',gw);
apply_circles_intersection;
function pbInsert;
global hCI;
gw=getappdata(hCI,'handles');
gw.G=[gw.G;[160*(rand-0.5) 160*(rand-0.5) 30]];
gw.Ng=size(gw.G,1);
Ng=gw.Ng;
ang=(0:3:360)*pi/180;
gw.hG(Ng)=line(gw.G(Ng,1)+gw.G(Ng,3)*cos(ang),gw.G(Ng,2)+gw.G(Ng,3)*sin(ang),'Parent',gw.hAxs,'Color','g','linestyle',':','linewidth',2);
setappdata(hCI,'handles',gw);
strpop=popupmenustring(Ng);
set(gw.popKT,'String',strpop);
set(gw.popSel,'String',strpop);
SelectCircle(Ng,gw);
apply_circles_intersection;
function pbRemove;
global hCI;
gw=getappdata(hCI,'handles');
if gw.Ng>1,
nc=gw.c_sel;
idx=[1:nc-1 nc+1:gw.Ng];
nn=idx(1);
SelectCircle(nn,gw);
gw=getappdata(hCI,'handles');
delete(gw.hG(nc));
gw.G=gw.G(idx,:);
gw.hG=gw.hG(idx);
gw.Ng=size(gw.G,1);
strpop=popupmenustring(gw.Ng);
v=get(gw.popKT,'Value');
if v>gw.Ng, v=gw.Ng; gw.kt=v; end;
set(gw.popKT,'String',strpop,'value',v);
if nn>nc,gw.c_sel=nn-1;end;
set(gw.popSel,'String',strpop,'value',gw.c_sel);
setappdata(hCI,'handles',gw);
apply_circles_intersection;
end;
function pbSave;
global hCI;
gw=getappdata(hCI,'handles');
[fn,fp]=uiputfile('*.mat','SAVE IN');
if ischar(fn),
ffn=[fp fn];
gx.G=gw.G;
gx.Ng=gw.Ng;
gx.kt=gw.kt;
gx.c_sel=gw.c_sel;
save(ffn,'gx');
end;
function pbLoad;
global hCI;
gw=getappdata(hCI,'handles');
[fn,fp]=uigetfile('*.mat','LOAD FROM');
if ischar(fn),
ffn=[fp fn];
load(ffn);
gw.G=gx.G;
gw.c_sel=gx.c_sel;
gw.Ng=size(gw.G,1);
gw.kt=gx.kt;
delete(gw.hG);
delete(gw.h_center_sel);
ang=(0:3:360)*pi/180;
for k=1:gw.Ng,
hG(k)=line(gw.G(k,1)+gw.G(k,3)*cos(ang),gw.G(k,2)+gw.G(k,3)*sin(ang),'Parent',gw.hAxs,'Color','g','linestyle',':','linewidth',2);
end;
set(hG(gw.c_sel),'Color','b');
h_center_sel=line(gw.G(gw.c_sel,1),gw.G(gw.c_sel,2),'Parent',gw.hAxs,'Color','b','linestyle','none','marker','o','markersize',3);
gw.hG=hG;
gw.h_center_sel=h_center_sel;
strpop=popupmenustring(gw.Ng);
set(gw.popKT,'String',strpop,'value',gw.kt);
set(gw.popSel,'String',strpop,'value',gw.c_sel);
SelectCircle(gw.c_sel,gw);
apply_circles_intersection;
end;
function SelectCircle(nc,gw);
set(gw.hG(gw.c_sel),'Color','g');
gw.c_sel=nc;
set(gw.hG(nc),'Color','b');
set(gw.h_center_sel,'XData',gw.G(nc,1),'YData',gw.G(nc,2));
set(gw.edtX,'String',num2str(round(10*gw.G(nc,1))/10));
set(gw.edtY,'String',num2str(round(10*gw.G(nc,2))/10));
set(gw.edtR,'String',num2str(round(10*gw.G(nc,3))/10));
set(gw.popSel,'Value',nc);
setappdata(gw.hCI,'handles',gw);
function display_area(gw,area_of_region);
A=sum(gw.G(:,3).*gw.G(:,3))*pi;
set(gw.txtArea,'String',num2str(round(area_of_region*10)/10));
W=get(gw.frmPrgbB,'position');
wdth=W(3);
W=get(gw.frmPrgb,'position');
W(3)=round(area_of_region*wdth/A);
if W(3)==0,W(3)=1;end;
set(gw.frmPrgb,'position',W);
function popRenderer;
global hCI;
gw=getappdata(hCI,'handles');
r=get(gw.popRenderer,'value');
ss=get(gw.popRenderer,'string');
set(hCI,'Renderer',ss{r});
function chkCalc;
global hCI;
gw=getappdata(hCI,'handles');
v=get(gw.chkCalc,'value');
if v==1,
set(gw.pbCalc,'Enable','off');
else
set(gw.pbCalc,'Enable','on');
end;
function pbCalc;
global hCI;
gw=getappdata(hCI,'handles');
v=get(gw.chkCalc,'value');
set(gw.chkCalc,'value',1);
apply_circles_intersection;
set(gw.chkCalc,'value',v);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -